【问题标题】:Serilog Net Core 3.1 not create any log filesSerilog Net Core 3.1 不创建任何日志文件
【发布时间】:2020-04-25 20:40:45
【问题描述】:

我在 .NET Core 3.1 项目中使用 Serilog 进行日志管理。 本项目部署在IIS下的windows服务器上。此外,我有一个文件服务器可用于存储日志文件。 IIS 用户在此文件服务器上具有读取和写入权限,因为已经有其他 Web 应用程序登录此服务器。 服务器在它们之间是可见且可访问的。

我通过以下方式实现了 Serilog:

public class Program 
{
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args) 
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseIISIntegration();
                })
                .ConfigureAppConfiguration((context, builder) =>
                {
                    // Here I recover the configuration correctly
                    var configuration = GetConfiguration();
                })
                .UseSerilog((hostingContext, loggerConfiguration) => 
                {
                     // hostingContext.Configuration.GetLogOuput() is a custom extension methods.
                     var pathLogFile = Path.Combine(hostingContext.Configuration.GetLogOutput(), hostingContext.HostingEnvironment.ApplicationName, "concurrentFlat.json");

                    if (hostingContext.HostingEnvironment.IsDevelopment())
                    {
                        loggerConfiguration
                          .MinimumLevel.Debug()
                          .Enrich.FromLogContext()
                          .Enrich.WithMachineName()
                          .Enrich.WithEnvironmentUserName()
                          .Enrich.WithProcessId()
                          .Enrich.WithProcessName()
                          .Enrich.WithThreadId()
                          .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                          .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                          .WriteTo.Console()
                          .WriteTo.File(
                              path: pathLogFile,
                              formatter: new CompactJsonFormatter(),
                              rollOnFileSizeLimit: true,
                              fileSizeLimitBytes: 10000000
                          );
                    }
                    else
                    {
                        loggerConfiguration
                             .MinimumLevel.Information()
                             .Enrich.FromLogContext()
                             .Enrich.WithMachineName()
                             .Enrich.WithEnvironmentUserName()
                             .Enrich.WithProcessId()
                             .Enrich.WithProcessName()
                             .Enrich.WithThreadId()
                             .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                             .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                             .WriteTo.File(
                                 path: pathLogFile,
                                 formatter: new CompactJsonFormatter(),
                                 rollOnFileSizeLimit: true,
                                 fileSizeLimitBytes: 10000000
                             );
                    }
                });
}

使用开发配置,一切正常,当我尝试模拟应用程序的行为时,总是在我的本地机器上,在生产环境中(将环境变量 ASPNETCORE_ENVIRONMENT 设置为生产),行为是预期的。 此方法:“hostingContext.Configuration.GetLogOutput()”从环境变量中读取文件服务器的路径。我已经验证它是正确的,但没有创建任何文件。

这是我使用 .NET Core ILoggger 接口的代码 sn-p:

using Microsoft.Extensions.Logging;

public class FooController : Controller
{
    private readonly ILogger<FooController> _logger;

    public FooController(ILogger<FooController> logger) 
    {
        _logger = logger;
    }

    public async Task<IActionResult> Get() 
    {
        _logger.LogError("Test Error log");
         return Ok();
    }
}

您知道为什么不在文件服务器上创建日志文件吗?

提前致谢

【问题讨论】:

  • "IIS 用户对该文件服务器有读写权限",哪个用户?请具体。
  • 是一个临时创建的用户,在两台服务器上都具有写入和读取权限。他是一个预先存在的用户。

标签: file asp.net-core iis logging serilog


【解决方案1】:

我已经测试了您的代码,并且看起来运行良好。所以,你可以检查下面的列表,看看有没有和我的不同,

  1. 版本
  <ItemGroup>
    <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
    <PackageReference Include="Serilog.Enrichers.Environment" Version="2.1.3" />
    <PackageReference Include="Serilog.Enrichers.Process" Version="2.0.1" />
    <PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
    <PackageReference Include="Serilog.Extensions.Logging.File" Version="2.0.0" />
  </ItemGroup>
  1. 使用普通日志路径替换为 pathLogFile 变量进行测试
public static class CustomConfigurationExtension
{
    public static string GetLogOutput(this IConfiguration config) => "log";
}  
  1. 为不同环境(DevelopmentProduction 等)设置简单的 appsettings.json 路径以进行测试

Startup.cs

.ConfigureHostConfiguration(config =>
{
    config.SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .AddEnvironmentVariables();
})
  1. 使用此 appsetting.json 进行测试

appsettings.json

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    }
  },
  "AllowedHosts": "*"
}

上面的大多数示例我只是按照 github 中的 serilog EarlyInitializationSample。这是我测试的全部内容。希望有所帮助。

程序.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.UseIISIntegration();
        })
        .ConfigureHostConfiguration(config =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
                .AddEnvironmentVariables();
        })
        .UseSerilog((hostingContext, loggerConfiguration) =>
        {
            var pathLogFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
                hostingContext.Configuration.GetLogOutput(), 
                hostingContext.HostingEnvironment.ApplicationName,
                "concurrentFlat.json"
            );

            if (hostingContext.HostingEnvironment.IsDevelopment())
            {
                loggerConfiguration
                  .MinimumLevel.Debug()
                  .Enrich.FromLogContext()
                  .Enrich.WithMachineName()
                  .Enrich.WithEnvironmentUserName()
                  .Enrich.WithProcessId()
                  .Enrich.WithProcessName()
                  .Enrich.WithThreadId()
                  .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                  .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                  .WriteTo.Console()
                  .WriteTo.File(
                      path: pathLogFile,
                      rollingInterval: RollingInterval.Day,
                      formatter: new CompactJsonFormatter(),
                      rollOnFileSizeLimit: true,
                      fileSizeLimitBytes: 10000000
                  );
            }
            else
            {
                loggerConfiguration
                     .MinimumLevel.Information()
                     .Enrich.FromLogContext()
                     .Enrich.WithMachineName()
                     .Enrich.WithEnvironmentUserName()
                     .Enrich.WithProcessId()
                     .Enrich.WithProcessName()
                     .Enrich.WithThreadId()
                     .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                     .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                     .WriteTo.File(
                         path: pathLogFile,
                         formatter: new CompactJsonFormatter(),
                         rollOnFileSizeLimit: true,
                         fileSizeLimitBytes: 10000000
                     );
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多