如何在Unix/Linux下创建symlink指向最新PostgreSQL滚动日志
实现PostgreSQL最新日志自动软链接方案
场景说明
应用日志会持续滚动生成,文件名遵循postgresql-yyyy-mm-dd_hhmmss.log命名规则,目录下现有日志文件如下:
-rw-------. 1 root root 331 Jun 1 22:04 postgresql-2022-06-01_220333.log.gz -rw-------. 1 root root 417 Jun 1 22:04 postgresql-2022-06-01_220430.log.gz -rw-------. 1 root root 289 Jun 2 19:28 postgresql-2022-06-02_000000.log.gz -rw-------. 1 root root 26802 Jun 2 19:50 postgresql-2022-06-02_192809.log.gz -rw-------. 1 root root 8440 Jun 2 23:57 postgresql-2022-06-02_195044.log.gz -rw-------. 1 root root 15016 Jun 3 11:22 postgresql-2022-06-03_000000.log.gz -rw-------. 1 root root 291 Jun 3 11:24 postgresql-2022-06-03_112405.log.gz -rw-------. 1 root root 336 Jun 3 11:25 postgresql-2022-06-03_112553.log.gz -rw-------. 1 root root 397 Jun 3 11:27 postgresql-2022-06-03_112714.log.gz -rw-------. 1 root root 358 Jun 3 11:29 postgresql-2022-06-03_112901.log.gz -rw-------. 1 root root 493 Jun 3 11:30 postgresql-2022-06-03_113031.log.gz -rw-------. 1 root root 418 Jun 3 11:34 postgresql-2022-06-03_113354.log.gz -rw-------. 1 root root 419 Jun 3 11:39 postgresql-2022-06-03_113920.log.gz -rw-------. 1 root root 416 Jun 3 11:44 postgresql-2022-06-03_114437.log.gz -rw-------. 1 root root 417 Jun 3 11:49 postgresql-2022-06-03_114943.log.gz -rw-------. 1 root root 419 Jun 3 11:55 postgresql-2022-06-03_115530.log.gz -rw-------. 1 root root 16961 Jun 3 23:56 postgresql-2022-06-03_120047.log.gz -rw-------. 1 root root 35470 Jun 4 23:56 postgresql-2022-06-04_000000.log.gz -rw-------. 1 root root 406059 Jun 5 17:56 postgresql-2022-06-05_000000.log
需要在Unix/Linux环境下实现:日志目录下自动创建软链接,始终指向当前正在写入的最新日志文件,最终效果如下:
postgres.LOG -> postgresql-2022-06-05_000000.log
实现后无需每次执行ls查找最新日志文件名,直接打开postgres.LOG即可查看实时日志内容。
实现脚本
编写轻量shell脚本完成软链接更新,逻辑说明:
- 已滚动完成的历史日志会被压缩为
.gz后缀,正在写入的活跃日志一定是未压缩的.log后缀 - 日志文件名自带精确到秒的时间戳,按文件名字典序排序取最后一个即为最新日志,比按文件修改时间判断更可靠,不会因为文件属性被误改导致指向错误
- 软链接更新时强制覆盖,避免已存在链接导致创建失败
脚本内容(保存为update_pg_log_symlink.sh):
#!/bin/bash # 替换为你的PostgreSQL日志实际存放目录 PG_LOG_DIR="/var/log/postgresql" SYMLINK_NAME="postgres.LOG" # 进入日志目录,目录不存在则直接退出 cd "$PG_LOG_DIR" || exit 1 # 查找最新的未压缩日志文件 LATEST_LOG=$(ls -1 postgresql-*.log 2>/dev/null | sort | tail -n 1) # 没找到日志文件直接退出 if [ -z "$LATEST_LOG" ]; then exit 0 fi # 创建/更新软链接:-n 避免链接指向目录时出现嵌套问题,-f 强制覆盖已存在的链接 ln -snf "$LATEST_LOG" "$SYMLINK_NAME"
使用方式
- 把脚本中
PG_LOG_DIR的值修改为你实际的日志存储路径 - 给脚本添加执行权限:
chmod +x update_pg_log_symlink.sh - 手动执行一次脚本,在日志目录下执行
ls -l postgres.LOG即可验证软链接是否正确指向最新日志 - 配置定时任务自动更新:执行
crontab -e添加如下行,设置为每分钟执行一次,保证日志滚动后软链接自动更新
* * * * * /你的脚本存放路径/update_pg_log_symlink.sh
内容的提问来源于stack exchange,提问作者kdas
相关产品推荐
相关产品推荐

