首页 文章

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

提问于
浏览
5

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

我已经设置了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方法中有 Logger 配置工作

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消息=未找到配置文件'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")

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

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

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

2 回答

  • 0

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

    TestMvcApp.runtimeconfig.json 不是你的 appsettings.json ,它从文件名中清除's a runtime configuration file as it' .

    我打赌你的 appsettings.json 在构建期间不会被复制到输出目录 . 要在Visual Studio Solution Explorer中修复选择 appsettings.json ,请在上下文菜单中选择属性并将'Copy to Output Directory'设置为'Copy always'或'Copy if newer':

    您的json配置还有几个问题:

    • Serilog 部分不应该在 ApplicationConfiguration 部分内 . 它应该在同一级别,即顶级部分 .

    • 您还有一个可疑的WriteTo部分,其中一个接收器( RollingFile )位于另一个接收器( Async )内 . 在这里查看sample json configuration for Serilog .

    • 为了使用所有这些接收器( Serilog.Sinks.RollingFileSerilog.Sinks.Console ),您应该安装相应的接收器NuGets: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"
            }
        }
    }
    

    enter image description here

  • 4

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

    Install 这些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"
        }
    }
    

相关问题