漫坊亭

社会の底辺プログラマ

Caliburn.Micro:Loggerの使い方2

前回のログレベルが3つしかない件で、対策案を考えてみた。

そもそも漫坊亭では、ログレベルを以下のように使い分けているので、 どうしても3つでは足りないのだ。

  • Trace : デバッグの詳細:リリース後は消すかも・・・
  • Debug : 小さくないメソッド(目安:5行)の出入り口など
  • Info : イベント記録(主に機能単位での開始・終了・動作、など)
  • Warn : 続行可能なエラー(ユーザ入力の例外キャッチなど)
  • Error : 続行可能なエラー(Warnでもれた例外のキャッチなど)
  • Fatal : 続行不能なエラー・アプリが死ぬ直前

全体のログレベルはInfoにして、特定のクラスのみをDebugやTraceにして使っている。

まず、Loggerを拡張する。

    public class MyLogger : ILog
    {
        // 前回と同じなので省略

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

次に、BootstrapperとFactoryを改造する。

        public AppBootstrapper()
        {
            LogManager.GetLog = type => new MyLogger(type);
    public static class LogManagerHelper
    {
        public static ILogEx Factory()
        {
            var callerFrame = new StackFrame(1);
            var logger = LogManager.GetLog(callerFrame.GetMethod().ReflectedType);
            
            var myLogger = logger as MyLogger;
            if (myLogger == null)
            {
                throw new NotSupportedException(
                    string.Format("{0} is not MyLogger.", logger.GetType().Name));
            }

            return myLogger;
        }
    }

使い方は、ILogをMyLoggerに変更する。

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

もし例外が発生したとしても、自分で作ったコードの部分だし、 実行時にロガーを切り替えることはないので、問題はないだろう。