当 WPF 应用程序作为单个文件发布时,为什么不能将日志写入文件
Why cannot write log to files when WPF application publishing as a single file
我在 WPF 中使用 Microsoft.Extensions.Hosting
和 NLog.Web.AspNetCore
。应用程序 运行 在 Debug
和 Release
模式下正确,但是当我将应用程序发布为单个文件时,我发现 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 解决这个问题
我在 WPF 中使用 Microsoft.Extensions.Hosting
和 NLog.Web.AspNetCore
。应用程序 运行 在 Debug
和 Release
模式下正确,但是当我将应用程序发布为单个文件时,我发现 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 解决这个问题