如何只为特定环境编写日志?

时间:2020-07-24 15:41:39

标签: c# logging serilog

除了使用预处理器指令来启用/禁用日志记录之外,是否还有其他选项取决于环境变量?我不希望来自生产环境的敏感数据进入日志。 事实证明,每个环境都有自己的配置。

public class Service
{
    private readonly Serilog.ILogger logger;

    public Service(ILogger logger)
    {
        this.logger = logger;
    }

    public void DoSomething()
    {
#if DEBUG
        // if it's a development environment
        this.logger
            .ForContext("Debug data", data)
            .Information("something happened");
#endif
        // if it's a production environment
        this.logger.Information("something happened");
    }
}

2 个答案:

答案 0 :(得分:2)

您可以根据条件配置Serilog管道。您只需要决定如何检测应用程序正在运行的环境,并相应地构建管道即可。

var configuration = new LoggerConfiguration()
    .WriteTo.Console();

if (condition)
{
    configuration.WriteTo.SomeOtherSink();
}

Log.Logger = configuration.CreateLogger();

以下是根据条件配置Serilog的更多示例:

您还可以通过配置文件设置Serilog,并且每个环境具有单独的配置文件。如果要使用appsettings.json,请查看Serilog.Settings.Configuration;如果要使用app.config,请查看Serilog.Settings.AppSettings

答案 1 :(得分:0)

Serilog 2.9.0开始,您可以使用条件接收器。通过使用.WriteTo.Conditional,您可以指定条件,该条件定义是否将接收器写入。

例如

bool enableConsoleLogging = (...)
bool enableFileLogging = (...)

var builder = new LoggerConfiguration()
    .Enrich.WithExceptionDetails()
    .Enrich.FromLogContext()
    .MinimumLevel.Warning()
    .WriteTo.Conditional(evt => enableConsoleLogging, wt => wt.Console())
    .WriteTo.Conditional(evt => enableFileLogging, wt => wt.File(...));

Log.Logger = builder.CreateLogger();
// ...
相关问题