1

我目前正在开发一个单声道项目并想在那里使用 Microsoft.Logging + Serilog,但我偶然发现了以下问题:当我手动配置 Serilog 时,它会同时登录控制台和文件(如果我已经配置了两个参数)。但是当我使用配置文件时,Serilog 总是忽略对文件的日志记录。

找到配置文件并从那里读取参数,因为如果我在那里添加“控制台”,Serilog 会登录到控制台。

根据我的理解,使用这些设置,Serilog 应该登录到控制台和文件。我期待这个日志文件在"folder with appsettings.json"/logs. 但它只登录到控制台。当我删除时"Console",它不会在任何地方记录。我不明白为什么会这样,所以我发布了一些基本的代码部分。如果我没有提供足够的信息,请在问题下方的评论中写信给我。

appsettings.json

{
    "Serilog": {
        "Using": [
            "Serilog.Sinks.Console"
        ],
        "MinimumLevel": "Debug",
        "Enrich": [
            "FromLogContext",
            "WithMachineName",
            "WithProcessId",
            "WithThreadId"
        ],
        "WriteTo": [
            {
                "Name": "File",
                "Args": {
                    "Path": "logs/GUIDemo.log",
                    "FileSizeLimitBytes": "400000",
                    "RollingInterval": "Day",
                    "RetainedFileCountLimit": "15",
                    "OutputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level:u3}] {Message:lj} {NewLine}{Exception}",
                    "shared": true
                }
            },
            "Console"
        ]
    }
}

这是我在一个类中配置 Serilog 的方法,这些方法在应用程序启动后不久执行:

    private IContainer container;
    private ILogger<Bootstrapper> logger;
    ...
    public void OnStartup()
    {
        this.Configuration = this.ConfigureConfiguration();
        var builder = new ContainerBuilder();
        builder.RegisterModule<AutofacModule>();
        this.container = builder.Build();
        this.AddLogger();
        this.logger = this.container.Resolve<ILogger<Bootstrapper>>();
        this.LogApplicationStart();
    }

最后是方法AddLogger()LogApplicationStart()LogApplicationStart()

private void AddLogger()
{
    var loggerFactory = this.container.Resolve<ILoggerFactory>();
    loggerFactory.AddSerilog();

    Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(this.Configuration)
                .CreateLogger();
}

private IConfigurationRoot ConfigureConfiguration()
{
    return new ConfigurationBuilder().SetBasePath(System.IO.Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();
}

private void LogApplicationStart()
{
    this.logger.LogInformation("App is started");
}

经过这一切,控制台中的输出是(是的,它是 Godot):

Mono:日志文件为:'C:\Users\Albert\AppData\Roaming/Godot/mono/mono_logs/2021_01_27 12.46.37(105008).txt'

[12:46:38 INF] 应用程序已启动

Mono 日志文件与我的日志文件无关。我还尝试在应用程序中添加Log.CloseAndFlush()当前LogApplicationStart()唯一的方法,但它也没有帮助我。

当然,我知道这里有很多类似的问题,但我找不到我的问题的解决方案。

4

0 回答 0