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

时间:2017-11-27 12:51:25

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

我正在尝试使用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     的HResult = 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文件中的所有设置,那么为什么我得到堆栈跟踪错误?我不知道,但我敢打赌,这就是没有日志的原因(控制台中也没有出现日志消息)

有关堆栈跟踪错误原因或没有将日志消息写入日志文件或显示在控制台上的原因的任何帮助都将非常受欢迎。

1 个答案:

答案 0 :(得分:1)

接受的答案仅记录了我的项目的一些消息。我不知道为什么。 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"
    }
}