Serilog не создает файл журнала на рабочем сервере

Я создал консольное приложение C# .net5.0, и во время тестирования Serilog работал без происшествий, ведя журнал в консоли и в файле (та же папка; path="log.txt"). Однако, когда я запускаю приложение на нашем сервере, ни консоль, ни приемники ведения журнала файлов не работают! Теперь я предполагаю, что проблема не в самих стоках, а в том, что Serilog не работает.

Я пробовал включить самостоятельный журнал:

      Serilog.Debugging.SelfLog.Enable(msg =>
    Console.WriteLine(msg)
);

но даже работая в отладчике в моей среде разработки, Console.WriteLine(msg) линия никогда не вызывается!

Мой выглядит следующим образом:

      {
"Serilog": {
    "MinimumLevel": {
        "Default": "Debug",
        "Override": {
            "Microsoft": "Information",
            "System": "Information"
        }
    },
    "WriteTo": [
        {
            "Name": "Console",
            "Args": {
                "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
                "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {NewLine}{Exception}"
            }
        },
        {
            "Name": "File",
            "Args": {
                "path": "log.txt",
                "rollingInterval": "Infinite",
                "outputTemplate": "{Timestamp:HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
                "shared": false
            }
        }
    ],
    "Enrich": [ "FromLogContext" ]
},

"Database": {
    "Server": "(local)",
    "Database": "ActivbaseLive"
},

"Email": {
    "SmtpHost": "localhost",
    "SmtpPort": 25,
    "SmtpSecurityOption": "None",
    "SmtpUsername": null,
    "SmtpPassword": null,
    "SmtpSender": "\"Activbase Learning Platform\" <noreply@activbase.net>"
}
}

Я пробовал абсолютные пути (используя двойную обратную косую черту в appsettings.json). Я пробовал предварительно создать файл журнала (например, log.txt а также log200428.txt) и установкой разрешений для всех, полный доступ, но ни одно из этих изменений не устраняет проблему, и они не объясняют, почему приемник консоли также не записывает.

Вот как настраивается Serilog во время запуска, и я подозреваю, что проблема (даже если он работает в среде разработки):

      return Host.CreateDefaultBuilder()
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders();
    })
    .UseSerilog((hostContext, loggerConfiguration) =>
    {
        loggerConfiguration.ReadFrom.Configuration(hostContext.Configuration);
    })
    .ConfigureAppConfiguration((hostContext, builder) =>
    {
        builder.AddEnvironmentVariables();
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
        ...
    });
}

Есть идеи, почему Serilog не работает в продакшене?

2 ответа

Путь, который вы предоставляете, должен быть абсолютным. Что-то вроде этого:

      "path": "E:/wwwroot/QA/BackgroundWorkerService/Logs/logFile_.log"

Даже у меня была такая же проблема, указанное выше исправление отлично сработало для меня...

Для моего приложения API, работающего в IIS: мне пришлось назначить следующие разрешения для папки журнала для IIS_IUSRS. Мне не нужен был абсолютный путь!

Другие вопросы по тегам