2017-11-16 4 views
0

XamarinのAndroidアプリでNLogを使って作業する基本的なカスタムターゲットを取得するのは本当に苦労しています。NLogカスタムターゲットLogCat

using NLog; 
using NLog.Config; 
using NLog.Targets; 
using Android.Util; 


namespace NLog.CustomTarget 
{ 
    [Target("LogCat")] 
    public sealed class LogCatTarget : TargetWithLayout 
    { 
     public LogCatTarget() 
     { 
      this.Tag = "XamTag"; 
     } 

     //[RequiredParameter] 
     public string Tag { get; set; } 

     protected override void Write(LogEventInfo logEvent) 
     { 
      string logMessage = this.Layout.Render(logEvent); 

      SendTheMessageToLogCat(this.Tag, logMessage, logEvent.Level); 
     } 

     private void SendTheMessageToLogCat(string tag, string message, LogLevel level) 
     { 
      switch (level.Name.ToLower()) 
      { 
       case ("trace"): 
        Log.Verbose(tag, message); 
        break; 
       case ("debug"): 
        Log.Debug(tag, message); 
        break; 
       case ("info"): 
        Log.Info(tag, message); 
        break; 
       case ("warn"): 
        Log.Warn(tag, message); 
        break; 
       case ("error"): 
        Log.Error(tag, message); 
        break; 
       case ("fatal"): 
        Log.Wtf(tag, message); 
        break; 
      } 

     } 
    } 
} 
:私は私のデバッグが

LogCatTarget.csを「人間より簡単になりますので、タグを使用することができるようにするために、LogCatに簡単なターゲットを作成したいと思います

私MainApplication.csで

void RegisterNlog() 
     { 

#if DEBUG 
      NLog.Common.InternalLogger.LogToConsole = true; 
      NLog.Common.InternalLogger.LogFile = "c:\\log.txt"; 
      NLog.Common.InternalLogger.LogLevel = NLog.LogLevel.Trace; 

      //Reference custom Nlog extension for logcat 
      Target.Register<NLog.CustomTarget.LogCatTarget>("LogCat");    

      var logCatTarget = new NLog.CustomTarget.LogCatTarget(); 
      logCatTarget.Layout = @"${message}"; 
      logCatTarget.Tag = "coucou"; 
      LogManager.Configuration.AddTarget("logcatname", logCatTarget); 

      var rule1 = new LoggingRule("*", NLog.LogLevel.Debug, logCatTarget); 
      LogManager.Configuration.LoggingRules.Add(rule1); 
#endif 

     } 

私も正常に動作しているコンソールとファイルのターゲットとNLog.configを持っています。

私は私のアプリを起動して、すべてのAndroid.Util.LogのレベルとNlogロガーのそれらを呼び出すボタンを使用します(私は、ターゲットとするルールを追加し、新しい設定を作成するわけではないのはこのためです)

_butClear.Click += delegate 
      { 
       _txtDebug.Text = ""; 

       _logger.Trace("logger test"); 
       _logger.Debug("logger test"); 
       _logger.Info("logger test"); 
       _logger.Warn("logger test"); 
       _logger.Error("logger test"); 
       _logger.Fatal("logger test"); 

       Android.Util.Log.Verbose("XXaaMMM", "logger test"); 
       Android.Util.Log.Debug("XXaaMMM", "logger test"); 
       Android.Util.Log.Info("XXaaMMM", "logger test"); 
       Android.Util.Log.Warn("XXaaMMM", "logger test"); 
       Android.Util.Log.Error("XXaaMMM", "logger test"); 
       Android.Util.Log.Wtf("XXaaMMM", "logger test"); 
      }; 

私はLogCatTarget.csの書き込みメソッドにブレークポイントを設定します。しかし、私はそれに達することはありません...

なぜ?残酷なworlddddd! :)

ありがとうございました。

+0

この呼び出しを追加するとどうなりますかNLog.LogManager.ReconfigExistingLoggers();ロギングルールを追加した後おそらく、ロガーオブジェクトはNLogの設定にターゲットを追加する前に作成されています。 InternalLoggerファイルに書かれているものは何ですか? –

+0

私はLogManager.ReconfigExistingLoggers()を試します。 - > THHHAANKKS! – Yann

答えて

1

ロルフ・クリステンセンは、コメントで私に答えを与えた:

を単に私のRegisterNlog()の最後にNLog.LogManager.ReconfigExistingLoggers();を追加するには、トリックをしました!

これはドキュメント(https://github.com/NLog/NLog/wiki/Configuration-API)には記載されていませんが、私はそれを逃しました。

ありがとうRolf!