我在一个TopShelf服务中使用Serilog记录日志并输出到控制台和一个滚动的文件。当我在控制台中运行服务时,我的消息被写入日志文件,但是当我安装并运行服务时,没有任何日志记录。请问我需要进行特殊的配置吗?该文件被写入到二进制文件夹下的“.\logs\log-{date}.txt”中。
我在一个TopShelf服务中使用Serilog记录日志并输出到控制台和一个滚动的文件。当我在控制台中运行服务时,我的消息被写入日志文件,但是当我安装并运行服务时,没有任何日志记录。请问我需要进行特殊的配置吗?该文件被写入到二进制文件夹下的“.\logs\log-{date}.txt”中。
WriteTo.RollingFile(
AppDomain.CurrentDomain.BaseDirectory + "\\logs\\log-{Date}.log"
)
<appSettings>
配置中,您还可以在路径中使用环境变量,例如 %TEMP%
- 将日志放在 %APPDATA%
或类似位置可能效果很好。 - Nicholas Blumhardt症状
根据@gdoten的评论,我们的日志文件实际上是被写入到\windows\syswow64目录下(服务以localservice身份运行)。
我们认为这些文件的权限可能不允许持久化缓冲文件被读取,导致无法将日志写入Seq。
修复/解决方法是将滚动日志文件和缓冲路径进行硬编码。
loggerFactory.AddFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log-{Date}.txt"));
试试这个方法,它在我的ASP.NET Core 2应用程序中作为Windows服务运行时有效。
var myDomainPath = Configuration["domainPath"];
loggerFactory.AddFile(Path.Combine(myDomainPath, "ApiLog-{Date}.txt"));
appsettings.json "domainPath": "myDomainPath",
- Grigor Yeghiazaryan很可能是运行服务的帐户缺少写入日志文件位置的权限。尝试将日志文件位置更改为系统的临时文件夹,看看是否是这种情况。
如果仍然失败,使用Serilog的SelfLog
获取异常信息是最好的选择。
<add key="serilog:write-to:RollingFile.pathFormat" value="ServerServiceApp-{Date}.log" />
,它最终会出现在 C:\Windows\SysWOW64
目录下,这显然是服务首次启动时的当前目录。FYI。 - Glenn Doten
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也无法按预期工作。
只需要按照以下方式更改代码即可使其正常工作。
Original Answer翻译成"最初的回答"
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(AppDomain.CurrentDomain.BaseDirectory + "\\appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
我正在作为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"
}
}
}
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
当你想要创建一个 Windows 服务和 Serilog 时,你也可以使用类似这样的代码:
var builder = new ConfigurationBuilder()
.AddJsonFile($@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();