Asil.Net Core 2.0.1的Serilog设置不生成日志

din*_*tom 5 c# logging json serilog asp.net-core-2.0

我正在尝试使用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" 
    }
  }
}
}
Run Code Online (Sandbox Code Playgroud)

我在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();
Run Code Online (Sandbox Code Playgroud)

在我的启动方法中

services.AddLogging(loggingBuilder =>
            loggingBuilder.AddSerilog(dispose: true));
Run Code Online (Sandbox Code Playgroud)

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

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

发生System.IO.FileNotFoundException HResult = 0x80070002消息=未找到配置文件'appsettings.json'且不是可选的.物理路径是'C:\ Users\OneDrive\TestingConfigurationAspNetCore2\TestMvcApp\bin\Debug \netcoreapp2.0\appsettings.json'.Source = StackTrace:位于Microsoft的Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()的Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(布尔重新加载),位于Microsoft的Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1提供程序). Extensions.Configuration.ConfigurationBuilder.Build()

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

.AddJsonFile("appsettings.json")
Run Code Online (Sandbox Code Playgroud)

这是相当明显的,因为在bin文件夹中该文件不称为appsettings.json,其名为TestMvcApp.runtimeconfig.json.

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

有关堆栈跟踪错误的原因或为什么没有日志消息写入日志文件或显示在控制台上的任何帮助将是最受欢迎的.

Cod*_*ler 4

这是相当明显的,因为在 bin 文件夹中该文件不名为 appsettings.json,而是名为 TestMvcApp.runtimeconfig.json。

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

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

另外你的 json 配置有几个问题:

  1. Serilog部分不应位于ApplicationConfiguration部分内。它应该位于同一级别,即顶级部分。
  2. 您还存在可疑的 WriteTo 部分,其中一个接收器 ( RollingFile) 位于另一个接收器 ( Async) 内。检查此处Serilog 的示例 json 配置
  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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述