我目前正在开发一个单声道项目并想在那里使用 Microsoft.Logging + Serilog,但我偶然发现了以下问题:当我手动配置 Serilog 时,它会同时登录控制台和文件(如果我已经配置了两个参数)。但是当我使用配置文件时,Serilog 总是忽略对文件的日志记录。
找到配置文件并从那里读取参数,因为如果我在那里添加“控制台”,Serilog 会登录到控制台。
根据我的理解,使用这些设置,Serilog 应该登录到控制台和文件。我期待这个日志文件在"folder with appsettings.json"/logs
. 但它只登录到控制台。当我删除时"Console"
,它不会在任何地方记录。我不明白为什么会这样,所以我发布了一些基本的代码部分。如果我没有提供足够的信息,请在问题下方的评论中写信给我。
appsettings.json:
{
"Serilog": {
"Using": [
"Serilog.Sinks.Console"
],
"MinimumLevel": "Debug",
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithProcessId",
"WithThreadId"
],
"WriteTo": [
{
"Name": "File",
"Args": {
"Path": "logs/GUIDemo.log",
"FileSizeLimitBytes": "400000",
"RollingInterval": "Day",
"RetainedFileCountLimit": "15",
"OutputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level:u3}] {Message:lj} {NewLine}{Exception}",
"shared": true
}
},
"Console"
]
}
}
这是我在一个类中配置 Serilog 的方法,这些方法在应用程序启动后不久执行:
private IContainer container;
private ILogger<Bootstrapper> logger;
...
public void OnStartup()
{
this.Configuration = this.ConfigureConfiguration();
var builder = new ContainerBuilder();
builder.RegisterModule<AutofacModule>();
this.container = builder.Build();
this.AddLogger();
this.logger = this.container.Resolve<ILogger<Bootstrapper>>();
this.LogApplicationStart();
}
最后是方法AddLogger()
,LogApplicationStart()
和LogApplicationStart()
:
private void AddLogger()
{
var loggerFactory = this.container.Resolve<ILoggerFactory>();
loggerFactory.AddSerilog();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(this.Configuration)
.CreateLogger();
}
private IConfigurationRoot ConfigureConfiguration()
{
return new ConfigurationBuilder().SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false, true)
.Build();
}
private void LogApplicationStart()
{
this.logger.LogInformation("App is started");
}
经过这一切,控制台中的输出是(是的,它是 Godot):
Mono:日志文件为:'C:\Users\Albert\AppData\Roaming/Godot/mono/mono_logs/2021_01_27 12.46.37(105008).txt'
[12:46:38 INF] 应用程序已启动
Mono 日志文件与我的日志文件无关。我还尝试在应用程序中添加Log.CloseAndFlush()
当前LogApplicationStart()
唯一的方法,但它也没有帮助我。
当然,我知道这里有很多类似的问题,但我找不到我的问题的解决方案。