Xamarin MvvmCross 如何将 NLog 用于 IMvxLogProvider?

Xamarin MvvmCross how to use NLog for IMvxLogProvider?

我按照 Diagnostic & Logging 安装 NLog.Config nuget 包到 Android & iOS 项目。

在 Android 项目上,Setup.cs

public override MvxLogProviderType GetDefaultLogProviderType() => MvxLogProviderType.NLog;

在 Xamarin.Forms 个项目中,

private static readonly IMvxLog _logger = Mvx.IoCProvider.Resolve<IMvxLogProvider>().GetLogFor<CanvasContainer>();

_logger.Debug($"startScale: {startScale}, currentScale: {currentScale}");

I checked _logger is not null.

此外,我将NLog.config的构建操作更改为嵌入式资源

这里是Android项目的NLog.config,

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogFile="c:\temp\nlog-internal.log">

  <targets>
    
    <target xsi:type="File" 
            name="FileTarget" 
            fileName="${specialfolder:folder=MyDocuments}/logs/${shortdate}.log" 
            layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
    
    <target xsi:type="ColoredConsole"
            name="ConsoleTarget"
            encoding="utf-8"
            layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
            useDefaultRowHighlightingRules="true" />
    
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="FileTarget" />
    <logger name="*" minlevel="Debug" writeTo="ConsoleTarget" />
  </rules>
</nlog>

这个设置有什么问题吗?我找不到这方面的示例或教程...

认为在将 NLog.config 作为嵌入式资源时需要帮助 NLog:

    public override MvxLogProviderType GetDefaultLogProviderType() => MvxLogProviderType.NLog;
    
    protected override IMvxLogProvider CreateLogProvider()
    {
      var nlogConfigFile = GetEmbeddedResourceStream(myAssembly, "NLog.config");
      if (nlogConfigFile != null)
      {
        var xmlReader = System.Xml.XmlReader.Create(nlogConfigFile);
        NLog.LogManager.Configuration = new XmlLoggingConfiguration(xmlReader, null);
      }
      return base.CreateLogProvider();
    }

    private static Stream GetEmbeddedResourceStream(Assembly assembly, string resourceFileName)
    {
      var resourcePaths = assembly.GetManifestResourceNames()
        .Where(x => x.EndsWith(resourceFileName, StringComparison.OrdinalIgnoreCase))
        .ToList();
      if (resourcePaths.Count == 1)
      {
        return assembly.GetManifestResourceStream(resourcePaths.Single());
      }
      return null;
    }

另请参阅:https://github.com/NLog/NLog/wiki/Explicit-NLog-configuration-loading#loading-nlog-configuration-from-xamarin-resource