我已经开始在各种项目中使用 Serilog,并且几乎总是存在一些日志数据未通过的问题。
例如,现在我有一个简单的 C# .NET core 6 项目。安装了所有需要的块,项目按预期启动,但没有创建包含日志数据的文件。我打开 selflog 来跟踪问题:
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
但是没有更多信息打印到调试窗口?
这里是 winform 应用程序的一些部分:
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var loggerConfig = new LoggerConfiguration();
Log.Logger = loggerConfig.ReadFrom.Configuration(configuration).CreateLogger();
var appSettings = AppSettingsHelper.GetAppSettings();
var mainPresenter = CompositionRoot(appSettings);
Application.Run(mainPresenter.GetViewForm());
}
static IHostBuilder CreateHostBuilder(AppSettings appSettings)
{
var httpClient = CreateHttpClient();
return Host.CreateDefaultBuilder()
.UseSerilog((hostingContext, configuration) => configuration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext())
.ConfigureServices((context, services) =>
{
services.AddTransient<IMainModel, MainModel>();
});
}
static IMainPresenter CompositionRoot(AppSettings appSettings)
{
var hostBuilder = CreateHostBuilder(appSettings);
var host = hostBuilder.Build();
var serviceProvider = host.Services;
return serviceProvider.GetService<IMainPresenter>();
}
我可以在调试模式下看到它已经加载了应用程序设置和文件接收器:
{
"serilog": {
"Using": [
"Serilog.Enrichers.Environment"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "/Logs/log.txt",
"outputTemplate": "{Timestamp:G} {SourceContext} [{Level}] {Message}{NewLine:1}{Exception:1}",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"fileSizeLimitBytes": 1000000,
"rollOnFileSizeLimit": "true",
"shared": "true",
"flushToDiskInterval": 3
}
}
]
}
}
要获取日志数据,其中一些已执行但仍然没有文件:
_logger.LogInformation("...");
那么如何解决这个问题呢?在哪里可以找到文件未创建的原因?
编辑: 通过在 appsettings 中添加写入控制台并将我的 winform 项目切换到控制台项目,我可以看到我得到了预期的日志数据。但是仍然没有创建文件?
最终编辑: 好吧,几个小时后我在 stackoverflow 上找到了一个建议,“Serilog.Sinks.File”应该像这样包含在使用中:
"serilog": {
"Using": [
"Serilog.Enrichers.Environment","Serilog.Sinks.File"
],
这个主题的问题仍然存在,如何在不花费数小时的情况下解决这个问题,selflog 显然是不够的。
在 Visual Studio 中执行此操作的最快方法可能是检查
Log.Logger
.您可以导航到其内部
_sinks
属性,以便查看存在哪些接收器。
如果这里没有出现,你至少知道你的配置有问题。
下面的例子有一个
ConsoleSink
和PeriodicFlushToDiskSink
这是RollingFileSink
.
鉴于
"path": "/Logs/log.txt"
的FileAppender
配置,下图显示实际文件将写入C:\Logs\
文件夹中。
要将该文件放在应用程序文件夹的子文件夹中,请使用
./Logs/log.txt
.
我可以在
Serilog.Sinks.File
部分中没有Using
的情况下运行您的上述设置,它只是没有在预期的位置登录。