我正在编写一个简单的训练控制台应用程序,当用户输入数字时(故意)会触发致命错误。我有一个主记录器由3个其他记录器组成:1个数据库,1个文件,1个事件。我使用单独的LoggingLevelSwitches动态更改文件和数据库详细程度。 File开关按预期工作。 MSSqlServer正确设置了交换机,但除非交换机设置为Information或更低,否则我无法获得任何实际日志。然后,之前未记录的所有警告,错误,致命条目都正确输入数据库。
当交换机处于更高的详细级别时,如何让sqlserver接收器正确记录条目?在较低的冗长情况下一切正常,但除非需要,否则我不想用数据填充数据库。文件或事件记录器没有问题
*我有一个dispose对象关闭并刷新日志
谢谢你的帮助!
创建db logger
return new LoggerConfiguration()
.MinimumLevel.ControlledBy(gDBLevel)
.WriteTo.Async(a => a.MSSqlServer(connectionString: pInitObj.DBConnectionString
, tableName: pInitObj.DBTableName
, batchPostingLimit: 50
, period: TimeSpan.FromMilliseconds(10)
, formatProvider: null
, autoCreateSqlTable: false
, columnOptions: tmpOptions
, schemaName: pInitObj.DBSchema))
.CreateLogger();
创建完整的记录器
return new LoggerConfiguration()
.Enrich.WithProperty(Constants.DefaultDataTags.AppName.ToString(), pInitObj.LogName.ToString())
.Enrich.With<EventID>()
.Enrich.With<HttpUserName>()
.Enrich.With<HttpUserIsAuthenticated>()
.Enrich.FromLogContext()
.Enrich.WithMvcActionName()
.Enrich.WithMvcControllerName()
.Enrich.WithHttpRequestClientHostIP()
.Enrich.WithHttpRequestUrl()
.Enrich.WithHttpSessionId()
.Enrich.WithHttpRequestType()
.Enrich.WithHttpSessionId()
.Enrich.WithHttpRequestUserAgent()
.Enrich.WithEnvironmentUserName()
.WriteTo.Logger(getEventLogger(pInitObj))
.WriteTo.Logger(getFileLogger(pInitObj))
.WriteTo.Logger(getDBLogger(pInitObj))
.CreateLogger();
似乎问题与时间有关。由于所有记录器都是异步的,因此程序关闭得太快,以至于日志不能写入flush。我很确定主程序线程会关闭,这会在记录器有时间完成异步进程之前折叠记录器上所有生成的子线程。
在刷新调用之后,在dispose上添加半秒的线程暂停似乎已经起作用。可能不得不将其提升到一秒钟之后,但是需要。