如何使NLog v5与Avalonia Android一起工作



最近我将NLog版本从4更新到5,现在我有一个问题。

原来我把我的NLog。在asset文件夹中配置,NLog会自动扫描并加载它。

但是当我升级到5并按照文档中的方法操作后,它不再工作了。

我设置我的NLog。配置为嵌入式资源,调用OnCreate()中的LogManager.Setup().LoadConfigurationFromAssemblyResource(typeof(MainActivity).GetTypeInfo().Assembly);

我如何使它正确工作?

您可以从嵌入式程序集资源加载NLog配置:

LogManager.Setup().LoadConfigurationFromAssemblyResource(typeof(MainActivity).GetTypeInfo().Assembly);

也可以重定向Avalonia日志输出到NLog通过注册ILogSink为NLog:

using Avalonia.Logging;
using NLog;
namespace Logging
{
public class NLogSink : ILogSink
{
private readonly LogEventLevel _level;
private readonly HashSet<string>? _areas;
public NLogSink(
LogEventLevel minimumLevel,
IList<string>? areas = null)
{
_level = minimumLevel;
_areas = areas?.Count > 0 ? new HashSet<string(areas) : null;
}
public bool IsEnabled(LogEventLevel level, string area)
{
return level >= _level && (_areas?.Contains(area) ?? true);
}
public void Log(LogEventLevel level, string area, object? source, string messageTemplate)
{
if (IsEnabled(level, area))
{
Nvar logger = Resolve(source?.GetType(), area);
logger.Log(LogLevelToNLogLevel(level), messageTemplate, propertyValues);
}
}
public void Log(LogEventLevel level, string area, object? source, string messageTemplate, params object?[] propertyValues)
{
if (IsEnabled(level, area))
{
var logger = Resolve(source?.GetType(), area);
logger.Log(LogLevelToNLogLevel(level), messageTemplate, propertyValues);
}
}
private ConcurrentDictionary<string, NLog.Logger> _loggerCache = new ConcurrentDictionary<string, NLog.Logger>();
public static NLog.ILogger Resolve(Type? source, string? area)
{
var loggerName = source?.ToString() ?? area;
if (string.IsNullOrEmpty(loggerName))
loggerName = typeof(NLogSink).ToString();
if (!_loggerCache.TryGetValue(loggerName, out var logger))
{
logger = NLog.LogManager.GetLogger(loggerName);
_loggerCache.TryAdd(loggerName, logger);
}
return logger;
}
private static NLog.LogLevel LogLevelToNLogLevel(LogEventLevel level)
{
switch (level)
{
case LogEventLevel.Verbose:
return NLog.LogLevel.Trace;
case LogEventLevel.Debug:
return NLog.LogLevel.Debug;
case LogEventLevel.Information:
return NLog.LogLevel.Info;
case LogEventLevel.Warning:
return NLog.LogLevel.Warn;
case LogEventLevel.Error:
return NLog.LogLevel.Error;
case LogEventLevel.Fatal:
return NLog.LogLevel.Fatal;
default:
return NLog.LogLevel.Trace;
}
}
}
public static class NLogSinkExtensions
{
public static AppBuilder LogToNLog(
this AppBuilder builder,
LogEventLevel level = LogEventLevel.Warning,
params string[] areas)
{
Logger.Sink = new NLogSink(level, areas);
return builder;
}
}
}

然后像这样设置:

public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.LogToNLog();

参见:https://gist.github.com/graealex/43f5667c33df8e33bf60981887b49448

参见:https://docs.avaloniaui.net/docs/getting-started/logging-errors-and-warnings

最新更新