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();
もし例外が発生したとしても、自分で作ったコードの部分だし、 実行時にロガーを切り替えることはないので、問題はないだろう。