gpt4 book ai didi

C# ASP.NET Core Serilog 添加类名和方法来记录

转载 作者:太空狗 更新时间:2023-10-29 22:56:55 24 4
gpt4 key购买 nike

我最近在我的 ASP.Net Core 项目中添加了日志记录。目前,日志以这种格式写入 .txt 文件:

{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}

例如:

2017-11-30 13:58:22.229 +01:00 [Information] Item created in database.

这很好,但我想要记录类的名称和正在执行到此 .txt 文件的方法。例如,当 A 类使用方法 B 将某些内容写入数据库并记录下来时,我希望看到类似的内容

ClassA.MethodB: Item created in database

所有记录日志的类都将其 Logger 注入(inject)到它们的构造函数中,例如

public class ClassA
{
private readonly ILogger _log;

public ClassA(ILogger<ClassA> log){
_log = log;
}

public void AddItemToDb(Item item){
//Add item
//On success:
_log.LogInfo("Added item to db.");
}
}

我目前正在使用 Serilog 并使用以下 LoggerConfiguration:

var logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.WriteTo.RollingFile(Configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information)
.CreateLogger();

如何将类和方法添加到我的日志中?

编辑

我向 .WriteTo.Rollingfile() 方法添加了自定义 outputTemplate,如下所示:

"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}")

导致在日志中添加了命名空间加上类,现在只缺少方法

最佳答案

我通过结合使用 Jordan's 解决了这个问题回答和this回答。

我通过 enrichment 添加日志上下文来更改我的 Logger 配置并将属性“方法”添加到我的输出模板中:

var logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.RollingFile(Configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{Method}) {Message}{NewLine}{Exception}")
.CreateLogger();

Enrich.FromLogContext 允许使用 LogContext.PushProperty() 方法将属性推送到 outputTemplate。在本例中为“method”属性(注意 outputTemplate 中的 {Method})。

async 方法示例:

using (LogContext.PushProperty("Method", new LogAsyncMethods().GetActualAsyncMethodName()))
{
_log.LogInformation("Log message.");
}

其中GetActualAsyncMethodName()是这样写的:

public static string GetActualAsyncMethodName([CallerMemberName]string name = null) => name;

这适用于异步方法。

现在对于非异步方法,这工作正常:

using (LogContext.PushProperty("Method", System.Reflection.MethodBase.GetCurrentMethod().Name))
{
_log.LogInformation("Changing of customer name succeeded");
}

现在方法名称显示在日志记录中。 SourceContext 添加命名空间 + 类,并通过添加“.{Method}”将导致:

Namespace.ClassName.MethodName

关于C# ASP.NET Core Serilog 添加类名和方法来记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47576733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com