bounty将在2天后过期。回答此问题可获得+350的声誉奖励。Banshee正在寻找来自声誉良好的来源的答案。
我已经开始在所有类型的项目中使用Serilog,几乎总是有一些日志数据没有通过的问题。
例如,现在我有一个简单的C# .NET core 6项目,所有需要的nuggets都安装好了,项目正常启动,但是没有创建包含日志数据的文件,我打开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>();
}
在调试模式下,我可以看到它已经加载了appsettings和文件接收器:
{
"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中添加write to console并将我的winform项目切换到console项目,我可以看到我得到了预期的日志数据。但是仍然没有创建文件?
**最终编辑:**好的,几个小时后我发现了一个关于stackoverflow的建议,“Serilog.sinks.file”应该包含在使用中,如下所示:
"serilog": {
"Using": [
"Serilog.Enrichers.Environment","Serilog.Sinks.File"
],
然而这个主题的问题仍然存在,如何在不花费时间的情况下排除故障,selflog显然是不够的。
1条答案
按热度按时间ohfgkhjo1#
在Visual Studio中最快的方法可能是检查
Log.Logger
。这样做,您将找到配置的任何可能设置的值。
您可以导航到其内部
_sinks
属性,以便查看存在哪些接收器。如果这里没有显示,您至少知道您的配置中有一些不正常的地方。
下面的示例具有
ConsoleSink
和PeriodicFlushToDiskSink
,后者是RollingFileSink
。根据
RollingFileSink
的"path": "/Logs/log.txt"
配置,下图显示实际文件将写入C:\Logs\
文件夹。要将该文件放在应用程序文件夹的子文件夹中,请使用
./Logs/log.txt
。