Serilog в Windows-Service не записывает в logfile
Я использую Serilog в службе TopShelf, регистрируясь на консоли и в скользящем файле. При запуске службы в консоли мои сообщения записываются в файл журнала, но когда я устанавливаю службу и запускаю ее, запись не происходит. Есть ли что-то особенное, что мне нужно настроить? Файл записывается в папку двоичных файлов в разделе ".\Logs\log- {date}.txt".
С уважением
Gope
Ответы
Ответ 1
У меня была очень похожая проблема. В моем случае проблема была связана с относительными путями.
Мне просто нужно было указать абсолютный путь. Теперь это работает как шарм.
WriteTo.RollingFile(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\log-{Date}.log")
Надеюсь, что это поможет!
Ответ 2
У нас была та же проблема, вот что мы нашли:
- Serilog настроен для сканирования журналов и записи в Seq
- Разрешены журналы Ddrable.
Симптомы
- Файлы журналов не создавались
- В Seq не записано никаких журналов.
В соответствии с комментарием @gdoten наши файлы журналов записывались в \windows\syswow64 (служба выполнялась как localservice).
Мы полагаем, что разрешения на эти файлы могут не разрешить чтение файла продолжительной записи спула, в результате чего журналы не записываются в Seq.
Исправлено было жесткое кодирование пути файла rolllog и буфера.
Ответ 3
loggerFactory.AddFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log-{Date}.txt"));
Попробуйте это, он работал в моем приложении ASP.NET Core 2 как служба Windows
Ответ 4
Скорее всего, учетная запись, под которой работают службы, не имеет права на запись в расположение файла журнала. Попробуйте изменить расположение файла журнала в системную папку temp, чтобы убедиться, что это так.
Если это все еще не удается, использование Serilog SelfLog
для получения информации об исключениях - ваш лучший выбор.
Ответ 5
Я работаю в качестве службы Windows, и вот мой файл JSON.
{
"Serilog": {
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "C:\\Program Files\\mycomp\\myapp\\logs\\log-{Date}.txt"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentUserName", "WithProcessId" ],
"Properties": {
"Application": "MyApp",
"Environment": "Development"
}
}}
-Gina
Ответ 6
У меня была похожая проблема, она заканчивается, потому что следующий код,
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
код задает файл appsettings.json, и в этом файле он имеет настройки конфигурации serilog, но при запуске в службе текущая папка не указывает на папку исполняемого файла. поэтому он не может найти файл appsettings.json, и тогда, конечно, serilog не будет работать, как ожидалось.
просто нужно изменить код, как это сделает следующее
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(AppDomain.CurrentDomain.BaseDirectory + "\\appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();