Windows services Windows服务中的Serilog未写入日志文件

Windows services Windows服务中的Serilog未写入日志文件,windows-services,topshelf,serilog,Windows Services,Topshelf,Serilog,我在TopShelf服务中使用Serilog,记录到控制台和滚动文件。在控制台中运行服务时,我的消息会写入日志文件,但在安装并运行服务时,不会发生日志记录。我需要配置什么特别的东西吗?该文件将写入“\logs\log-{date}.txt”下的二进制文件文件夹 致意 Gope运行服务的帐户很可能没有写入日志文件位置的权限。尝试将日志文件位置更改为系统的临时文件夹,以查看是否存在这种情况 如果仍然失败,使用Serilog的SelfLog获取异常信息是最好的选择。我也遇到了类似的问题。在我的例子中,

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

致意
Gope

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


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

我也遇到了类似的问题。在我的例子中,问题在于相对路径。 我只需要指定绝对路径。现在它就像一个符咒

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

希望有帮助

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

  • Serilog配置为滚动日志文件并写入Seq
  • 已启用可寻址日志
症状 -未创建任何日志文件 -没有写入Seq的日志

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

修复方法是硬编码rollinglogfile和缓冲区的路径

 loggerFactory.AddFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log-{Date}.txt"));

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

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

我有一个类似的问题,结果是因为下面的代码

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

您也可以使用类似的方法(当您想要创建Windows服务和Serilog时):


你好,尼古拉斯,谢谢你的回复。该服务以LocalSytem运行,并且对该目录拥有完全权限(不包括特殊权限)。我目前使用Log4Net只是因为它在控制台和服务中工作。当我将日志类更改为SeriLog时,它在作为服务运行时不会写入日志文件,甚至不会创建日志文件。仍然在控制台模式下工作。。。o_o我会尝试查看SelfLog,谢谢你的提示!我发现,当我的服务在这里登录时:
它最终位于
C:\Windows\SysWOW64
,这显然是服务首次启动时的当前目录。仅供参考。我也有同样的问题,您是否有机会找到解决方案?在
配置中,您还可以在路径中使用环境变量,如
%TEMP%
,将日志放在
%APPDATA%
或类似的项下可以很好地工作。效果非常好。ThanksHow我可以在appsettings.json中指定应用程序域路径吗?亲爱的@kudlatiger,以下是示例。/r/e
var myDomainPath=Configuration[“domainPath”]
loggerFactory.AddFile(Path.Combine(myDomainPath,“ApiLog-{Date}.txt”)
appsettings.json
“domainPath”:“myDomainPath”
mine实际上在Windows\System32中
var builder = new ConfigurationBuilder()
           .AddJsonFile($@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\appsettings.json", optional: true, reloadOnChange: true)
           .AddEnvironmentVariables();