c# - ASP.NET Core Windows 服务中的 Serilog 无法将文件写入本地系统
问题描述
我将 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 日志记录不能。
这是我的 Program.Main:
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
推荐阅读
- python - 为什么我无法将我的 python 代码放入 csv 文件?
- c# - 我需要帮助为这个问题创建一个循环
- javascript - 如何在 timeupdate 事件中获取 currentTime(应用和绑定)
- kubernetes - 无法向 API 服务器注册节点“节点名称”:未经授权
- swift - 我想从外部添加一个 UILabel 到我图书馆的收藏视图单元格
- google-cloud-platform - 将 ShareDataset 与 BigQuery 结合使用时是否存在任何性能问题或限制?
- javascript - 在 css 中提交 Eslint 错误时
- java - 在最小化和取消最小化之前无法调整内部框架的大小
- regex - Vim - E488 错误 - 搜索和替换命令中的尾随字符
- ios - Paytm 控制台在 Swift 4 中出现 404 错误