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