有没有办法创建文件名中不包含日期戳的 Serilog 非滚动文件接收器?

Is there a way to create a Serilog non rolling File Sink that doesn't include the date stamp in the filename?

我是 C# 的新手... 我们使用 Serilog 来记录 ILogger 日志记录。对于我的测试用例,我想将一个日志文件名传递给 Serilog File sink,并且不让它在文件名中插入 YYYYMMDD。到目前为止,我还没有找到让 Serilog 不将日期插入日志文件名的方法。以下是用于证明这一点的简短代码片段:

public static class Log
{
    private static readonly ConcurrentDictionary<string, Lazy<ILogger>> fileLogs = new ConcurrentDictionary<string, Lazy<ILogger>>();

    public static ILogger File(string path)
    {
        var filePath = string.IsNullOrEmpty(path)
            ? $"{Assembly.GetEntryAssembly().GetName().Name}_{UnixEpoch.MillisecondsNow}.log"
            : path;

        var fileInfo = new FileInfo(filePath);
        return fileLogs.GetOrAdd(fileInfo.FullName, name => new Lazy<ILogger>(() =>
        {
            fileInfo.Directory.Create();

            return LoggerFactory
                .Create(builder => builder.AddFile(filePath))
                .CreateLogger("File");
        })).Value;
    }
}

public void CreateFileLog()
{
    var log = Log.File("./test.log");
    log.LogInformation("Sample log record.");
}

输出文件名将是:./test20220517.log

如何设置 Serilog 文件接收器,使其不将日期插入日志文件名?

文件接收器支持滚动间隔,这也会影响它写入的文件的命名约定。您可以设置 无限 的滚动间隔,这将无限期地使用同一个文件并且不会显示更改文件名。

To configure the sink in C# code, call WriteTo.File() during logger configuration:

var log = new LoggerConfiguration() .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); This will append the time period to the filename, creating a file set like:

log20180631.txt

log20180701.txt

log20180702.txt

https://github.com/serilog/serilog-sinks-file#rolling-policies

https://github.com/serilog/serilog-sinks-file/blob/dev/src/Serilog.Sinks.File/Sinks/File/RollingIntervalExtensions.cs#L26

请注意,文件接收器将文件大小限制为 1 GB,并且会停止写入日志,直到达到下一个滚动周期以防止磁盘使用问题,因此如果您确实达到该限制,您的无限日志可能会停止更新。