PostgreSQL 的 pg_current_logfile 函数
pg_current_logfile() 是 PostgreSQL 9.6 版本引入的一个系统管理函数,用于获取当前正在使用的日志文件路径。
一 基本用法
1 函数定义
pg_current_logfile([text]) → text
2 简单查询
-- 获取当前日志文件路径
SELECT pg_current_logfile();
-- 示例输出(取决于你的配置):
/*
pg_current_logfile
--------------------
log/postgresql-15-main.log
*/
二 参数说明
1 可选参数
可以指定日志文件类型(PostgreSQL 15+支持):
-- 获取特定类型的日志文件
SELECT pg_current_logfile('stderr'); -- 标准错误日志
SELECT pg_current_logfile('csvlog'); -- CSV格式日志
2 返回值
- 返回当前日志文件的相对路径(相对于数据目录)
- 如果没有启用日志记录,返回 NULL
- 如果指定了不存在的日志类型,返回 NULL
三 应用示例
1 查看完整日志路径
-- 结合数据目录获取完整路径
SELECT setting || '/' || pg_current_logfile() AS full_log_path
FROM pg_settings
WHERE name = 'data_directory';
-- 示例输出:
/*
full_log_path
---------------------------------
/var/lib/postgresql/15/main/log/postgresql-15-main.log
*/
2 日志轮转监控
-- 创建日志文件监控表
CREATE TABLE IF NOT EXISTS logfile_monitor (
check_time timestamp PRIMARY KEY,
logfile_path text,
log_size bigint
);
-- 记录日志状态
INSERT INTO logfile_monitor
SELECT now(),
pg_current_logfile(),
pg_stat_file(pg_current_logfile()).size;
3 自动化日志分析
-- 检查日志文件是否存在
SELECT pg_current_logfile() IS NOT NULL AS logging_enabled;
-- 与日志配置参数关联查询
SELECT name, setting, unit
FROM pg_settings
WHERE name IN ('logging_collector', 'log_directory', 'log_filename')
UNION ALL
SELECT 'current_logfile', pg_current_logfile(), null;
四 配置要求
要使 pg_current_logfile() 正常工作,必须满足以下条件:
启用日志收集器:
-- 检查是否启用 SHOW logging_collector; -- 如果为off,需要在postgresql.conf中设置: -- logging_collector = on -- 然后重启或重载配置 SELECT pg_reload_conf();
正确配置日志参数:
# postgresql.conf 示例配置 log_directory = 'log' # 相对于数据目录 log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_rotation_age = 1d # 每天轮转 log_rotation_size = 100MB # 或按大小轮转
五 常见问题解决
1 返回NULL的可能原因
-- 诊断步骤
SELECT name, setting
FROM pg_settings
WHERE name IN ('logging_collector', 'log_destination', 'log_directory', 'log_filename');
-- 可能原因:
-- 1. logging_collector = off
-- 2. log_destination 不包含 stderr 或 csvlog
-- 3. 日志文件被手动删除
2 权限问题
-- 检查日志文件权限
SELECT * FROM pg_stat_file(pg_current_logfile());
-- 如果出现权限错误,需要确保:
-- 1. PostgreSQL用户对日志目录有读写权限
-- 2. 日志文件存在且可访问
3 日志轮转后的问题
-- 检查是否有多个活动日志文件
SELECT * FROM pg_ls_logdir() ORDER BY modification DESC;
-- 如果日志已轮转但函数仍返回旧文件,可能需要等待后台更新
六 与其他函数的结合使用
1 与 pg_read_file 结合
-- 读取日志最后100行(需要超级用户权限)
SELECT pg_read_file(
pg_current_logfile(),
GREATEST(0, pg_stat_file(pg_current_logfile()).size - 10000),
10000
) AS log_tail;
2 与 pg_stat_file 结合
-- 获取日志文件详细信息
SELECT * FROM pg_stat_file(
(SELECT setting FROM pg_settings WHERE name = 'data_directory') ||
'/' || pg_current_logfile()
);
七 版本注意事项
PostgreSQL 9.6-14:
- 函数无参数,只能返回主日志文件路径
- 返回值总是相对于数据目录
PostgreSQL 15+:
- 支持可选参数指定日志类型
- 增强了对多种日志类型的支持
云托管服务:
- AWS RDS/Aurora、Google Cloud SQL等可能限制此函数的使用
- 通常提供自己的日志访问机制
通过合理使用 pg_current_logfile()
函数,可以方便地实现PostgreSQL日志的自动化监控和管理,特别是在需要分析实时日志或构建监控系统时非常有用。