指定Serilog滚动文件路径的目录

13

考虑这个 app.config 文件中的 appSetting 条目:

<add key="serilog:write-to:RollingFile.pathFormat"
 value="ServerServiceApp-{Date}.log" />

这是在应用程序启动时完成的:

Log.Logger = new LoggerConfiguration()
    .ReadFrom.AppSettings()
    .Enrich.WithThreadId()
    .CreateLogger();

这是在一个Windows服务程序中。日志文件最终会出现在这里:

C:\Windows\SysWOW64

显然,我们更希望日志文件位于与此服务的 .exe 相同的目录中(客户不希望我们将东西写入 SysWOW64)。但是,如何做到呢?

我们需要在其中添加 ReadFrom.AppSettings,以便客户可以在 app.config 中按需提供 serilog 设置。

在完成 ReadFrom.AppSettings 后是否有一种方法可以更改用于日志文件的目录?

如果我们能够像这样说就太棒了:

<add key="serilog:write-to:RollingFile.pathFormat"
 value="{ApDomainBaseDirectory}\ServerServiceApp-{Date}.log" />

(而{Date}应该放在文件路径中的位置,这一点有文档说明吗?)

2个回答

10

在创建LoggerConfiguration之前,只需加入以下内容:

Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;

然后,File.path将基于项目根路径构建。


这是一个很棒的技巧!当我在.NET5中使用Serialog写入文件时,遇到了问题,日志文件被创建在根目录下,而不是“…\bin\Debug\net5.0”中,但是当我使用了你的代码后,问题得到了解决。 - Константин Золин
当我使用SQL Server代理运行控制台应用程序时,这对我来说是解决方案。 - reasonet

7

服务写日志的最佳位置是 %PROGRAMDATA%,默认情况下在 C:\ProgramData\ 目录下。

尝试:

<add key="serilog:write-to:RollingFile.pathFormat"
     value="%PROGRAMDATA%\ServerService\Logs\log-{Date}.txt" />

(Program Files通常被认为是只读的,写入东西会导致在卸载时留下意外的奇怪现象。)


1
那个想法非常完美。没意识到环境变量可以放在路径字符串中。 - Glenn Doten
3
如果我更喜欢将日志文件定位在部署目录(=运行时目录)的子文件夹中,该怎么办? - BaltoStar
不幸的是,在Linux上,这对我在.Net 6上不起作用。在Windows上,%COMPUTERNAME%得到了很好的替换。${HOSTNAME}在Linux上的结果是'${HOSTNAME}' - R. Schreurs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接