Windows-Service 中的 Serilog 未写入日志文件

Posted

技术标签:

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

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

最好的问候 戈佩

【问题讨论】:

我也遇到了同样的问题,您有机会找到解决方案吗? 【参考方案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();

【讨论】:

以上是关于Windows-Service 中的 Serilog 未写入日志文件的主要内容,如果未能解决你的问题,请参考以下文章

Windows下配置Redis多实例

windows下安装多个Redis实例

redis作为windows服务运行

在 WCF 中使用 Serilog

使用表达式自定义Serilog输出格式

Redis