pm2按日期切割日志
发布于 9 年前 作者 virgl 17635 次浏览 最后一次编辑是 8 年前 来自 分享

使用pm2管理node应用的进程时,进程运行期间的日志会一直往一个文件中写入。 默认的情况下会写入~/.pm2/logs/xxx-id.out 和 ~/.pm2/logs/xxx-id.err中,我们可以在向pm2注册该应用时,手动指定日志路径和文件 例如: 应用启动文件为app.js 首次注册该应用,pm2 start app.js --name myapp -o ./logs/myapp.out -e ./logs/myapp.err 这样就会在当前目录下的logs目录中生成myapp.out 和 myapp.err两个文件,日志将会写入这两个文件中。 但是一旦应用的日志量很大,长时间运行必然会使myapp.out这个文件无限增大。 打开日志文件很慢,日志跟踪也越来越麻烦。 一般理想的做法是按日期去分割日志,但是目前的pm2好像没有提供这项功能(不知道是否有大神知道如何配置),我们只好通过某种机制去实现按日期写日志。

我使用的系统是centos, 可以配合定时任务管理器crontab实现。 基本的思想是在每天某一个时间,例如凌晨3点钟,将上一天的日志改成,以上一天时间命名的日志文件中,然后新建一个日志文件,然后让pm2将日志文件重新定位到新的日志文件中

首先,需要一个切分日志的脚本cutlog.sh CURPATH=pwd LOGPATH=$CURPATH/logs logFile=$LOGPATH/myapp.out yesterday=date -d last-day '+%Y%m%d' logOfLastDay=$LOGPATH/$yesterday’.log’ mv $logFile $logOfLastDay touch $logFile pm2 reloadLogs

然后注册定时任务 使用crontab -e编辑定时任务 先声明必要的环境变量 SHELL=/bin/bash PATH=/bin:/usr/bin:/usr/local/bin

0 3 * * * sh cutlog.sh (使用cutlog.sh的绝对路径) 表示每天凌晨三点钟执行分割日志的脚本 然后重启crond服务

13 回复

pm2 reloadLogs, 移动日志后还需要重启pm2?

这样的移动日志会造成部分信息部属于切割的日期吧?

同问,按这个切割,那0点到3点的日志应该归到前一天了?

@youqingkui 应该不会重启PM2吧,那肯定影响正常服务了啊, 看他是PM2 redloadLogs,是重载日志了。

@youqingkui pm2 reloadLogs 不会重启pm2,不会对中断活动的进程的。如果日志活动很频繁的话,确实可能会造成部分日志属于被切割的日志,所以在某个业务不是特别频繁的时间去切割应该可以避免的。

@imhered 对 是这样的 当天的日志还是在.out文件中

@virgl 明白了,谢谢!

@imhered 恩,才发现有这个命令。谢谢!

@imhered 不会影响正常服务的,不会造成node进程重启的

@virgl 有个问题问一下,你这个是只能针对一个node进程吧,要是我用PM2的clusr启动的话,有点不好处理吧

@imhered sorry 在cluster下还没有试过。。在cluster下pm2会生成多个日志吗?

@virgl 是的,一个进程一个日志文件。不过把你这个脚本改进下就可以了。

回到顶部