03
2019

Serilogでログを種類ごとに別のファイルに出力する

CATEGORY.NET
ASP.NET Coreネタ。ASP.NET Coreでは標準のロガーがあるが、そのままだとファイル出力ができないらしく、別途ライブラリを組み合わせるのが定番らしい(?)。
で、有名どころの「Serilog」を使ったのだが、ログを種類別に違うファイルに出力しようとしたら、ちょっと手間取ったので方法を書いておく。例によってStack Overflow等を参考にした。
最初に出来上がった設定を書いてしまうと、こんな感じ(使用例はこちら)。
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "/var/log/local/aspnetcoreapi-example/app.log",
"rollingInterval": "Day"
}
}
],
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "SourceContext = 'Honememo.AspNetCoreApiExample.Middlewares.AccessLogMiddleware' or StartsWith(SourceContext, 'Microsoft.EntityFrameworkCore.')"
}
}
]
}
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "/var/log/local/aspnetcoreapi-example/access.log",
"rollingInterval": "Day"
}
}
],
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "SourceContext = 'Honememo.AspNetCoreApiExample.Middlewares.AccessLogMiddleware'"
}
}
]
}
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "/var/log/local/aspnetcoreapi-example/sql.log",
"rollingInterval": "Day"
}
}
],
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "StartsWith(SourceContext, 'Microsoft.EntityFrameworkCore.')"
}
}
]
}
}
},
{
"Name": "Debug"
}
]
}
}
appsettings.json による設定。コードで設定する場合は同名のメソッドなどに読み替えてください。

ASP.NET Coreではロガー使用時に呼び出し元クラスを紐づけるものらしい(?)ので、そのクラス名でフィルタリングを行い、フィルタリングした結果をそれぞれのログファイルに出力している。
上の例では、AccessLogMiddleware のログを access.log ファイルに、EntityFrameworkCoreが出力するSQLログなどを sql.log ファイルに、それらを除外した残るログを app.log ファイルに出力している。
設定の構造的には、外側のロガーの設定の中に、Include/Excludeの設定をしたサブロガーがある形となっている。

クラスで分けられないケースは条件をもっと工夫する必要がありそうだけど、とりあえずこういう形で出力先を分けられますということで。
スポンサーサイト



Tag: ASP.NET .NET

0 Comments

Leave a comment