Serilog未写入文件(.net core 2.2)

Kil*_*ine 6 c# logging serilog .net-core

我正在编写使用Serilog的Web服务。我在使文件写出来时遇到问题(但控制台日志记录有效)。我注意到,基于以及页面的说明,.net core 2.0发行时,设置发生了变化。

但是,现在,我看不到任何日志记录(也许过去默认的M $记录器实际上就是我所看到的)。

以下是如何program.cs设置:

public class Program
    {
        public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .AddUserSecrets<Startup>()
            .Build();

        public static int Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(Configuration.GetSection("Serilog"))
                .CreateLogger();

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

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>()
                   .UseConfiguration(Configuration)
                   .UseSerilog()
                   .Build();
    }
Run Code Online (Sandbox Code Playgroud)

我的appsettings.json在根目录中包含以下部分:

"Serilog": {
    "Using" : ["Serilog.Sinks.Console", "Serilog.Sinks.File"], 
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      },
      "Enrich" :  ["FromLogContext"],
      "WriteTo":  [
        {"Name": "Console" },
        {"Name": "Debug" },
        {"Name": "File", "Args":  {"path": "%LogDir%\\sampleapp\\log-{Date}.txt", "rollingInterval":  "Day", "shared": true }  }
      ] 
    },
    "Properties": {
      "Application": "sampleapp"
    }
  },
Run Code Online (Sandbox Code Playgroud)

请注意,这%LogDir%是我机器上的一个环境变量,在其他应用程序中可以很好地解析。该路径已创建,并且Logs文件夹具有此应用程序使用的凭据的完整RW权限。

我这样称呼日志记录...

    private readonly ILogger<PartnerController> _logger;
    private readonly IPartnerDao _partnerDao;

    public PartnerController(ILogger<PartnerController> logger, IPartnerDao partnerDao)
    {
        _logger = logger;
        _partnerDao = partnerDao;
    }

    [HttpGet]
    [Route("{titleCode}")]
    public async Task<IActionResult> Get(string titleCode)
    {
        _logger.LogInformation("Test logging");
    }
Run Code Online (Sandbox Code Playgroud)

但是,以某种方式在ASP.NET Core Web Server窗口中什么也没有显示,并且在运行服务时在我的机器上没有创建文件。

我是否缺少明显的东西?

Kil*_*ine 8

原来我从文档中错误地复制了一些JSON。这很难说,但原来的问题我实际上有EnrichWriteToProperties嵌入内的部分MinimumLevel章节。

显然,这阻止了Serilog正确知道要写入哪个接收器。

这是我的更正设置JSON:

"Serilog": {
    "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": ["FromLogContext"],
    "WriteTo": [
      { "Name": "Console" },
      { "Name": "Debug" },
      {
        "Name": "File",
        "Args": {
          "path": "%LogDir%\\sampleapp\\log-.txt",
          "rollingInterval": "Day",
          "shared": true
        }
      }
    ],
    "Properties": {
      "Application":  "sampleapp" 
    } 
  },
Run Code Online (Sandbox Code Playgroud)

请注意,我还{Date}从文件名中删除了。显然,如果将滚动间隔设置为天,则可以继续使用...。


Ros*_*sim 7

appsettings.Development.json 覆盖设置appsettings.json

我再次重复,配置appsettings.Development.json优先appsettings.json. 我知道这听起来很明显,但我敢打赌,将来有人会像我一样忽略这一点。

我花了将近一个小时摸不着头脑,为什么没有将日志写入文件,后来才注意到我只Console沉入了我的沉没appsettings.Development.json(有效地移除了我的File沉没appsettings.json!)。

以下是正确配置的示例(根据您的需要进行修改):

ASP.NET 核心 3.1

程序.cs

using Microsoft.AspNetCore.Hosting;
using Serilog;
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog.Core;

namespace My.App
{
    public class Program
    {
        private static bool IsDevelopment =>
            Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";

        public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true)
            .AddEnvironmentVariables()
            .Build();

        public static Logger Logger { get; } = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .Enrich.FromLogContext()
            .CreateLogger();

        public static int Main(string[] args)
        {
            Log.Logger = Logger;

            try
            {
                Log.Information("Starting...");
                var host = CreateHostBuilder(args).Build();                      
                host.Run();                        
                return 0;
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
                return 1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var host = Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .UseServiceProviderFactory(
                    new AutofacMultitenantServiceProviderFactory(Startup.ConfigureMultitenantContainer))
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                        .UseContentRoot(Directory.GetCurrentDirectory())
                        .UseIISIntegration()
                        .UseStartup<Startup>();
                });

            return host;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ASP.NET 核心 2.2

程序.cs

public class Program
{
    public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();

    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .Enrich.FromLogContext()
            .CreateLogger();

        try
        {
            Log.Information("Starting...");
            CreateWebHostBuilder(args).Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IWebHost CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseSerilog()
            .Build();
}
Run Code Online (Sandbox Code Playgroud)

appsettings.json

{  
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
  }
}
Run Code Online (Sandbox Code Playgroud)

appsettings.Development.json

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "Console"
            },
            {
              "Name": "Debug"
            },
            {
              "Name": "DiagnosticTrace"
            },
            {
              "Name": "File",
              "Args": {
                "path": "/home/log/api-log-.txt",
                "rollingInterval": "Day",
                "retainedFileCountLimit": 7,
                "buffered": true
              }
            }
          ]
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

appsettings.Production.json

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "ApplicationInsights",
              "Args": {
                "restrictedToMinimumLevel": "Information",
                "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
              }
            },
            {
              "Name": "Email",
              "Args": {
                "EmailConnectionInfo": {
                  "EmailSubject": "PRODUCTION error logs",
                  "FromEmail": "xxxxxxx",
                  "ToEmail": "xxxxxxx",
                  "MailServer": "xxxx",
                  "NetworkCredentials": {
                    "username": "xxxxxx",
                    "password": "xxxxxx",
                    "domain": "xxxxx"
                  },
                  "Port": 25
                },
                "restrictedToMinimumLevel": "Error"
              }
            },
            {
              "Name": "File",
              "Args": {
                "path": "/home/log/api-log-.txt",
                "rollingInterval": "Day",
                "retainedFileCountLimit": 15,
                "buffered": true
              }
            }
          ]
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)