NLog自定义Target LogCat

时间:2017-11-16 17:35:14

标签: c# nlog

我真的很难在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中设置了一个断点,这是一个不可避免的。但我从来没有达到它......

为什么?!!!?残酷的worlddddd! :)

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

Rolf Kristensen在评论中给了我答案:

只需在NLog.LogManager.ReconfigExistingLoggers();的末尾添加RegisterNlog()即可!

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

谢谢罗尔夫!