【问题标题】:Serilog in ASP.NET Core Windows Service cannot write file as Local SystemASP.NET Core Windows 服务中的 Serilog 无法将文件写入本地系统
【发布时间】:2019-06-14 18:17:16
【问题描述】:

我将 ASP.NET Core Web 服务器作为 Windows 服务运行,并使用 Serilog 登录到 %PROGRAMDATA% 中的文件。当我将服务作为本地系统运行时,没有任何记录。

我在 Windows 10 上使用 .Net Core 2.2。我正在通过触发我的服务中的错误进行测试,该错误会在错误级别写入日志事件。我已经尝试将服务作为我自己的管理帐户运行,并且日志记录工作正常;该问题仅在作为本地系统运行时出现。

我有其他使用 .Net Framework 的 Windows 服务作为本地系统运行,并且使用 Serilog 登录到 %PROGRAMDATA% 没有问题,但这是我第一次在 .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();
    }
}

这是我的 appsettings.json 的 Serilog 部分:

"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% 中的文件,但没有任何反应。当服务作为任何其他管理帐户运行时,日志记录不会出现问题。

【问题讨论】:

  • 不是您问题的直接答案,但在少数情况下适合在管理凭据下运行第三方服务,尤其是 LocalSystem。您可以使用任何其他帐户,包括virtual service account,并为其分配正常运行所需的权限。这比让你的服务作为攻击媒介打开要好得多,以防它里面有任何可利用的东西。
  • Serilog 有一个self log 选项。你试过吗?
  • 勾选创建和管理Windows服务docs.microsoft.com/en-us/aspnet/core/host-and-deploy/…我认为你需要为这个本地用户设置FileSystemAccessRule
  • 我们同时安装了其他服务,以相同的用户帐户运行,并且它们在日志记录方面没有任何问题。不同之处在于其他服务是完整的 .NET 框架,不使用 Serilog。
  • @Matt Casto 你能分享你尝试登录的地方吗?并使用过 NuGet 包?

标签: c# asp.net-core serilog


【解决方案1】:

如果我没有错过 - 理解它对帐户系统权限很感兴趣:

“本地管理员”的本地系统帐户与管理员帐户相同。

如果您有域管理员并且有本地管理员。两者的功能几乎相同。

如果您属于某个域,您通常不希望以域管理员身份登录您的计算机。

如果可以,您总是希望使用本地管理员帐户。这背后的原因是您的计算机上可能有病毒,并且您以域管理员身份登录,您刚刚打开了整个网络病毒的大门

如果您需要写入 %PROGRAMDATA% 那么您应该授予权限并像这样使用https://stackoverflow.com/a/30792263/914284

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 2010-10-15
    • 2015-02-05
    • 2012-01-11
    • 2011-03-19
    • 2018-01-28
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多