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. Мне не нужен был абсолютный путь!