如何配置Serilog使.NET Core 7应用的多个实例写入不同日志文件
如何配置Serilog使.NET Core 7应用的多个实例写入不同日志文件
这个场景我之前处理过,共享配置文件的情况下硬编码日志文件名肯定行不通,给你几个实用的解决方案,都能让不同实例生成独立的日志文件:
通过命令行参数传递实例标识
启动每个应用实例时指定独有的命令行参数,比如第一个实例用dotnet YourApp.dll --instance=Instance1,第二个用dotnet YourApp.dll --instance=Instance2。接着在代码里读取这个参数,把它拼到日志文件名里:var builder = WebApplication.CreateBuilder(args); // 读取命令行传入的instance参数,默认值为DefaultInstance var instanceId = builder.Configuration["instance"] ?? "DefaultInstance"; // 配置Serilog时使用实例标识区分日志文件 Log.Logger = new LoggerConfiguration() .WriteTo.File($"logs/app-{instanceId}.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); builder.Host.UseSerilog();用进程ID自动区分日志文件
每个运行中的应用实例都有唯一的进程ID,直接用它来命名日志文件,不用手动传参数,省心又可靠:using System.Diagnostics; var builder = WebApplication.CreateBuilder(args); // 获取当前进程的ID var processId = Process.GetCurrentProcess().Id; Log.Logger = new LoggerConfiguration() .WriteTo.File($"logs/app-process-{processId}.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); builder.Host.UseSerilog();通过环境变量区分实例
给每个实例设置不同的环境变量,比如Windows下启动前执行set APP_INSTANCE=InstanceA,Linux/macOS下执行export APP_INSTANCE=InstanceA。然后在代码里读取这个变量:var builder = WebApplication.CreateBuilder(args); // 读取环境变量,没有则用默认值 var instanceName = Environment.GetEnvironmentVariable("APP_INSTANCE") ?? "DefaultInstance"; Log.Logger = new LoggerConfiguration() .WriteTo.File($"logs/app-{instanceName}.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); builder.Host.UseSerilog();
另外,如果你的项目还在使用传统的App.config而不是appsettings.json,可以安装System.Configuration.ConfigurationManager NuGet包,然后结合命令行参数覆盖配置项。比如在App.config里加一个默认的<add key="InstanceID" value="DefaultInstance" />,启动时用dotnet YourApp.dll InstanceID=Instance1传递参数,代码里这样读取:
using System.Configuration; var instanceId = ConfigurationManager.AppSettings["InstanceID"];
备注:内容来源于stack exchange,提问作者LiquidityShark
相关产品推荐
相关产品推荐

