簡體   English   中英

創建返回Serilog LoggerConfiguration的方法(Asp.Net Core 2.0)

[英]Creating method to return Serilog LoggerConfiguration (Asp.Net Core 2.0)

我最初使用一個日志文件用於Serilog,我通過這樣做完成了

var slc = new SerilogSubLoggerConfiguration();   
configuration.GetSection("Serilog:SubLogger").Bind(slc);

然后在Program.cs的Main方法中配置SubLogger

 Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .WriteTo.Logger(logger => logger.Filter.
                ByIncludingOnly(lvl => lvl.Level == slc.Level).WriteTo.RollingFile(slc..PathFormat))
            .CreateLogger();

我已經開始使用現在在appsettings文件中定義的三個單獨的日志。 這將創建一個類,其中包含一個屬性,即Serilog配置列表

 public class SerilogSubLoggerConfigurations
{
    public List<SerilogSubLoggerConfiguration> SubLoggers { get; set; }
}

var slcs = configuration.GetSection("Serilog").Get<SerilogSubLoggerConfigurations>();

現在我有了SubLogger配置列表,我需要創建記錄器,並添加所有這些子記錄器。 每個SubLogger都需要自己的

.WriteTo.Logger(logger => logger.Filter.
                ByIncludingOnly(lvl => lvl.Level == slc.Level).WriteTo.RollingFile(slc..PathFormat))

在Log.Logger調用中,我需要迭代SubLoggers。 我的目的是寫一個方法來做到這一點。

public static LoggerConfiguration GetLoggerConfiguration(IConfiguration config, SerilogSubLoggerConfigurations slcs)
    {
        var lc = new LoggerConfiguration();
        lc.ReadFrom.Configuration(config);

        foreach (var cfg in slcs.SubLoggers)
        {
            lc.WriteTo.Logger(logger => logger.Filter
                                       .ByIncludingOnly(lvl => lvl.Level == cfg.Level).WriteTo
                                       .RollingFile(cfg.PathFormat));
        }

        lc.CreateLogger();
        return lc;
    }

然后在Main方法中使用它

Log.Logger = GetLoggerConfiguration(configuration, slcs);

但這個錯誤,

無法將類型'Serilog.LoggerConfiguration'隱式轉換為'Serilog.ILogger'

我嘗試將方法更改為ILogger並返回ILogger,但ILogger不包含WriteTo和ReadFrom方法,所以這是不行的。 我嘗試將返回的LoggerConfiguration轉換為ILogger,但這也不起作用,並且許多其他迭代也失敗了。

必須有辦法實現這一目標。 任何幫助贊賞。

更新:

 public static int Main(string[] args)
    {
        var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
            .AddEnvironmentVariables()
            .Build();

        var slcs = configuration.GetSection("Serilog").Get<SerilogSubLoggerConfigurations>();
        Log.Logger = BuildLogger(configuration, slcs);
        Log.Information(Appname != null ? $"{Appname}{LogDelimeter}Logger created." : "Logger created.");

        try
        {
            Log.Information(Appname != null ? $"{Appname}{LogDelimeter}Starting web host" : "Starting web host.");
            BuildWebHost(args).Run();
            return 0;
        }
        catch (Exception ex)
        {
            Log.Fatal(ex,
                Appname != null
                    ? $"{Appname}{LogDelimeter}Web Host terminated unexpectedly"
                    : "Web Host terminated unexpectedly");
            return 1;
        }
        finally
        {

            Log.Information(Appname != null ? $"{Appname}{LogDelimeter}Flushing log and closing it." : "Flushing log and closing it.");
            Log.CloseAndFlush();
        }
    }

我嘗試將方法更改為ILogger並返回ILogger,但ILogger不包含WriteTo和ReadFrom方法,所以這是不行的。

Serilog bootstraping的順序如下:

  1. 您可以創建Serilog.LoggerConfiguration對象的實例,並使用代碼調用( WriteTo.RollingFile() )或從配置文件( ReadFrom.Configuration() )進行設置。
  2. 然后在構建Serilog配置之后,使用LoggerConfiguration.CreateLogger()調用創建一個記錄器。

因此,在您完成加載配置之前,您無法記錄任何消息(您還沒有Logger實例)。 但是在構建記錄器之后,沒有必要調用WriteToReadFrom方法,因為已經構建了logger,並且對源配置的更改不會影響任何內容。

因此,您可以將GetLoggerConfiguration()方法更改為:

public static Serilog.ILogger BuildLogger(IConfiguration config, SerilogSubLoggerConfigurations slcs)
{
    var lc = new LoggerConfiguration();
    lc.ReadFrom.Configuration(config);

    foreach (var cfg in slcs.SubLoggers)
    {
        lc.WriteTo.Logger(logger => logger.Filter
            .ByIncludingOnly(lvl => lvl.Level == cfg.Level).WriteTo
            .RollingFile(cfg.PathFormat));
    }

    //  Apply any additional changes to lc configuration here

    //  Finally build a logger
    return lc.CreateLogger();
}

static void Main(string[] args)
{
    //  ...
    var logger = BuildLogger(configuration, subLoggerConfigurations);

    //  No any changes could be made to logging configuration at this point.
    //  Just log what you need.

    logger.Information("Test info message");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM