仅当LoggingLevelSwitch为Information或更低时,MSSqlServer Sink才记录日志

时间:2019-03-25 17:46:52

标签: c# serilog

我正在编写一个简单的培训控制台应用程序,当用户仅输入数字(故意输入)时会触发致命错误。我有一个由3个其他记录器组成的主记录器:1个数据库,1个文件,1个事件。我使用单独的LoggingLevelSwitches动态更改文件和数据库的详细程度。文件开关按预期工作。 MSSqlServer正确设置了开关,但是除非将开关设置为Information或更低级别,否则我什么也无法实际记录。然后,将之前未记录的所有警告,错误,致命条目正确输入数据库。

当开关处于较高详细级别时,如何使sqlserver接收器正确记录日志?一切都以较低的详细程度运行良好,但是除非有必要,否则我不想在数据库中填充信息。文件或事件记录器没有问题

*我有一个处理对象,用于关闭和刷新日志

感谢您的帮助!

创建数据库记录器

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();

1 个答案:

答案 0 :(得分:0)

问题似乎与计时有关。由于所有记录器都是异步的,因此该程序关闭得太快,日志无法刷新。我很确定主程序线程会关闭,这会在记录器有时间完成异步过程之前关闭记录器上所有产生的子线程。

在冲洗调用似乎起作用之后,在处置上添加半秒线程暂停。可能要等一秒钟才能将其提高,但要注意。