CodeGym /课程 /SQL SELF /为自动记录错误创建 error_log 表

为自动记录错误创建 error_log 表

SQL SELF
第 52 级, 课程 2
可用

想象一下,你在搞数据库,处理一堆事务,结果突然出问题了。用户抱怨,业务方着急,你却根本不知道到底发生了啥。这时候,靠谱的错误日志就派上用场了。它能帮你:

  • 把错误存到数据库里,方便后面分析。
  • 轻松还原错误细节:啥时候出的错、错误信息和相关数据。
  • 通过分析日志,发现常见错误,优化你的代码。

简单说,日志就像你数据库的监控摄像头:哪里出问题、啥时候出问题,一目了然。

创建 error_log

咱们先从基础开始。得先建个表,专门用来存错误信息。这个表有这些字段:

  • id — 错误的唯一标识。
  • error_message — 错误文本。
  • error_time — 出错的时间。
  • (可选) context — 错误上下文,如果你想存点详细信息。
CREATE TABLE error_log (
    id SERIAL PRIMARY KEY,        -- 错误的唯一标识
    error_message TEXT NOT NULL,  -- 错误信息文本
    error_time TIMESTAMP NOT NULL DEFAULT NOW(), -- 出错时间
    context JSONB                 -- 错误的额外数据
);

这里都干了啥?

  • id SERIAL PRIMARY KEY — 这个字段会自动给每条记录分配唯一ID。
  • error_message TEXT NOT NULL — 这里存错误文本,不能为空。
  • error_time TIMESTAMP NOT NULL DEFAULT NOW() — 记录事件发生的时间。不填的话,默认就是当前时间,靠 DEFAULT NOW() 实现。
  • context JSONB — 可选字段,能存点额外信息,比如出错时的操作数据啥的。

执行完 CREATE TABLE 后,你的数据库就有了存日志的结构。

往表里写错误的例子

表建好了,咱们来点实操:把错误信息写进表。我们写个函数,把错误文本和时间存到 error_log 里。

写错误日志的函数例子

CREATE OR REPLACE FUNCTION log_error(p_error_message TEXT, p_context JSONB DEFAULT NULL)
RETURNS VOID AS $$
BEGIN
    INSERT INTO error_log (error_message, context)
    VALUES (p_error_message, p_context);
END;
$$ LANGUAGE plpgsql;
  1. p_error_message — 输入参数,传错误文本。
  2. p_context — 可选参数,传点额外数据。默认是 NULL
  3. INSERT INTO error_log (error_message, context) — 新增一条日志到 error_log
  4. DEFAULT NULL — 如果没传 context,这字段就是 NULL

现在你要写个错误日志,只要这样调用函数:

SELECT log_error('执行查询时出错', '{"query": "SELECT * FROM data"}');

这样就会往 error_log 表里加一条新记录。

自动记录错误日志

每次都手动 SELECT log_error(...) 太麻烦了。咱们用异常处理把这事自动化。

带异常处理的函数例子:

CREATE OR REPLACE FUNCTION divide_numbers(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    result NUMERIC;
BEGIN
    -- 试着做除法
    result := a / b;

    -- 返回结果
    RETURN result;
EXCEPTION
    WHEN division_by_zero THEN
        -- 记录错误日志,带上上下文
        PERFORM log_error('除以零', jsonb_build_object('a', a, 'b', b));
        -- 抛出异常给用户
        RAISE EXCEPTION '无法将 % 除以 % — 除数为零', a, b;
END;
$$ LANGUAGE plpgsql;
  1. 检查除法: 执行 result := a / b。如果 b = 0,PostgreSQL 会抛 division_by_zero 异常。
  2. 异常处理器 (EXCEPTION) 捕获错误。
  3. 在处理器里,我们调用 log_error,把错误和参数都写进日志表。
  4. 写完日志后,用 RAISE EXCEPTION 再抛个新错误,让用户也能收到提示。

调用例子:

SELECT divide_numbers(10, 0);

结果:

  • 用户会看到错误:无法将 10 除以 0 — 除数为零
  • error_log 表里会多一条“除以零”的记录。
2
任务
SQL SELF, 第 52 级, 课程 2
已锁定
向 error_log 表插入一条错误记录
向 error_log 表插入一条错误记录
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION