我最近在我的ASP中添加了日志(log)记录.Net核心项目.当前,日志(log)会写入一个.此格式的txt文件:

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

例如:

2017-11-30 13:58:22.229+01:00[信息]项在数据库中创建.

这很好,但我想知道记录该.txt文件的类名和正在执行的方法.例如,当类A使用方法B向数据库写入内容并将其记入日志(log)时,我希望看到如下内容

ClassA.MethodB:在数据库中创建的项

所有记录日志(log)的类都将其Logger注入到其构造函数中,如下所示

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();

如何将类和方法添加到日志(log)中?

Edit

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

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

这会导致在日志(log)中添加命名空间和类,现在只缺少该方法

推荐答案

我用Jordan's个答案和this个答案的组合解决了这个问题.

我通过将logcontext添加到enrichment来更改Loggerconfiguration,并将属性"method"添加到outputTemplate:

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();

这部电影丰富多彩.FromLogContext允许使用LogContext将属性推送到outputTemplate.PushProperty()方法.在本例中,是"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;

这适用于async种方法.

现在对于non-async种方法来说,这很好:

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

现在,方法名称将显示在日志(log)中.SourceContext添加名称空间+类,并通过添加"{Method}"将导致:

名称空间.类名.方法名

Asp.net相关问答推荐

如何调试 Azure 500 内部服务器错误

asp.net - 会话 - 多个浏览器选项卡 - 不同的会话?

加载特定 UpdatePanel 后如何调用客户端 javascript 函数

无法访问,内部,资源文件?

如何在asp.net中判断会话是否过期

如何在页面的基类中执行 Page_Load()?

在上下文中找不到 owin.Environment 项

从 RowDataBound 事件的 gridview 从单元格中获取值

如何在 ASP.NET Web API 中使用非线程安全的 async/await API 和模式?

为什么aspx文件会返回404(找不到页面)

ASP.net 与 PHP( Select 什么)

在不知道键名的情况下访问 JSON 对象的元素

使用 ASPNet_Regiis 加密自定义配置部分 - 你能做到吗?

我的 asp.net mvc Web 应用程序中的 OutputCache 设置.防止缓存的多种语法

带有 ASP.NET WebMethod 的 Jquery AJAX 返回整个页面

使用 Ninject OWIN 中间件在 OWIN 启动中注入 UserStore

.NET - c# - 需要跨分区查询,但在 DocumentDB 数据访问上禁用了问题

错误请求 - 无效的主机名 ASP.net Visual Studio 2015

如何从 ASP.NET 中的数据表/数据视图中 Select 前 n 行

判断 IQueryable 结果集的最佳方法是什么?