当 WPF 应用程序作为单个文件发布时,为什么不能将日志写入文件

Why cannot write log to files when WPF application publishing as a single file

我在 WPF 中使用 Microsoft.Extensions.HostingNLog.Web.AspNetCore。应用程序 运行 在 DebugRelease 模式下正确,但是当我将应用程序发布为单个文件时,我发现 File 目标在 fileName 时不起作用使用相对路径。

NLog 版本: 4.6.8
平台:.NET Core 3
NLog 配置

<nlog>
  <targets>
    <default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
    <target xsi:type="File" name="file" fileName="logs/${level}-${shortdate}.log" encoding="utf-8"
            layout="${longdate}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="file" final="true"/>
  </rules>
</nlog>

我使用AddNLog来应用这个配置:

public App()
{
    _host = new HostBuilder()
        .ConfigureLogging(logBuilder =>
        {
            logBuilder.ClearProviders()
            .SetMinimumLevel(LogLevel.Debug)
            .AddNLog("NLog.config");
        })
        .ConfigureServices((hostContext, services) =>
        {
            //...
        }).Build();
}

应用程序启动时显示主窗口:

private void Application_Startup(object sender, StartupEventArgs e)
{
    using var serviceScope = _host.Services.CreateScope();
    var serviceProvider = serviceScope.ServiceProvider;
    _logger = serviceProvider.GetRequiredService<ILogger<App>>();
    SetupExceptionHandling();
    MainWindow mainWindow = serviceProvider.GetRequiredService<MainWindow>();
    mainWindow.Show();
    _logger.LogInformation($"Application startup at {DateTime.Now} successfully");
}

作为单个文件发布并 运行 它,成功启动的日志不会写入文件,但是当我将 fileName 更改为绝对路径时 /logs/${level}-${shortdate}.log${level}-${shortdate}.log,可以写入日志

我尝试在代码中配置它:

var config = new LoggingConfiguration();
var file = new FileTarget("file")
{
    FileName = "logs/${shortdate}-${level}.log",
    Layout = "${longdate}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"
};
config.AddRule(LogLevel.Info, LogLevel.Fatal, new BufferingTargetWrapper(file));
return config;

结果还是一样

我写错了吗?感谢您的帮助。

NLog 将自动在相对文件名路径前添加 ${basedir} 布局。另见 https://github.com/nlog/nlog/wiki/Basedir-Layout-Renderer

可悲的是,Microsoft 决定不修复 AppDomain.BaseDirectory 在 NetCore 3.1 中执行单个文件发布

解决方法是明确指定 ${basedir:fixTempDir=true}:

<nlog>
  <targets>
    <default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
    <target xsi:type="File" name="file" fileName="${basedir:fixtempdir=true}/logs/${level}-${shortdate}.log" encoding="utf-8"
            layout="${longdate}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="file" final="true"/>
  </rules>
</nlog>

希望微软能用 NetCore5 解决这个问题