Windows-Service 中的 Serilog 未写入日志文件
Posted
技术标签:
【中文标题】Windows-Service 中的 Serilog 未写入日志文件【英文标题】:Serilog in Windows-Service not writing to logfile 【发布时间】:2014-12-21 17:25:55 【问题描述】:我在 TopShelf 服务中使用 Serilog,记录到控制台和滚动文件。在控制台中运行服务时,我的消息被写入日志文件,但是当我安装服务并运行它时,不会发生日志记录。我需要配置什么特别的东西吗?该文件将写入“.\logs\log-date.txt”下的二进制文件夹。
最好的问候 戈佩
【问题讨论】:
我也遇到了同样的问题,您有机会找到解决方案吗? 【参考方案1】:我有一个非常相似的问题。就我而言,问题在于相对路径。 我只需要指定绝对路径。现在它就像一个魅力。
WriteTo.RollingFile(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\log-Date.log")
希望对你有帮助!
【讨论】:
在<appSettings>
配置中,你还可以在路径中使用%TEMP%
之类的环境变量——将日志放在%APPDATA%
或类似的目录下可以很好地工作。
完美运行。谢谢【参考方案2】:
我们遇到了同样的问题,这是我们发现的:
Serilog 配置为滚动日志文件和写入 Seq Drable 日志已启用。症状 - 没有创建日志文件 - 没有日志写入 Seq。
根据@gdoten 的评论,我们的日志文件正在被写入 \windows\syswow64(服务作为本地服务运行)。 我们认为这些文件的权限可能不允许读取持久假脱机文件,导致没有日志写入 Seq。
修复是对滚动日志文件和缓冲区的路径进行硬编码。
【讨论】:
我的实际上是在 Windows\System32【参考方案3】: loggerFactory.AddFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log-Date.txt"));
试试这个,它在我的 ASP.NET core 2 应用程序中作为 Windows 服务运行
【讨论】:
如何在 appsettings.json 中指定应用域路径? 亲爱的@kudlatiger,这里是例子。/r/evar myDomainPath = Configuration["domainPath"];
loggerFactory.AddFile(Path.Combine(myDomainPath, "ApiLog-Date.txt"));
appsettings.json "domainPath": "myDomainPath",
【参考方案4】:
运行服务的帐户很可能没有写入日志文件位置的权限。尝试将日志文件位置更改为系统的临时文件夹,看看是否是这种情况。
如果仍然失败,最好使用 Serilog 的 SelfLog
获取异常信息。
【讨论】:
您好,尼古拉斯,感谢您的回复。该服务作为 LocalSytem 运行,并具有目录的完全权限(不包括特殊权限)。我目前使用 Log4Net 只是因为它在控制台和服务中工作。一旦我将 Logging 类更改为 SeriLog,它就不会在作为服务运行时写入甚至创建日志文件。仍然在控制台模式下它可以工作...... o_o 我会尝试检查 SelfLog,谢谢你的提示! 我发现当我的服务在此处登录时:<add key="serilog:write-to:RollingFile.pathFormat" value="ServerServiceApp-Date.log" />
以C:\Windows\SysWOW64
结尾,这显然是服务首次启动时的当前目录。仅供参考。【参考方案5】:
我也遇到过类似的问题,因为下面的代码,
public static IConfiguration Configuration get; = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
代码指定appsettings.json文件,在该文件中有serilog的配置设置,但是在服务中运行时,当前文件夹不指向可执行文件文件夹。所以它找不到文件 appsettings.json,然后当然 serilog 不会按预期工作。
只需要修改下面的代码就可以了
public static IConfiguration Configuration get; = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(AppDomain.CurrentDomain.BaseDirectory + "\\appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
【讨论】:
【参考方案6】:我作为 Windows 服务运行,这是我的 JSON 文件。
"Serilog":
"MinimumLevel": "Debug",
"WriteTo": [
"Name": "RollingFile",
"Args":
"pathFormat": "C:\\Program Files\\mycomp\\myapp\\logs\\log-Date.txt"
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentUserName", "WithProcessId" ],
"Properties":
"Application": "MyApp",
"Environment": "Development"
【讨论】:
我在使用 Windows 服务和配置设置时也遇到了这个问题。原来这个问题与权限无关。相反(使用来自上述线程的线索来启用 selflog),显示运行时无法找到各种接收器(控制台、文件)的程序集。我不得不在 Serilog 配置中添加一个新部分:“使用”:[“Serilog.Sinks.Console”、“Serilog.Sinks.File”、“Serilog.Enrichers.Environment”]。见github.com/serilog/serilog-settings-configuration。我不知道为什么 Windows 服务在查找程序集方面有所不同。【参考方案7】:你也可以使用这样的东西(当你想创建一个 Windows 服务和 Serilog 时):
var builder = new ConfigurationBuilder()
.AddJsonFile($@"Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)\appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
【讨论】:
以上是关于Windows-Service 中的 Serilog 未写入日志文件的主要内容,如果未能解决你的问题,请参考以下文章