哈喽大家好,我是咸鱼
今日跟大家共享一个运用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过
案例现象
今日上班的时候手机短信收到了 zabbix 告警,可是发现了不对劲的当地:微信没有收到告警信息,按理说短信跟微信应该是同时收到告警信息的
咸鱼这边的 zabbix 是经过一个 python 脚本完成连接微信接口并向微信发送告警音讯
上 zabbix 看看 action log
发现 zabbix 发送告警到微信的操作执行失败了,报错如下:
定位问题
在开端定位前先介绍一下 zabbix 发送告警信息到微信的流程:
-
zabbix 调用
/home/zabbix/alert.py
脚本完成告警信息发送到微信 -
/home/zabbix/alert.py
脚本的大体逻辑便是首要经过 logging 模块将告警内容写进本地日志,然后返回一个 logger 目标 -
再将 logger 目标以及其他参数传进
send_msg
函数里面,将告警信息发送到微信端
python 脚本 alert.py
中创立并写入日志文件的代码如下
看报错信息里面有 PermissionError
,首要定位到应该是权限问题
看下这个日志文件的信息
能够看到属主属组都是 root,其他用户只有读的权限
咱们再来看一下 zabbix 进程
能够看到 zabbix 进程是 zabbix 用户发动的,由于 /var/log/myapp/myapp_20230525.log
的权限是644且属主属组都是 root
所以说 zabbix 用户调用 alert.py
脚本时发现写入日志由于没有权限而失败,导致脚本运行溃散
处理问题
到这儿根本就能知道是什么原因了,可是还有一点疑问:只有 /var/log/myapp/myapp_20230525.log
这个日志的属主属组都是 root ,其余日志文件都是 zabbix
咱们知道,在 Python 的 logging 模块中,日志文件的属主是由操作系统的文件系统决定的,而不是由 logging 模块自身决定
当运用 logging 模块创立日志文件时,它会运用操作系统供给的默许文件创立方式
这意味着日志文件的属主将取决于当时运行 Python 程序的用户或进程的权限和身份。
看样子应该是有人运用 root 用户执行过这个 python 脚本,导致生成的这个日志文件 myapp_20230525.log
属主是 root,后面等 zabbix 自己去执行这个脚本(zabbix 用户)的时候发现没有权限写东西进 myapp_20230525.log
里面,这才导致微信收不了告警信息
后面拷打了一下搭档(其实是执行了 history
命令看操作记录 )才知道昨夜搭档在终端上手动跑了一下这个 python 脚本,又由于默许登录用户是 root,导致生成的日志文件属主属组都是 root
怎么处理: 修正一下日志文件的属主属组即可
感谢阅览, 喜爱作者就动动小手 [ 一键三连] ,这是我写作最大的动力