【问题标题】:NLog custom Target LogCatNLog 自定义目标 LogCat
【发布时间】: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 目标的绝佳示例。非常有帮助 - 谢谢!

标签: c# nlog


【解决方案1】:

Rolf Kristensen 在 cmets 中给了我答案:

只需在我的RegisterNlog() 末尾添加NLog.LogManager.ReconfigExistingLoggers(); 就可以了!

文档中没有提到这一点 (https://github.com/NLog/NLog/wiki/Configuration-API),或者我错过了它。

谢谢罗尔夫!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2014-03-25
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多