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();