繁体   English   中英

Serilog 未登录到 SQL 服务器

[英]Serilog not logging to SQL Server

在我的 .NET Core 3.1 项目中,我安装了 Serilog 并尝试遵循所有实施细节,但由于某种原因,它没有登录到 SQL 服务器表。

这是代码 - Web API 程序:

public class Program
{
    public static void Main(string[] args)
    {
        try
        {
            var iWebHost = CreateHostBuilder(args).Build();
            var path = Directory.GetCurrentDirectory();
            var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
            var configuration = new ConfigurationBuilder()
                .SetBasePath(path)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environmentName}.json", optional: true)
            .Build();

            var logger = new LoggerConfiguration()
                .Enrich.FromLogContext()
                .ReadFrom.Configuration(configuration)
                .CreateLogger();

            Log.Logger = logger;
            iWebHost.Run();
        }
        catch (Exception exception)
        {
            Log.Fatal(exception, "Error starting");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

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

appsettings.json 和 appsettings.development.json

{
"Serilog": {
    "Using": [ "Serilog.Sinks.MSSqlServer" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "System": "Warning",
        "Microsoft": "Warning"
      },
      "WriteTo": [
        {
          "Name": "MSSqlServer",
          "Args": {
            "connectionString": "Server=localhost; Initial Catalog=GP; User ID=lc; Password=lc",
            "tableName": "Log"
          }
        }
      ]
    }
  }
}

这是我的主要 controller

public class MainController : ControllerBase
{
    private readonly ILogger<MainController> _logger;

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

这是我想从中写入日志的 controller:

public async Task<ResponseBase> GetAsync(RequestBase request)
{
    _logger.LogInformation("in controller");
    // other code
    // return;
}

这是我的日志实体

public class Log
{
    public int Id { get; set; }
    public string Message { get; set; }
    public string MessageTemplate { get; set; }
    public string Level { get; set; }
    public DateTimeOffset TimeStamp { get; set; }
    public string Exception { get; set; }
    public string Properties { get; set; }
    public string LogEvent { get; set; }
}

您的代码在 Serilog 的配置之前调用UseSerilog() 这意味着应用程序以默认的、未配置的记录器结束。 您可以通过使用内联初始化UseSerilog重载配置 Serilog 来避免这种情况,该重载提供对 HostingContext 的访问。 从链接的文档:

.UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
    .ReadFrom.Configuration(hostingContext.Configuration)
    .Enrich.FromLogContext()
    .WriteTo.Console())

这会从配置中读取 Serilog 的设置添加控制台记录器,确保即使配置不正确,您也会收到日志消息。

没有理由单独创建配置。 CreateDefaultBuilder()将当前目录设置为根目录并添加appsettings文件。 要扩展此功能,请在CreateDefaultBuilder()之后使用ConfigureHostConfigurationConfigureAppConfiguration

CreateHostBuilder应更改为:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
            .ReadFrom.Configuration(hostingContext.Configuration)
            .Enrich.FromLogContext()
            .WriteTo.Console());

Main是:

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

如果你想在构建主机之前使用记录器,你应该在调用UseSerilog()之前创建它:

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

    try
    {
        CreateHostBuilder(args).Run();
    }
    catch (Exception exception)
    {
        Log.Fatal(exception, "Error starting");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM