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

.NET Core Web API中实现异常日志写入PostgreSQL数据库

将异常日志写入PostgreSQL的分步指南

Hey there! Since you already have the exception catching part sorted out, let's build on that and get those logs stored in your PostgreSQL database. Here's a straightforward approach using Entity Framework Core with the Npgsql provider:


1. 准备异常日志实体类与数据库上下文

先创建一个用来存储异常日志的实体类,以及对应的数据库上下文:

// 异常日志实体类
public class ExceptionLog
{
    public int Id { get; set; }
    public string? Message { get; set; }
    public string? StackTrace { get; set; }
    public string? RequestPath { get; set; }
    public DateTime Timestamp { get; set; }
}

// 自定义数据库上下文
public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

    public DbSet<ExceptionLog> ExceptionLogs { get; set; }
}

2. 注册数据库上下文(在Startup.cs中)

首先安装Npgsql.EntityFrameworkCore.PostgreSQL NuGet包,然后在服务配置中注册DbContext:

// 在Startup.cs的ConfigureServices方法中
services.AddDbContext<AppDbContext>(options =>
    options.UseNpgsql(Configuration.GetConnectionString("PostgresConnection")));

记得在appsettings.json中配置你的PostgreSQL连接字符串:

"ConnectionStrings": {
    "PostgresConnection": "Host=your_host;Database=your_db;Username=your_user;Password=your_pass"
}

3. 修改异常处理中间件,写入数据库

把你现有的异常处理代码修改一下,注入DbContext并将异常信息保存到数据库:

app.UseExceptionHandler(a => a.Run(async context =>
{
    var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
    var exception = exceptionHandlerPathFeature.Error;
    var requestPath = exceptionHandlerPathFeature.Path;

    // 从请求服务中获取数据库上下文实例
    var dbContext = context.RequestServices.GetRequiredService<AppDbContext>();

    try
    {
        // 构建日志实体并填充数据
        var log = new ExceptionLog
        {
            Message = exception.Message,
            StackTrace = exception.StackTrace,
            RequestPath = requestPath,
            Timestamp = DateTime.UtcNow
        };

        // 添加到数据库并保存更改
        dbContext.ExceptionLogs.Add(log);
        await dbContext.SaveChangesAsync();
    }
    catch (DbUpdateException dbEx)
    {
        // 处理数据库写入失败的情况,避免因为日志报错导致请求崩溃
        Console.WriteLine($"Failed to save exception log: {dbEx.Message}");
    }

    // 保留你原来的错误响应逻辑
    var result = JsonConvert.SerializeObject(new { error = exception.Message });
    context.Response.ContentType = "application/json";
    await context.Response.WriteAsync(result);
}));

4. 创建迁移并更新数据库

打开Package Manager Console或者终端,运行以下命令来生成数据库表:

# 创建迁移文件
Add-Migration InitialCreateExceptionLogs

# 执行迁移,在数据库中创建ExceptionLogs表
Update-Database

一些额外小建议:

  • 考虑用后台异步任务写入日志(比如IHostedService),避免阻塞请求响应
  • 可以给ExceptionLog添加更多字段,比如请求方法、认证用户ID等,方便后续排查
  • 定期清理旧的异常日志,防止数据库表体积过大

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:00:54