想象一下,你在搞数据库,处理一堆事务,结果突然出问题了。用户抱怨,业务方着急,你却根本不知道到底发生了啥。这时候,靠谱的错误日志就派上用场了。它能帮你:
- 把错误存到数据库里,方便后面分析。
- 轻松还原错误细节:啥时候出的错、错误信息和相关数据。
- 通过分析日志,发现常见错误,优化你的代码。
简单说,日志就像你数据库的监控摄像头:哪里出问题、啥时候出问题,一目了然。
创建 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;
p_error_message— 输入参数,传错误文本。p_context— 可选参数,传点额外数据。默认是NULL。INSERT INTO error_log (error_message, context)— 新增一条日志到error_log。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;
- 检查除法: 执行
result := a / b。如果b = 0,PostgreSQL 会抛division_by_zero异常。 - 异常处理器 (
EXCEPTION) 捕获错误。 - 在处理器里,我们调用
log_error,把错误和参数都写进日志表。 - 写完日志后,用
RAISE EXCEPTION再抛个新错误,让用户也能收到提示。
调用例子:
SELECT divide_numbers(10, 0);
结果:
- 用户会看到错误:
无法将 10 除以 0 — 除数为零。 error_log表里会多一条“除以零”的记录。
GO TO FULL VERSION