最近遇到一个比较严重的问题,某一天的凌晨时分,运营人员反馈,某个线上系统全部无法访问,当时正在家中昏昏欲睡,收到消息后脑子瞬间惊醒。遂登陆后台查看得知,深夜11点多日志正常,但几分钟后的第二日凌晨却全部over了。于是想到和之前某次遇到的问题相似,经过排查发现,果然是日志权限问题。经过梳理,问题如下:
由于系统中有定时任务自动执行,而启动定时任务时是非www用户,同时该任务中含有写日志的部分(按天生成日志),此时目录下尚无当日的日志,于是生成了权限为非www用户的日志文件,当后续www用户操作需要写日志时,就没有写入的权限了,因此后续程序全部被中断。
经过比较,解决方案如下:
第一种,取消正在运行的定时任务,指定执行定时任务的用户为www用户,重新启动定时任务;
第二种,为了不影响线上业务,不取消定时任务,用脚本定时检查日志文件是否对www开放写入权限,如果没有则加入;
第三种,利用laravel日志中的channel功能,在www用户需要写入日志的地方,指定channel写入,不与定时任务产生的日志文件相冲突。