简体   繁体   English

NLog 自定义目标 LogCat

[英]NLog custom Target LogCat

I am really struggling to get a basic custom target working with NLog on a Xamarin Android app.我真的很难在 Xamarin Android 应用程序上获得使用 NLog 的基本自定义目标。

I'd like to create a simple target to LogCat, in order to be able to use a tag so my debug will be easier and more 'human'我想为 LogCat 创建一个简单的目标,以便能够使用标签,这样我的调试会更容易,更“人性化”

LogCatTarget.cs: 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;
            }

        }
    }
}

in my MainApplication.cs在我的 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

        }

I also have a NLog.config with a console and a file target which are working fine.我还有一个带有控制台和文件目标的 NLog.config,它们工作正常。 (This is why I am adding target and rule and not making a new config) (这就是为什么我要添加目标和规则而不是创建新配置)

I launch my app and use a button which call all level of Android.Util.Log and those of Nlog logger我启动我的应用程序并使用一个按钮调用 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");
            };

I put a break point in LogCatTarget.cs on write method, which is ovverided.我在 LogCatTarget.cs 的 write 方法上设置了一个断点,该方法是 ovverided。 But I never reach it...但我永远达不到...

Why??:!?为什么??:!? cruel worlddddd !残酷的世界dddd! :) :)

Thanks for your help.谢谢你的帮助。

Rolf Kristensen gave me the answer in comments: Rolf Kristensen 在评论中给了我答案:

Simply add NLog.LogManager.ReconfigExistingLoggers();只需添加NLog.LogManager.ReconfigExistingLoggers(); at the end of my RegisterNlog() did the trick !在我的RegisterNlog()结束时成功了!

This is not mentionned in the docs ( https://github.com/NLog/NLog/wiki/Configuration-API ), or I missed it.文档中没有提到这一点( https://github.com/NLog/NLog/wiki/Configuration-API ),或者我错过了它。

Thanks Rolf !谢谢罗尔夫!

NLog.Targets.MauiLog has been released, and supports writing to: NLog.Targets.MauiLog已经发布,支持写入:

  • Android.Util.Log / LogCat Android.Util.Log / LogCat
  • Apple iOS / MacOS - Unified Logging OSLog (replacement of print and NSLog) Apple iOS / MacOS - 统一日志记录 OSLog(替代打印和 NSLog)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM