Serilog没有写入文件(.net core 2.2)

问题描述 投票:5回答:1

我正在编写一个使用Serilog的Web服务。我在写文件时遇到问题(但是控制台记录工作正常)。我注意到当.net core 2.0基于thisthis页面的解释而出现时,设置发生了变化。

但是,现在,我看不到任何记录(可能在过去,默认的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();
    }

我的appsettings.json在root中有这个部分:

"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"
    }
  },

请注意,%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");
    }

然而,在ASP.NET Core Web Server窗口中没有显示任何内容,并且在运行服务时我的机器上没有创建文件。

我错过了一些明显的东西吗

c# logging .net-core serilog
1个回答
7
投票

结果我错误地从文档中复制了一些JSON。这很难说,但在最初的问题中,我实际上有EnrichWriteToProperties部分嵌入在MinimumLevel部分。

显然这阻止了Serilog正确地知道要写入哪个Sink。

这是我更正的设置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" 
    } 
  },

请注意,我还从文件名中删除了{Date}。显然,如果你将滚动间隔设置为白天,它将会解决这个问题....

© www.soinside.com 2019 - 2024. All rights reserved.