【问题标题】:Serilog not working from configuration in asp.net core 2.2 APISerilog 无法从 asp.net core 2.2 API 中的配置工作
【发布时间】:2019-01-18 20:32:11
【问题描述】:
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>();
}


public class Startup
{
    public IContainer Container { get; private set; }
    public Startup(IConfiguration configuration)
    {
        Log.Warning("test");
        Configuration = configuration;
    }

}

appsettings.json

{
    "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Default": "Information",
        "Microsoft": "Information",
        "System": "Information"
      }
    },
    "WriteTo": [

      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "C:\\test.txt",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
          "restrictedToMinimumLevel": "Information"
        }
      }
    ]
  },

  "AllowedHosts": "*"
}

我已经安装了所有的包

  • Serilog,
  • Serilog.AspCore,
  • Serilog.Settings.Configuration,
  • Serilog.Sink.File

【问题讨论】:

  • 您找到解决方案了吗?我刚刚将我的应用程序从 ASP.NET Core 2.1 更新到 2.2,现在 Serilog 不再记录了。
  • @Shamshiel 我打了同样的 2.1 到 2.2。墙。你找到解决方案了吗?
  • @AngryHacker 对我来说,问题是我添加到我的 csproj 文件中的“InProcess”属性。迁移文档中建议使用它。据我了解,如果您将此属性添加到项目文件中,则 Serilog 在 IIS 进程中运行,并且可能无权在某处写入日志。我刚刚删除了该属性,它又可以工作了!
  • @Shamshiel 我也这样做了,但问题是你会失去性能 - 如果你有一个重型站点,这很重要。解决方案是this
  • @AngryHacker 我没有使用 IIS 来托管我的应用程序,所以我不确定性能损失是否适用于我。

标签: c# asp.net-core serilog


【解决方案1】:

您的配置适用于RollingFile,但您的软件包列表显示Serilog.Sinks.File。这些是不同的。您需要添加 Serilog.Sinks.RollingFile 包,它应该可以开始工作了。

如果您想使用File 接收器(正如@Kirk 在 cmets 中提到的,现在是推荐的选项),那么您需要将设置更改为

"WriteTo": [
    {
        "Name": "File",
        "Args": {
            "path": "C:\\test.txt",
            "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
            "restrictedToMinimumLevel": "Information"
        }
    }

注意

对于File 接收器,pathFormat 应该是 path

Serilog File Sink Documentation

【讨论】:

  • Serilog.Sinks.File 实际上现在也是推荐的选项,因为它有自己改进的滚动文件功能。
  • 我按照您的说法尝试了您的建议和配置,但仍然没有写入任何内容。我知道记录器实际上可以工作,因为当我使用 .FromFile 而不是来自配置时它可以工作,所以配置中有些东西是关闭的
【解决方案2】:

这不是答案,而是观察。 我在这里观察到了一个明确的问题。我有三个设置文件。

  1. appsettings.json,
  2. appsettings.Development.json,
  3. appsettings.VivekDev.json

我从 launchSettings.json 中选择了配置文件,这样环境就是 VivekDev,如下所示。

"ASPNETCORE_ENVIRONMENT": "VivekDev"

现在,当我在 appsettings.VivekDev.json 中有以下设置而 appsettings.json 中没有任何 Serilog 设置时,一切正常。

  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "log.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  },

但是当我有

"Serilog": {
  "WriteTo": [ "Debug" ]
},

appsettings.json 中,这会以某种方式覆盖 appsettings.VivekDev.json 中的设置。 据我了解,这是不正确的,appsettings.VivekDev.json 内部的设置应该覆盖 appsettings.json

只有在文件接收器的情况下才会发生这种情况。如果我使用其他接收器(例如控制台),那么事情会按预期工作。那就是 appsettings.VivekDev.json 中的 serilog 设置正确地覆盖了 appsettings.json 的 serilog 设置。

这里肯定有问题。

到目前为止,我已经删除了 appsettings.json 中的 serilog 设置,并将 serilog 写入文件设置保留在 appsettings.VivekDev.json 中。

【讨论】:

    【解决方案3】:

    问题似乎是直接写入 c: 而不是在配置中使用 File 似乎不起作用,但写入不同的目录有效。

    这是遇到此问题的任何人的最终解决方案

    程序.cs

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
    
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                  WebHost.CreateDefaultBuilder(args)
                      .UseStartup<Startup>()
                      .UseSerilog();
    }
    

    Startup.cs

    public Startup(IConfiguration configuration)
    {
            var logConfiguration = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration);
    
            Log.Logger = logConfiguration.CreateLogger();
            Configuration = configuration;
    
    }
    

    appsettings.json

    "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:\\temp\\log.txt",
          "rollingInterval": "Day"
        }
      }
    ]
    

    }

    【讨论】:

    • 是的。 Windows 对 C: 施加了安全权限。在我的测试中,我完全删除了驱动器号,忘记更改我发布的设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多