如何使用Serilog在asp.net core中的同一控制器类中将日志数据拆分为文件和数据库?

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

我正在尝试使用 Serilog 来满足我的 ASP.NET Core Web 应用程序的日志记录要求。 我对这两个框架都是新手。 我真的很想了解如何配置记录器,以便我可以同时将*单独的数据记录到文件和数据库接收器(例如从同一控制器类中)。 我尝试在互联网上进行研究,因为我读到 Serilog 有一个很好的文档,但我未能找到满足我的要求的确切配置。

有人对另一个与多个接收器相关的 stackoverflow 问题提出了建议这里

我尝试执行以下操作:

 public static void Main(string[] args)
 {
        var logger1 = new LoggerConfiguration()
            .WriteTo.File("Logs\\system_.log", rollingInterval: RollingInterval.Day)
                .CreateLogger();

        var logger2 = new LoggerConfiguration()
           .WriteTo.MSSqlServer(connectionString,
            sinkOptions: new MSSqlServerSinkOptions { TableName = "logs" })
               .CreateLogger();

        logger1.Information("hello to file");
        logger2.Information("hello to database"); 

        CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseSerilog();

这部分有效,我能够分别在日志文件和数据库(Sql 服务器)中看到不同的日志,但现在我不知道如何从控制器类内部使用这两个配置。

由于我的控制器类中的以下代码不会在任何接收器中记录任何内容

 public class UserController : ControllerBase
{        
    private ILogger<UserController> _logger;

    public UserController(ILogger<UserController> logger)
    {           
        _logger = logger;
        _logger.LogInformation("Writing to log file with INFORMATION severity level.");            
        _logger.LogWarning("Writing to log file with WARNING severity level.");
        _logger.LogError("Writing to log file with ERROR severity level.");
        
    }

任何建议都会非常有帮助,提前致谢。

asp.net-core serilog
1个回答
0
投票

有点迟了,但对于那些和我一样寻找同样东西的开发者来说。 您可以在配置中添加额外的行“WriteTo”。一个例子:

 string conn = config.GetConnectionString("DefaultConnection") ?? string.Empty;

 var sinkOpts = new MSSqlServerSinkOptions();
 sinkOpts.TableName = "Logging";
 sinkOpts.AutoCreateSqlTable = true;

 builder.Host.UseSerilog((ctx, lc) => lc
                 .MinimumLevel.Fatal()
                 .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Fatal)
                 .Enrich.FromLogContext()
                 .WriteTo.File(Path.Combine(logPath, "log.txt"),
                         outputTemplate: "{Timestamp:dd/MM/yyyy HH:mm:ss} {Level:u15}   Class: {SourceContext:l, 50}{NewLine}          {Message:lj}{NewLine}          {Exception}",
                         rollingInterval: RollingInterval.Month, fileSizeLimitBytes: 10000000)
                 .WriteTo.MSSqlServer(
                         connectionString: conn,
                         sinkOptions: sinkOpts
                         ));

您必须添加 MSSQL 和文件的接收器才能使其工作。 Conn 不能为空,因为它是在代码的其他部分中检查的。代码中的 logPath 也设置得更高。

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