核心 Windows 服务中的 Serilog ASP.NET 无法将文件写入本地系统



我正在运行 ASP.NET Core Web服务器作为Windows服务,并使用Serilog记录到%PROGRAMDATA%中的文件。当我以本地系统运行服务时,不会记录任何内容。

我在Windows 10上使用.Net Core 2.2。我正在通过在服务中触发一个错误来进行测试,该错误在错误级别写入日志事件。我尝试以自己的管理帐户运行该服务,并且日志记录工作正常;仅当作为本地系统运行时,才会出现此问题。

我有其他使用.Net Framework的Windows服务,它们作为本地系统运行,并且使用Serilog记录到%PROGRAMDATA%没有问题,但这是我第一次在.Net Core上尝试它。我可以使用 Directory.CreateDirectory 和 File.AppendText 手动创建并写入服务中的日志文件,并且在作为本地系统运行时工作,但 Serilog 日志记录则不能。

这是我的程序:

public static async Task Main(string[] args)
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));       
if (isService)
{
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);
}
var host = WebHost.CreateDefaultBuilder(args.Where(arg => arg != "--console").ToArray())
.UseStartup<Startup>()
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext())
.Build();
// additional async initialization omitted
if (isService)
{
host.RunAsService();
}
else
{
host.Run();
}
}

这是我的appsettings.json的Serilog部分:

"Serilog": {
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "%PROGRAMDATA%/foo/bar baz/logs/qux.log",
"fileSizeLimitBytes": 1048576,
"rollOnFileSizeLimit": "true",
"retainedFileCountLimit": 99,
"flushToDiskInterval": "00:00:01",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
}
},
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
}
}
]
}

当服务作为本地系统运行时,我希望将日志记录写入 %PROGRAMDATA% 中的文件,但没有任何反应。当服务作为任何其他管理帐户运行时,日志记录不会出现问题。

如果我没有误解,它对帐户系统权限来说是可怕的:

"本地管理员"的本地系统帐户与管理员帐户相同。

如果您有域管理员并且您有本地管理员。两者几乎具有相同的功能。

如果您是域的一部分,则通常不希望以域管理员身份登录计算机。

如果可以,你始终希望使用本地管理员帐户。这背后的原因是您的计算机可能带有病毒,并且您以域管理员身份登录,您刚刚打开了整个网络中病毒的大门

如果您需要写入 %PROGRAMDATA%,那么您应该授予权限并像这样使用 https://stackoverflow.com/a/30792263/914284

相关内容

最新更新