とにかく、すべてのSerilog出力をメソッド名で強化する方法はありますか。
たとえば、私が次のものを持っているかどうかを検討してください。
Public Class MyClassName
Private Function MyFunctionName() As Boolean
Logger.Information("Hello World")
Return True
End Function
End Class
望ましい出力は次のようになります。
2015-04-06 18:41:35.361 +10:00 [Information] [MyFunctionName] Hello World!
実際には、完全修飾名が適切です。
2015-04-06 18:41:35.361 +10:00 [Information] [MyClassName.MyFunctionName] Hello World!
「エンリッチャー」は静的情報にのみ有効であり、毎回機能するわけではないようです。
コールスタックを反映することでエンリッチャーを使用してこれを行うことは可能ですが、そうするのは非常に費用がかかるため、Serilogはそれを提供していません。
代わりに、次のようなものを使用できます。
_Logger.Here().Information("Hello, world!");
_
Here()
メソッドをILogger
の拡張メソッドとして実装します。
_<Extension>
Public Sub Here(ByVal logger as ILogger,
<CallerMemberName> Optional memberName As String = Nothing)
Return logger.ForContext("MemberName", memberName)
End Sub
_
c#のバージョンが必要な場合:
public static class LoggerExtensions
{
public static ILogger Here(this ILogger logger,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0) {
return logger
.ForContext("MemberName", memberName)
.ForContext("FilePath", sourceFilePath)
.ForContext("LineNumber", sourceLineNumber);
}
}
このように使用します:
Logger.Here().Information("Hello, world!");
これらのプロパティをメッセージテンプレートに追加することを忘れないでください。次のようなものを使用できます。
var outputTemplate = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}in method {MemberName} at {FilePath}:{LineNumber}{NewLine}{Exception}{NewLine}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Warning()
.Enrich.FromLogContext()
.WriteTo.RollingFile("log/{Date}.log", outputTemplate, LogEventLevel.Warning)
.WriteTo.Console(LogEventLevel.Warning, outputTemplate, theme: AnsiConsoleTheme.Literate)
.CreateLogger();
MovGP0の回答 (C#の場合)に基づいて、
ルート名前空間にカスタム_Log.cs
_-クラスを追加するだけで、ログに記録するすべての行にHere()
-メソッドを必要としないソリューションを作成しました。
詳細については、以下を参照してください: https://Gist.github.com/litetex/b88fe0531e5acea82df1189643fb1f79
C#のバージョンは単純化できます。 AutofacSerilogIntegrationを使用するだけです。
var path = Server.MapPath("~/");
var outputTemplate = "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} {Message} {NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File($"{path}/log/serilog-.log", LogEventLevel.Debug, outputTemplate, rollingInterval: RollingInterval.Day)
.CreateLogger();
var builder = new ContainerBuilder();
builder.RegisterLogger(); // from AutofacSerilogIntegration
builder.RegisterControllers(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
SerilogのoutputTemplateで、ログがProperties
を書き込むように構成します。メソッド名はActionName
列の一部として書き込まれます。
ActionName
は、outputTemplateで(すべてのプロパティではなく)個別に構成することもできます。
Properties/ActionName
を構成すると、メソッド名がNamespace.ClassName.MethodName
形式で書き込まれます。