.net 配置Serilog文件接收器,以便每次应用程序运行时使用一个日志文件

30byixjq  于 2023-04-13  发布在  .NET
关注(0)|答案(2)|浏览(171)

我想配置Serilog为每个应用程序运行创建一个日志文件。
文件名应基于当前日期/时间:

**首次运行:**log_20180413_1020.txt
**第2次运行:**log_20180413_1033.txt

我没有找到如何做到这一点在任何文件汇(滚动,替代..)
有线索吗

u3r8eeie

u3r8eeie1#

配置Serilog.Sinks.File接收器,不设置任何滚动周期或大小限制,并在启动时配置日志记录时将时间戳添加到日志文件名中:

string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmm");
var log = new LoggerConfiguration()
    .WriteTo.File($"log{timestamp}.txt")
    .CreateLogger();

根据自述文件的滚动策略部分:
同时指定rollingIntervalrollOnFileSizeLimit将导致同时应用这两种策略,而***指定任何一种策略都不会导致所有事件都写入单个文件。***

lztngnrs

lztngnrs2#

如果有人还在试图找出如何从appsettings.json实现这一点,我已经结束了这个解决方案:

// Add this line before creating a logger
UpdateLogFilePath(configuration);

// This is your existing Serilog logger creation logic
var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

UpdateLogFilePath方法的实现:

private static void UpdateLogFilePath(IConfigurationRoot configuration)
{
    // A configuration key pattern we are going to look for
    string pattern = "^Serilog:WriteTo.*Args:path$";

    foreach (var kvp in configuration.AsEnumerable())
    {
        if (Regex.IsMatch(kvp.Key, pattern, RegexOptions.IgnoreCase) 
            && !string.IsNullOrEmpty(kvp.Value))
        {
            // Format a file path in the logger configuration
            configuration[kvp.Key] = string.Format(kvp.Value, DateTime.Now);
        }
    }
}

appsettings.json示例:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.File" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "log_{0:yyyyMMdd_HHmm}.txt"
        }
      }
    ]
  }
}

相关问题