Как использовать Nlogger на Android

Мы используем Nlogger в приложении MAUI. Мы используем разные конфигурации, например, в зависимости от платформы.

#if WINDOWS
            builder.Services.AddSingleton<NLog.Logger>(NLog.LogManager.Setup().LogFactory.LoadConfiguration("Windows-NLog.config").GetCurrentClassLogger());
#elif ANDROID
            builder.Services.AddSingleton<NLog.Logger>(NLog.LogManager.Setup().LogFactory.LoadConfiguration("Android-NLog.config").GetCurrentClassLogger());
#else...
#endif

И наш 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"
      autoReload = "true"
      internalLogLevel = "">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly = "NLog.Targets.MauiLog"/>
  </extensions>

  <variable name = "logPath" value = "${environment:folder=Personal}" />

  <!-- the targets to write to -->
  <target name = "liteDB" xsi:type = "liteDBTarget"
          connectionString = "file=NLog.db"
          collectionName = "DefaultLog" FlushTimeout = "100" BufferSize = "100" SlidingTimeout = "true" OverflowAction = "Flush">
    <property name = "ThreadID" layout = "${threadid}" bsonType = "Int32" />
    <property name = "ThreadName" layout = "${threadname}" />
    <property name = "ProcessID" layout = "${processid}" bsonType = "Int32"  />
    <property name = "ProcessName" layout = "${processname:fullName=true}" />
    <property name = "UserName" layout = "${windows-identity}" />
  </target>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name = "*" minlevel = "Trace" writeTo = "allfile" />

    <!--Output hosting lifetime messages to console target for faster startup detection -->
    <logger name = "Microsoft.Hosting.Lifetime" minlevel = "Warn" writeTo = "lifetimeConsole, ownFile" final = "true" />

    <!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
    <logger name = "Microsoft.*" maxlevel = "Info" final = "true" />
    <logger name = "System.Net.Http.*" maxlevel = "Info" final = "true" />

    <logger name = "*" minlevel = "Warn" writeTo = "ownFile" />
  </rules>


</nlog>

Когда я пытаюсь запустить проект при эмуляции Pixel 5 и получаю

: 'Не удалось загрузить NLog LoggingConfiguration. Искал в следующих местах:

  • /data/user/0/com.companyname.starter/files/Android-NLog.config

И, конечно же, в Android/data/companyname.starter нет никакого файла конфигурации, Я устанавливаю копию, если никогда не выполняю действия по сборке.

Я понимаю причину, но я не знаю, как правильно настроить развертывание для Android, чтобы в этом месте появился файл конфигурации nlog.

Возможно, вставьте NLog.config как сборочный ресурс в проект приложения. И загружайте вот так NLog.LogManager.Setup().LoadConfigurationFromAssemblyResourc‌​e(typeof(App).GetTyp‌​eInfo().Assembly);. Смотрите также github.com/NLog/NLog/wiki/…

Rolf Kristensen 19.05.2023 15:40

Вы правы, nloger теперь правильно инициализирован, но все еще nloger не создает никаких файлов в android/data/com.companyname.starter

Igor Markiv 26.05.2023 12:15

Пример приложения MAUI можно найти здесь: github.com/NLog/NLog.Targets.MauiLog/tree/master/examples/… . См. также учебник здесь: github.com/NLog/NLog.Targets.MauiLog/blob/master/README.md

Rolf Kristensen 03.06.2023 17:14
0
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта конфигурация работает для меня:

    <?xml version = "1.0" encoding = "utf-8" ?>
<nlog 
      throwConfigExceptions = "true"
      internalLogLevel = "Debug"
      internalLogFile = "${specialfolder:folder=ApplicationData}\Log\nlog-internal"

      xmlns = "http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
      autoReload = "true">

  <extensions>
    <add assembly = "NLog.LiteDB"/>
  </extensions>

  <targets>
    <target name = "liteDB" xsi:type = "liteDBTarget"
          connectionString = "special=${ApplicationData}\NLog.db"
          collectionName = "DefaultLog" FlushTimeout = "100" BufferSize = "100" SlidingTimeout = "true" OverflowAction = "Flush">
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <logger name = "*" minlevel = "Trace" writeTo = "liteDB" />

    <logger name = "*" minlevel = "Warn" writeTo = "liteDB" />
  </rules>
</nlog>

Я устанавливаю Nlog.config как встроенный ресурс и копирую, если он самый новый.

Мое определение одноэлементного регистратора выглядит следующим образом:

#if WINDOWS
            builder.Services.AddSingleton<NLog.Logger>(NLog.LogManager.Setup().LogFactory.LoadConfiguration("Windows-NLog.config").GetCurrentClassLogger());
#elif ANDROID

            try
            {

                Assembly assembly1 = typeof(App).GetTypeInfo().Assembly;
                NLog.Config.ISetupBuilder setupBuilder = NLog.LogManager.Setup();
                NLog.Config.ISetupBuilder configuredSetupBuilder = setupBuilder.LoadConfigurationFromAssemblyResource(assembly1);
                Logger configuredLogger = configuredSetupBuilder.GetCurrentClassLogger();
                builder.Services.AddSingleton<NLog.Logger>(configuredLogger);
            }
            catch (Exception ex)
            {
                ;
            }

#endif

Другие вопросы по теме