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
相关产品推荐
相关产品推荐

