You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 2 WebApi 2集成Serilog(含MSSQLServer)技术咨询

ASP.NET Core 2 WebApi 集成 Serilog 到 MSSQL Server 完整指南

看起来你已经迈出了第一步,不过我们可以把配置优化得更符合ASP.NET Core 2的最佳实践,同时确保Serilog能稳定写入MSSQL Server。下面是一步步的调整和验证建议:


1. 确认必要的NuGet包

先确保你安装了所有依赖包(如果还没装全的话):

  • Serilog.AspNetCore:ASP.NET Core与Serilog的核心集成包
  • Serilog.Sinks.MSSqlServer:Serilog的MSSQL日志写入器
  • Serilog.Extensions.Logging:可选,但能更好地兼容框架原生日志接口

你可以通过NuGet包管理器或者CLI安装:

Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.MSSqlServer

2. 优化Serilog配置位置(推荐在Program.cs中配置)

ASP.NET Core 2中,更推荐在Program.cs里初始化Serilog,这样能更早捕获启动阶段的日志,避免Configure方法中可能遗漏的早期错误。修改你的BuildWebHost方法:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        // 集成Serilog,替换默认日志系统
        .UseSerilog((hostingContext, loggerConfig) =>
        {
            loggerConfig
                // 从配置文件读取日志级别等设置(可选但推荐)
                .ReadFrom.Configuration(hostingContext.Configuration)
                // 配置MSSQL写入规则
                .WriteTo.MSSqlServer(
                    connectionString: DbGlobals.DevDatabase,
                    tableName: "Logs",
                    // 自动创建Logs表(首次运行建议开启,后续可根据需求关闭)
                    autoCreateSqlTable: true,
                    // 可选:自定义列映射,比如调整时间戳字段名或格式
                    columnOptions: new ColumnOptions
                    {
                        TimeStamp = new ColumnOptions.TimeStampColumnOptions
                        {
                            ColumnName = "CreatedAt",
                            ConvertToUtc = true
                        }
                    });
        })
        .UseStartup<Startup>()
        .Build();

修改后,你可以把Startup.cs中Configure方法里的Serilog初始化代码删掉,不需要再调用loggerFactory.AddSerilog(log)了。

另外注意:你的Configure方法用了async void,这在ASP.NET Core中是不推荐的,会导致潜在的异步调度问题,应该改成async Task:

public async Task Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 你的中间件配置代码...
}

3. 手动创建Logs表(可选,替代autoCreateSqlTable)

如果你不想让Serilog自动创建表,或者需要自定义表结构,可以手动执行以下SQL脚本创建Logs表:

CREATE TABLE [dbo].[Logs](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Message] [nvarchar](max) NULL,
    [MessageTemplate] [nvarchar](max) NULL,
    [Level] [nvarchar](128) NULL,
    [TimeStamp] [datetimeoffset](7) NOT NULL,
    [Exception] [nvarchar](max) NULL,
    [Properties] [nvarchar](max) NULL,
    [RequestId] [nvarchar](100) NULL, -- 可选:添加请求ID字段便于追踪
    CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ([Id] ASC)
)

4. 在代码中使用Serilog日志

在Controller或服务中,通过依赖注入ILogger<T>来使用日志,和框架默认日志用法完全一致:

[ApiController]
[Route("api/values")]
public class ValuesController : ControllerBase
{
    private readonly ILogger<ValuesController> _logger;

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

    [HttpGet]
    public IActionResult Get()
    {
        // 记录信息日志
        _logger.LogInformation("Processing GET request to /api/values");
        
        try
        {
            // 业务逻辑
            return Ok(new[] { "value1", "value2" });
        }
        catch (Exception ex)
        {
            // 记录带异常详情的错误日志
            _logger.LogError(ex, "Failed to process GET request to /api/values");
            return StatusCode(500);
        }
    }
}

5. 常见问题排查

如果日志没有写入数据库,可以按以下步骤排查:

  • 验证连接字符串:确保DbGlobals.DevDatabase指向的是正确的开发数据库,且应用程序有访问权限
  • 检查数据库权限:确认数据库用户有插入数据到Logs表的权限(如果是自动创建表,还需要创建表的权限)
  • 开启控制台日志调试:在Serilog配置中添加.WriteTo.Console(),这样可以在控制台查看日志是否正常生成,判断是Serilog配置问题还是数据库写入问题
  • 调整日志级别:ASP.NET Core 2默认日志级别是Information及以上,如果你用LogDebug,需要在appsettings.json中调整日志级别:
    {
      "Logging": {
        "LogLevel": {
          "Default": "Debug",
          "Microsoft": "Information",
          "System": "Information"
        }
      }
    }
    

内容的提问来源于stack exchange,提问作者Matthew Flynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:19