16

我们正在使用 Serilog 将项目记录到带有 Windows 服务的数据库中,并且用户希望能够进行手动运行,因此我们制作了一个按钮(在网页上)来调用相同的代码(作为模块,而不是服务本身)。

当我们在代码中添加初始化日志以便代码继续添加到 db 日志表时,它还会记录之后的所有 http 流量。因此,在此代码运行后,我们要“关闭”在 Web 服务器上运行的 Logger。有没有简单的方法可以做到这一点?

Log.Logger = new LoggerConfiguration()
       .WriteTo.MSSqlServer(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString,
                "LOGS")
       .CreateLogger();
4

3 回答 3

24

日志级别可以在运行时修改LoggingLevelSwitch

var ls = new LoggingLevelSwitch();

Log.Logger = new LoggerConfiguration()
   .MinimumLevel.ControlledBy(ls)
   .WriteTo.MSSqlServer(...)
   .CreateLogger();

日志记录最初将处于该Information级别,您可以通过开关更改此设置。

Serilog 没有定义Off级别,但您可以使用以下方法对其进行近似:

ls.MinimumLevel = ((LogEventLevel) 1 + (int) LogEventLevel.Fatal);

...关闭注销。

于 2015-06-16T09:58:19.943 回答
12

这个问题已经有几年了,但我现在碰巧面临着类似的问题。

关闭 Serilog 日志的最简单方法是创建一个没有任何 sinks的新记录器。从 Serilog 的文档,配置基础

Log.Logger = new LoggerConfiguration().CreateLogger();
Log.Information("No one listens to me!");

编辑 (08/05/2017)

上面的解决方案是不正确的。经过更多研究,我发现这可以通过在配置记录器时设置过滤器来完成:

Log.Logger = new LoggerConfiguration()
    .Filter.ByExcluding(_ => !IsLoggingEnabled)
    .WriteTo.MSSqlServer(...)
    .CreateLogger();

, whereIsLoggingEnabled只是一个布尔标志。

于 2017-05-02T09:00:59.557 回答
3

根据 Microsoft 日志记录文档,如果您将日志级别设置为“无”,则所有日志都将被禁止。

要禁止所有日志,请指定 LogLevel.None。LogLevel.None 的值为 6,高于 LogLevel.Critical (5)。

低于最低级别的任何日志都不会:传递给提供者。记录或显示。

您可以在配置日志记录部分参考此文档。记录 asp.net 核心

对于 Serilog,您可以设置

"Serilog": {
"MinimumLevel": {
  "Default": "6"
}}

此配置将关闭Serilog,我在运行时尝试它并且它有效。

于 2021-08-11T08:34:16.427 回答