漫坊亭

社会の底辺プログラマ

Caliburn.Micro:Loggerの使い方

機能にLoggingって書いてあるので、ソースコードを検索してみた。

標準でSystem.Diagnostics.Debugを使ったLoggerが入っているので、BootStrapperで初期化すればいい。

        public AppBootstrapper()
        {
            LogManager.GetLog = type => new DebugLog(type);

            this.Initialize();
        }

ログ出力したいクラスの先頭で宣言すれば、使えるようになる。

    public class ShellViewModel : Screen, IShell
    {
        static readonly ILog Log = LogManager.GetLog(typeof(ShellViewModel));

ここで出力してみると、、、

        [ImportingConstructor]
        public ShellViewModel(IWindowManager windowManager, IEventAggregator eventAggregator)
        {
            Log.Info("★今ココ★");

こんな感じ。 f:id:jfactory:20150715162537p:plain

いつも使っているNLogを使うには、NLog用のILogクラスを作ればいい。
作るほどの内容ではないけど。

    public class NLogLogger : ILog
    {
        private readonly NLog.Logger logger;

        public NLogLogger(Type type) {
            logger = NLog.LogManager.GetLogger(type.Name);
        }

        public void Error(Exception exception) {
            logger.Error(exception);
        }

        public void Info(string format, params object[] args) {
            logger.Info(format, args);
        }

        public void Warn(string format, params object[] args) {
            logger.Warn(format, args);
        }
    }

んで、BootStrapperを、LogManager.GetLog = type => new NLogLogger(type);こうする。

毎回クラス名を入力するのがめんどいので、NLogのGetCurrentClassLoggerが欲しい。
けど、LogManagerがstaticクラスなので、どうしようもないな。

こんなヘルバーで、なんとか。

    public static class LogManagerHelper
    {
        public static ILog Factory()
        {
            var callerFrame = new StackFrame(1);
            return LogManager.GetLog(callerFrame.GetMethod().ReflectedType);
        }
    }

宣言が楽になった。

    public class ShellViewModel : Screen, IShell
    {
        static readonly ILog Log = LogManagerHelper.Factory();

ログレベルが3つなのも何とかしたいけど、 ライブラリの改造以外に、いい方法が見つからない。