Мы используем 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. Искал в следующих местах:
И, конечно же, в Android/data/companyname.starter нет никакого файла конфигурации, Я устанавливаю копию, если никогда не выполняю действия по сборке.
Я понимаю причину, но я не знаю, как правильно настроить развертывание для Android, чтобы в этом месте появился файл конфигурации nlog.
Вы правы, nloger теперь правильно инициализирован, но все еще nloger не создает никаких файлов в android/data/com.companyname.starter
Вы пытались включить NLog InternalLogger и искали предупреждения? См. также github.com/NLog/NLog/wiki/Logging-Troubleshooting
Пример приложения MAUI можно найти здесь: github.com/NLog/NLog.Targets.MauiLog/tree/master/examples/… . См. также учебник здесь: github.com/NLog/NLog.Targets.MauiLog/blob/master/README.md
Эта конфигурация работает для меня:
<?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
Возможно, вставьте
NLog.configкак сборочный ресурс в проект приложения. И загружайте вот такNLog.LogManager.Setup().LoadConfigurationFromAssemblyResource(typeof(App).GetTypeInfo().Assembly);. Смотрите также github.com/NLog/NLog/wiki/…