我正在.NETCore服务器中使用Serilog,并为我的云部署使用了多个接收器,例如控制台,文件和Graylog(GELF)。
一旦我将日志级别设置为DEBUG,我每隔几秒钟就会收到来自石英调度程序线程的消息。如何关闭此功能?它显示了成千上万的无用条目,如下所示:
2018-11-27 22:09:35.210 +00:00 [DBG] [Quartz.Core.QuartzSchedulerThread] [ThreadId 5] Batch acquisition of 0 triggers
2018-11-27 22:10:04.038 +00:00 [DBG] [Quartz.Core.QuartzSchedulerThread] [ThreadId 5] Batch acquisition of 0 triggers
2018-11-27 22:10:30.869 +00:00 [DBG] [Quartz.Core.QuartzSchedulerThread] [ThreadId 5] Batch acquisition of 0 triggers
2018-11-27 22:11:00.591 +00:00 [DBG] [Quartz.Core.QuartzSchedulerThread] [ThreadId 5] Batch acquisition of 0 triggers
我编写了一个REST API,无需重新启动服务即可动态更改日志级别(请参阅下面的配置中的_logLevelSwitch
)。但是,我不希望外部库继承我的代码的日志级别。该怎么办?
我设法在我的Serilog配置中使用source
为.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
微软公司做到了这一点。但是Quartz
是一个库,其源是我自己的二进制文件的名称,因此我无法以相同的方式降低日志级别。这是我的Serilog配置(一般部分,其他属性取决于运行时环境)
var loggerConfig = new LoggerConfiguration()
.MinimumLevel.ControlledBy(_logLevelSwitch)
.Enrich.FromLogContext()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.Enrich.WithProcessName()
.Enrich.WithThreadId()
.Enrich.WithMachineName()
.Enrich.WithAssemblyName();
然后我使用其他运行时特定的配置代码,例如:
switch (po.Runtime)
{
case Runtime.DevelLocal:
loggerConfig.Enrich.WithProperty(new KeyValuePair<string, object>("runtime", CommonConstants.RtDevelLocal));
_logLevelSwitch.MinimumLevel = LogEventLevel.Debug;
loggerConfig.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] " +
"[ThreadId {ThreadId}] {Message:lj}{NewLine}{Exception}");
loggerConfig.WriteTo.File(Path.Combine(po.LogPath, $"{BbDeConstants.ProductName}-.log"), rollingInterval: RollingInterval.Day,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] " +
"[ThreadId {ThreadId}] {Message:lj}{NewLine}{Exception}");
break;
case Runtime.DemoDatacenter:
loggerConfig.Enrich.WithProperty(new KeyValuePair<string, object>("runtime", CommonConstants.RtDemoDatacenter));
loggerConfig.WriteTo.Graylog(new GraylogSinkOptions
{
HostnameOrAddress = po.LogHost,
TransportType = TransportType.Udp,
Port = 12201,
Facility = "BizBus",
});
break;
.....
}
我了解到Quartz.Net
正在使用Commons.logging
,但我没有使用它,并且没有配置。
有什么主意如何消除那些Quartz.Core.QuartzSchedulerThread
消息?
答案 0 :(得分:1)
我通过将以下行添加到我的Serilog配置中解决了这个问题:
.MinimumLevel.Override("Quartz", LogEventLevel.Information)
因此您的配置将是:
var loggerConfig = new LoggerConfiguration()
.MinimumLevel.ControlledBy(_logLevelSwitch)
.Enrich.FromLogContext()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("Quartz", LogEventLevel.Information)
.Enrich.WithProcessName()
.Enrich.WithThreadId()
.Enrich.WithMachineName()
.Enrich.WithAssemblyName();