Serilog在.NET Core 2.2中无法写入文件

8

附言:下面的代码运行良好。问题出在使用者身上。@jpgrassi提供的答案指引我朝着正确的方向解决了问题。

我在program.cs中有以下代码:

public class Program {
    public static void Main(string[] args) {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
            .UseStartup<Startup>();

}

并且在 appsettings.json 文件中:

{
  "Serilog": {

    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Default": "Information",
        "Microsoft": "Information",
        "System": "Information"
      }
    },

    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "log-{Date}.txt",
        }
      }
    ]
  },

  "AllowedHosts": "*"
}

在控制器中,我记录了一个日志_logger.LogWarning("foo");,但是该文件没有被写入到任何地方,在我的视线范围内也没有任何错误。 我已经从Nuget导入了以下软件包:Serilog、Serilog.AspNetCore、Serilog.Settings.Configuration、Serilog.Sinks.RollingFile。 我错过了什么?

@CamiloTerevinto 我认为不是1或2,因为我使用进程监视器查找文件写入,但根本没有看到任何东西。 - AngryHacker
很抱歉与您的问题完全无关,但是你的“Override”部分在此处是多余的,因为它与默认设置处于同一级别。不过您的配置看起来总体上是合理的。 - rbennett485
@AngryHacker,我的回答有帮助你解决问题吗?我猜应该是有帮助的,因为你已经接受了它..不过只是好奇。 - jpgrassi
@jpgrassi 实际上,这段代码一开始就可以运行,但它默认写入到 c:\program files\iis express 并因权限问题而失败。而且出于某种原因,它在 ProcMon 中没有显示(也许我的过滤器太严格了)。我将日志名称更改为更独特的名称,然后它确实出现在 ProcMon 中了。所以,你的答案帮助我明确了这段代码本身是没有问题的。 - AngryHacker
@CamiloTerevinto 已编辑。 - AngryHacker
显示剩余2条评论
1个回答

6
我发布原始答案时假设问题是Serilog配置中缺少Using属性。在我的项目中,我总是有它,并且这是OP设置中唯一缺少的东西。但是,发布答案后,我尝试了不同的配置选择,包括与问题相同的配置,日志仍然被生成。更多阅读后,我发现Using属性并非必需。来自serilog-settings-configuration包:

(该软件包实现了一种约定,使用DependencyContext查找任何名称中带有Serilog的包,并从中提取配置方法,因此上面的Using示例是冗余的。) 来源:https://github.com/serilog/serilog-settings-configuration

事实证明(请参见问题评论),真正的问题是日志文件位置和写入权限。 从代码方面来说,一切已经工作。

我将保留原始答案,作为历史记录,但其内容实际上并没有修复任何问题,因为一开始就没有破坏任何东西。


原始答案:

我认为问题在于您未在您的appsettings中指定实际使用RollingFile sink。 我只是快速创建了一个新应用程序,并且它可以工作:

  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.RollingFile" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "RollingFile",
        "Args": { "pathFormat": "log-{Date}.txt" }
      }
    ],
    "Properties": {
      "Application": "Sample"
    }
  }

使用以下 NuGet 包:
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Serilog.AspNetCore" Version="2.1.1" />
    <PackageReference Include="Serilog.Settings.Configuration" Version="3.0.1" />
    <PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
    <PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
  </ItemGroup>

这将记录到应用程序根目录中的一个文件log-20190304.txt中。


从技术上讲,你是正确的。但似乎它对OP有所帮助,因为他接受了答案。我以最好的意图回答了它,而且我很诚实,在花费了将近一个小时尝试不同的配置可能性后,它们都起作用了。你建议删除答案还是怎么样?仅仅批评而不提供建议也不会对任何人有所帮助,我认为。 - jpgrassi
同意。我已经编辑并添加了更多的上下文,但是如果它对任何人都没有好处,我也可以将其删除。 - jpgrassi
注释已清理,这里和问题。 - Camilo Terevinto
我的日志文件因某种原因变成只读了。不知道怎么回事。你提到的写入权限提醒我去检查一下,所以感谢你保留了这个答案。 - Eric Eskildsen
我和你的配置是一样的,但日志文件是空的。 - Kate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接