【发布时间】:2017-11-16 17:35:14
【问题描述】:
我真的很难在 Xamarin Android 应用程序上获得使用 NLog 的基本自定义目标。
我想为 LogCat 创建一个简单的目标,以便能够使用标签,这样我的调试会更容易,更“人性化”
LogCatTarget.cs :
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;
}
}
}
}
在我的 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 on write 方法中设置了一个断点,该方法已被 ovverided。但我从来没有达到它...
为什么?!!!?残酷的世界dddd! :)
感谢您的帮助。
【问题讨论】:
-
如果添加这个调用会发生什么 NLog.LogManager.ReconfigExistingLoggers();添加日志记录规则后?可能在将目标添加到 NLog 配置之前创建了记录器对象。 InternalLogger 文件中写了什么?
-
我试试 LogManager.ReconfigExistingLoggers(); --> THHHAANKKS !!!
-
自定义 LogCat 目标的绝佳示例。非常有帮助 - 谢谢!