Serilog如何在文本文件中按升序(最新在上)记录日志?
如何让Serilog日志文件按最新消息在上的顺序记录?
问题描述
当前我的Serilog日志文件是降序记录(最早的消息在顶部,最新的在底部),我需要改成升序记录(最新消息在顶部,最旧消息在底部)。
当前Program.cs中的代码如下:
public static void Main(string[] args) { string timestamp = DateTime.Now.ToString("[yyyy-MM-dd][HH.mm.ss tt]", CultureInfo.InvariantCulture); Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .WriteTo.File($"C:\\Logs\\{timestamp}-log.txt", outputTemplate: "Time:{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}", rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Information ) .CreateLogger(); CreateHostBuilder(args).Build().Run(); }
解决方案
Serilog官方的File sink默认是把新日志追加到文件末尾,没法直接实现"最新消息在顶部"的需求,你可以用第三方包Serilog.Sinks.File.Alternative来搞定,具体操作:
安装NuGet包
在NuGet包管理器中安装Serilog.Sinks.File.Alternative,或者用命令行:Install-Package Serilog.Sinks.File.Alternative或者.NET CLI命令:
dotnet add package Serilog.Sinks.File.Alternative修改Serilog配置
把原有的WriteTo.File替换成WriteTo.ReverseFile,配置参数和原File sink基本一致,修改后的代码如下:public static void Main(string[] args) { string timestamp = DateTime.Now.ToString("[yyyy-MM-dd][HH.mm.ss tt]", CultureInfo.InvariantCulture); Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .WriteTo.ReverseFile($"C:\\Logs\\{timestamp}-log.txt", outputTemplate: "Time:{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}", rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Information ) .CreateLogger(); CreateHostBuilder(args).Build().Run(); }
这个包会将新的日志条目插入到文件开头,正好实现你需要的最新消息在顶部的效果。
内容的提问来源于stack exchange,提问作者Meeth46
相关产品推荐
相关产品推荐

