Serilog в ASP.NET Core Windows Service не может записать файл как локальная система - PullRequest
13 голосов
/ 05 июня 2019

Я использую веб-сервер ASP.NET Core в качестве службы Windows и использую Serilog для входа в файл в% PROGRAMDATA%.Когда я запускаю службу как локальная система, ничего не регистрируется.

Я использую .Net Core 2.2 в Windows 10. Я тестирую, вызывая в своем сервисе ошибку, которая записывает событие журнала на уровне ошибки.Я попытался запустить службу в качестве моей собственной учетной записи администратора, и запись в журнал работает нормально;проблема возникает только при работе в качестве локальной системы.

У меня есть другие службы Windows, использующие .Net Framework, которые работают как локальная система и у меня нет проблем с записью в% PROGRAMDATA% с Serilog, но я впервыепопробовал на .Net Core.Я могу вручную создать и записать в файл журнала внутри службы с помощью Directory.CreateDirectory и File.AppendText, который работает при работе в качестве локальной системы, но запись в журнал Serilog не выполняется.

Вот мой Program.Main:

public static async Task Main(string[] args)
{
    var isService = !(Debugger.IsAttached || args.Contains("--console"));       
    if (isService)
    {
        var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
        var pathToContentRoot = Path.GetDirectoryName(pathToExe);
        Directory.SetCurrentDirectory(pathToContentRoot);
    }

    var host = WebHost.CreateDefaultBuilder(args.Where(arg => arg != "--console").ToArray())
        .UseStartup<Startup>()
        .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
            .ReadFrom.Configuration(hostingContext.Configuration)
            .Enrich.FromLogContext())
        .Build();

    // additional async initialization omitted

    if (isService)
    {
        host.RunAsService();
    }
    else
    {
        host.Run();
    }
}

А вот раздел Serilog моего appsettings.json:

"Serilog": {
  "MinimumLevel": {
    "Default": "Verbose",
    "Override": {
      "Microsoft": "Warning",
      "System": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "File",
      "Args": {
        "path": "%PROGRAMDATA%/foo/bar baz/logs/qux.log",
        "fileSizeLimitBytes": 1048576,
        "rollOnFileSizeLimit": "true",
        "retainedFileCountLimit": 99,
        "flushToDiskInterval": "00:00:01",
        "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
      }
    },
    {
      "Name": "Console",
      "Args": {
        "outputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
      }
    }
  ]
}

Я ожидал, что запись в журнал будет записана в файл в% PROGRAMDATA%, когда служба работает как локальнаяСистема, но ничего не происходит.Ведение журнала ведется без проблем, когда служба запускается как любая другая административная учетная запись.

1 Ответ

2 голосов
/ 14 июня 2019

Если я не правильно понял, это интересно с правами системы аккаунта:

Локальная системная учетная запись «local admin» совпадает с учетной записью администратора.

если у вас есть администратор домена и у вас есть локальный администратор. Оба в значительной степени имеют одинаковую функцию.

Если вы являетесь частью домена, вы, как правило, не хотите входить в свой компьютер в качестве администратора домена.

Вы всегда хотите использовать локальную учетную запись администратора, если можете. Причина этого в том, что на вашем компьютере может быть вирус, и вы входите в систему как администратор домена, которому вы только что открыли дверь для вируса во всей вашей сети

Если вам нужно написать в% PROGRAMDATA%, вы должны дать разрешение и использовать его следующим образом https://stackoverflow.com/a/30792263/914284

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...