【问题标题】:Serilog setup for Asp.Net Core 2.0.1 not producing logsAsp.Net Core 2.0.1 的 Serilog 设置不生成日志
【发布时间】:2017-11-27 12:51:25
【问题描述】:

我正在尝试在使用 Asp.Net Core 2.0.1、EF 2.0.1 和 MVC 6 的多项目解决方案中将 Serilog 设置为我的记录器。

我已经设置了 Serilog,主要遵循这篇博文中的指南 Set up Serilog post

该帖子中的 json 存在问题,我已更正并在此处显示

appsettings.json 文件

{
"ApplicationConfiguration": {
  "ConnectionStrings": {
    "DevelopmentConnection": "Server=(localdb)\\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"      
  },      
  "ApplicationInfo": {
    "VersionNumber": "1.0.0",
    "Author": "Jimbo",
    "ApplicationName": "CustomTemplate",
    "CreatedOn": "November 20, 2017"
  },
  "Serilog": {
    "Using": [
      "Serilog.Sinks.RollingFile",
      "Serilog.Sinks.Async",
      "Serilog.Sinks.ApplicationInsights",
      "Serilog.Sinks.Console",
      "Serilog.Sinks.Seq"
    ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "RollingFile",
              "Args": { "pathFormat": "Logs/log-{Date}.log" }
           }
          ]
        }
      }
    ],
    "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
    "Properties": {
      "Application": "CustomTemplate" 
    }
  }
}
}

我在 Program.cs 的 Main 方法中有记录器配置工作

public static int Main(string[] args)
{
    var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); 

    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();

    //Configure logger
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        //do this for now
        //TODO:figure out how to add to Serilog config in appsettings.json
        .WriteTo.Seq("http://localhost:5341")
        .CreateLogger();

    Log.Information("Logger created");

    try
    {
        Log.Information("Starting web host");
        BuildWebHost(args).Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Web Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        Log.CloseAndFlush();
    }
    //BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

在我的启动方法中

services.AddLogging(loggingBuilder =>
            loggingBuilder.AddSerilog(dispose: true));

我假设 Serilog 会在我运行应用程序后创建 Logs 文件夹,但没有 Log 文件夹或日志。我在解决方案的根目录和 Web 应用程序项目中都添加了一个 Logs 文件夹,然后再次运行它。没有日志。博客文章作者建议查看机器根文件夹。我查看了 C 和 OneDrive 主文件夹(存储在 OneDrive 上的解决方案文件),但那里也没有日志。

然后我注意到堆栈跟踪警告

发生 System.IO.FileNotFoundException H结果=0x80070002 Message=未找到配置文件“appsettings.json”且不是可选的。物理路径为“C:\Users\OneDrive\TestingConfigurationAspNetCore2\TestMvcApp\bin\Debug\netcoreapp2.0\appsettings.json”。 来源= 堆栈跟踪: 在 Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(布尔重新加载) 在 Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() 在 Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 提供者) 在 Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()

我之前收到此警告,这就是为什么我在配置设置中添加了 set bath path 方法,因为应用程序在代码行失败

.AddJsonFile("appsettings.json")

这很明显,因为在 bin 文件夹中,该文件不称为 appsettings.json,而是称为 TestMvcApp.runtimeconfig.json。

一旦我添加了 .SetBasePath,代码就会运行,所以我在配置设置后放置了一个断点。配置对象包含我的 appsettings.json 文件中的所有设置,那么为什么我会收到堆栈跟踪错误?我不知道,但我敢打赌,这就是没有日志的原因(控制台中也没有出现日志消息)

任何关于为什么堆栈跟踪错误或为什么没有日志消息写入日志文件或显示在控制台上的帮助将不胜感激。

【问题讨论】:

  • 这一行.WriteTo.Seq("http://localhost:5341") 表示您不是在写入日志文件,而是写入日志服务器。这是正确的/你的意图吗?
  • 我补充说,当滚动日志没有写入时,我是否可以在那里写入。他们也不去那里
  • 除非我错了,否则 Serilog 应该写入配置中定义的所有 WriteTo
  • BuildHost 中缺少 UseSerilog

标签: c# json logging asp.net-core-2.0 serilog


【解决方案1】:

这很明显,因为 bin 文件夹中的文件不是 叫appsettings.json,它叫TestMvcApp.runtimeconfig.json。

TestMvcApp.runtimeconfig.json 不是你的appsettings.json,它是一个运行时配置文件,从文件名中可以​​看出。

我敢打赌,您的appsettings.json 在构建过程中不会被复制到输出目录中。要修复在 Visual Studio 解决方案资源管理器中选择 appsettings.json,请在上下文菜单中选择属性并将“复制到输出目录”设置为“始终复制”或“如果较新则复制”:

你的 json 配置也有几个问题:

  1. Serilog 部分不应在 ApplicationConfiguration 部分内。它应该在同一级别,即顶级部分。
  2. 您还有一个可疑的 WriteTo 部分,其中一个接收器 (RollingFile) 在另一个接收器 (Async) 中。在此处查看 sample json configuration 以获取 Serilog。
  3. 为了使用所有这些接收器(Serilog.Sinks.RollingFileSerilog.Sinks.Console),您应该安装相应的接收器 NuGet:Serilog.Sinks.RollingFileSerilog.Sinks.Console 等。

这里是适合我的配置文件(仅带有 RollingFile 接收器):

{
    "ApplicationConfiguration": {
        "ConnectionStrings": {
            "DevelopmentConnection": "Server=(localdb)\\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"
        },
        "ApplicationInfo": {
            "VersionNumber": "1.0.0",
            "Author": "Jimbo",
            "ApplicationName": "CustomTemplate",
            "CreatedOn": "November 20, 2017"
        }
    },
    "Serilog": {
        "Using": [
            "Serilog.Sinks.RollingFile"
        ],
        "MinimumLevel": {
            "Default": "Information",
            "Override": {
                "Microsoft": "Warning"
            }
        },
        "WriteTo": [
            {
                "Name": "RollingFile",
                "Args": { "pathFormat": "c:\\log-{Date}.log" }
            }
        ],
        "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
        "Properties": {
            "Application": "CustomTemplate"
        }
    }
}

【讨论】:

  • @CodeFuller...清除了堆栈跟踪错误,我删除了 SetBasePath 并且它正在运行应用程序,它正在将所有设置填充到配置中,但仍然没有日志文件(我删除了Logger 配置中的 WriteTo.Seq)
  • 我加回了 WriteTo.Seq,我在 SEQ 中得到了日志,但仍然没有在控制台或日志文件中
  • @CodeFuller...将 Serilog 部分移出 ApplicationConfiguration 就可以了。现在一切正常..TYVM ...作为说明,我的 Serilog 部分工作正常。 WriteTo 告诉异步接收器写入滚动文件
【解决方案2】:

接受的答案只记录了我项目的一些消息。我不确定为什么。 Ondrej Balas's approach 对我来说效果更好。

安装这些 Nuget 包:

  • Serilog
  • Serilog.AspNetCore
  • Serilog.Settings.Configuration
  • Serilog.Sinks.Console
  • Serilog.Sinks.RollingFile

Program.cs需要.UseSerilog()添加:

    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>

        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            })
            .UseStartup<Startup>()
            .UseSerilog()
            .Build();

Startup.cs 需要进行一些更改

构造函数中的一个:

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

        Configuration = configuration;
    }

Configure()中的另一个:

    loggerFactory.AddSerilog();

    if (env.IsDevelopment())
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    }

appsettings.json 需要 root 中的 Serilog 配置条目:

"Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft": "Warning",
            "System": "Warning"
        }
    },
    "WriteTo": [
        { "Name": "Console" },
        {
            "Name": "RollingFile",
            "Args": {
                "pathFormat": "logs\\log-{Date}.log",
                "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}"
            }
        }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Properties": {
        "Application": "My Application"
    }
}

【讨论】:

  • ...“appsettings.json 需要根目录下的 Serilog 配置条目”...如果您阅读已接受答案中的最后一条评论,您就会明白这一点
猜你喜欢
  • 2017-05-10
  • 2018-05-14
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多