【问题标题】:Serilog in Windows-Service not writing to logfileWindows-Service 中的 Serilog 未写入日志文件
【发布时间】:2014-12-21 17:25:55
【问题描述】:

我在 TopShelf 服务中使用 Serilog,记录到控制台和滚动文件。在控制台中运行服务时,我的消息被写入日志文件,但是当我安装服务并运行它时,不会发生日志记录。我需要配置什么特别的东西吗?该文件将写入“.\logs\log-{date}.txt”下的二进制文件夹。

最好的问候 戈佩

【问题讨论】:

  • 我也遇到了同样的问题,您有机会找到解决方案吗?

标签: windows-services topshelf serilog


【解决方案1】:

我有一个非常相似的问题。就我而言,问题在于相对路径。 我只需要指定绝对路径。现在它就像一个魅力。

WriteTo.RollingFile(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\log-{Date}.log")

希望对你有帮助!

【讨论】:

  • <appSettings>配置中,你还可以在路径中使用%TEMP%之类的环境变量——将日志放在%APPDATA%或类似的目录下可以很好地工作。
  • 完美运行。谢谢
【解决方案2】:

我们遇到了同样的问题,这是我们发现的:

  • Serilog 配置为滚动日志文件和写入 Seq
  • Drable 日志已启用。

症状 - 没有创建日志文件 - 没有日志写入 Seq。

根据@gdoten 的评论,我们的日志文件正在被写入 \windows\syswow64(服务作为本地服务运行)。
我们认为这些文件的权限可能不允许读取持久假脱机文件,导致没有日志写入 Seq。

修复是对滚动日志文件和缓冲区的路径进行硬编码。

【讨论】:

  • 我的实际上是在 Windows\System32
【解决方案3】:
 loggerFactory.AddFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log-{Date}.txt"));

试试这个,它在我的 ASP.NET core 2 应用程序中作为 Windows 服务运行

【讨论】:

  • 如何在 appsettings.json 中指定应用域路径?
  • 亲爱的@kudlatiger,这里是例子。/r/e var myDomainPath = Configuration["domainPath"]; loggerFactory.AddFile(Path.Combine(myDomainPath, "ApiLog-{Date}.txt")); appsettings.json "domainPath": "myDomainPath",
【解决方案4】:

运行服务的帐户很可能没有写入日志文件位置的权限。尝试将日志文件位置更改为系统的临时文件夹,看看是否是这种情况。

如果仍然失败,最好使用 Serilog 的 SelfLog 获取异常信息。

【讨论】:

  • 您好,尼古拉斯,感谢您的回复。该服务作为 LocalSytem 运行,并具有目录的完全权限(不包括特殊权限)。我目前使用 Log4Net 只是因为它在控制台和服务中工作。一旦我将 Logging 类更改为 SeriLog,它就不会在作为服务运行时写入甚至创建日志文件。仍然在控制台模式下它可以工作...... o_o 我会尝试检查 SelfLog,谢谢你的提示!
  • 我发现当我的服务在此处登录时:<add key="serilog:write-to:RollingFile.pathFormat" value="ServerServiceApp-{Date}.log" />C:\Windows\SysWOW64 结尾,这显然是服务首次启动时的当前目录。仅供参考。
【解决方案5】:

我也遇到过类似的问题,因为下面的代码,

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

【讨论】:

    【解决方案6】:

    我作为 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"
            }
        }
    }
    

    【讨论】:

    • 我在使用 Windows 服务和配置设置时也遇到了这个问题。原来这个问题与权限无关。相反(使用来自上述线程的线索来启用 selflog),显示运行时无法找到各种接收器(控制台、文件)的程序集。我不得不在 Serilog 配置中添加一个新部分:“使用”:[“Serilog.Sinks.Console”、“Serilog.Sinks.File”、“Serilog.Enrichers.Environment”]。见github.com/serilog/serilog-settings-configuration。我不知道为什么 Windows 服务在查找程序集方面有所不同。
    【解决方案7】:

    你也可以使用这样的东西(当你想创建一个 Windows 服务和 Serilog 时):

    var builder = new ConfigurationBuilder()
               .AddJsonFile($@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\appsettings.json", optional: true, reloadOnChange: true)
               .AddEnvironmentVariables();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多