使用.Net Core控制台日志记录器记录事件日期时间

36

我正在使用内置于 .Net Core 框架中的日志记录功能将内容输出到控制台。以下是日志记录器的初始化代码:

var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(new LoggerFactory()
                    .AddConsole());

我还使用Microsoft.Extensions.Logging.LoggerExtension类进行日志记录,其中包含Log...方法。

这是我的应用程序中记录日志的示例:

_logger.LogInformation(eventId, "Action is started.");

当调用上述方法时,控制台输出以下字符串:

info: NameSpaceName.ClassName[eventId] Action is started.

我想在控制台输出中显示日期时间,指向日志方法执行的时间,但似乎Log方法不包含任何允许显示日期时间的方法。

是否存在一些方法或其他类格式化程序,可以在控制台输出中显示操作日期时间,而无需将其作为消息的一部分传递给方法?


在NetCore 3.0中将会有一个针对此项的配置。 - maracuja-juice
4个回答

51

此功能已添加到 Microsoft.Extensions.Logging.Console 的第 3 版中(pr)。你可以通过设置 TimestampFormat 来激活它:

  new ServiceCollection()
     .AddLogging(opt =>
     {
         opt.AddConsole(c =>
         {
            c.TimestampFormat = "[HH:mm:ss] ";
         });
    })

1
有关有效的格式字符串,请参见 DateTime.ToString(string? format) - Pang
5
在.NET 5中,这已经被弃用。请参阅https://learn.microsoft.com/en-us/dotnet/core/extensions/console-log-formatter - Stef Heyenrath
4
@StefHeyenrath,这里弃用的是 ***ConsoleLoggerFormat***,而不是在此提到的 TimestampFormat - Adarsha
1
AddConsole() 的唯一重载版本,可以配置时间格式的方法已经在 .NET 5+ 中被弃用。文档建议使用下面 @PawelBulwan 的答案,即使用 AddSimpleConsole() 或其他新的版本,如 AddJsonConsole() 等,而不是本答案中的 AddConsole() - yzorg
不确定为什么人们一直说这个重载没有被弃用。它在5+中特别是为了这个目的而存在。(如果您无法设置时间格式,为什么要推荐这个重载,如果它不能解决OP问题)? - yzorg

22

对于ASP.NET Core,您可能更喜欢使用配置文件appsettings.json,而不是直接将其连接到代码中。

{
  "Logging": {
    "Console": {
      "TimestampFormat": "[yyyy-MM-dd HH:mm:ss] "
    }
  }
}

只要在 Program.cs 中调用 Host.CreateDefaultBuilder(),这个就可以开箱即用。


3
更多关于配置信息的内容可以在这里找到: https://learn.microsoft.com/es-es/dotnet/core/extensions/console-log-formatter#set-formatter-with-configuration - Fco Javier Rod Ca
这应该是新的被接受的答案。 - Philippe

17

.NET 5(ASP.NET Core)中的示例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(options =>
    {
        options.AddSimpleConsole(c =>
        {
            c.TimestampFormat = "[yyyy-MM-dd HH:mm:ss] ";
            // c.UseUtcTimestamp = true; // something to consider
        });
    });

    // ...
}

输出示例:

[2020-12-13 12:55:44] info: Microsoft.Hosting.Lifetime[0] Application is shutting down...

1
我没有理解的一件事是,这不会修改“Debug”日志(在Visual Studio中找到)。从VS中,要想看到带有时间戳的日志,您应该将“显示输出来自”修改为Web服务器的日志。我认为没有办法向调试日志添加时间戳,因为AddDebug不接受任何参数。 - tleb
这在 .Net 5 中已被标记为弃用。 - Matt
1
@Matt @StefHeyenrath,这里所提到的弃用是针对ConsoleLoggerFormat而非TimestampFormat。https://learn.microsoft.com/en-us/dotnet/core/extensions/console-log-formatter确实指定:“在.NET 5中,Microsoft.Extensions.Logging.Console命名空间中的控制台日志支持自定义格式。” - Adarsha
@Adarsha 谢谢你的澄清,我不小心使用了 options.AddConsole 而不是 options.AddSimpleConsole - Matt

12

内置的.NET Core控制台日志记录器不会记录日期时间。跟踪此问题以获取更多详细信息。 最简单的解决方法是:

logger.Log(LogLevel.Information, 1, someObj, null, (s, e) => DateTime.Now + " " + s.ToString());

我写了一个自定义控制台记录器,可以自动记录时间戳并执行其他有用的技巧:

[2017.06.15 23:46:44] info: WebHost[1]      Request starting HTTP/1.1 GET http://localhost:6002/hc

1
谢谢。你的库太棒了。我刚刚添加了Nuget包的链接,删除了标准日志库的引用,更新了初始化,现在它按预期工作。 - digor_ua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接