【环球速看料】logging 模块因权限问题写入日志失败

来源:博客园 时间:2023-06-02 23:25:10

哈喽大家好,我是咸鱼

今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过


(资料图片)

1.案例现象

今天上班的时候手机短信收到了 zabbix 告警,但是发现了不对劲的地方:微信没有收到告警信息,按理说短信跟微信应该是同时收到告警信息的

咸鱼这边的 zabbix 是通过一个 python 脚本实现连接微信接口并向微信发送告警消息

上 zabbix 看看 action log

发现 zabbix 发送告警到微信的操作执行失败了,报错如下:

Traceback (most recent call last):  File "/home/zabbix/alert.py", line 24, in     logger = create_logger(log_path)  File "/home/zabbix/alert.py", line 10, in create_logger    file_handler = logging.FileHandler(log_path)  File "/usr/lib64/python3.9/lib/python3.9/logging/__init__.py", line 1142, in __init__    StreamHandler.__init__(self, self._open())  File "/usr/lib64/python3.9/lib/python3.9/logging/__init__.py", line 1171, in _open    return open(self.baseFilename, self.mode, encoding=self.encoding,PermissionError: [Errno 13] Permission denied: "/var/log/myapp/myapp_20230525.log"
2.定位问题

在开始定位前先介绍一下 zabbix 发送告警信息到微信的流程:

zabbix 调用 /home/zabbix/alert.py脚本实现告警信息发送到微信/home/zabbix/alert.py脚本的大体逻辑就是首先通过 logging 模块将告警内容写进本地日志,然后返回一个 logger 对象再将 logger 对象以及其他参数传进 send_msg函数里面,将告警信息发送到微信端

python 脚本 alert.py中创建并写入日志文件的代码如下:

import loggingimport time......def create_logger(log_path):    # 创建一个 logger 对象    logger = logging.getLogger(__name__)    logger.setLevel(logging.DEBUG)    # 创建一个文件处理器,将日志写入指定的文件中    file_handler = logging.FileHandler(log_path)    file_handler.setLevel(logging.DEBUG)    # 创建一个格式化器,定义日志的格式    formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")    file_handler.setFormatter(formatter)    # 将文件处理器添加到 logger 对象中    logger.addHandler(file_handler)    return loggerif __name__ == "__main__":    log_path = "/var/log/myapp/myapp_%s.log" % time.strftime("%Y%m%d", time.localtime())    logger = create_logger(log_path)...

看报错信息里面有 PermissionError,首先定位到应该是权限问题

看下这个日志文件的信息

[root@localhost /var/log/myapp]# ll /var/log/myapp/myapp_20230525.log-rw-r--r-- 1 root root 300 5月  25 14:09 /var/log/myapp/myapp_20230525.log

可以看到属主属组都是 root,其他用户只有读的权限

我们再来看一下 zabbix 进程

[root@localhost /var/log/myapp]# ps -ef | grep [z]abbixzabbix    31076      1  0 3月16 ?       00:00:00 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf

可以看到 zabbix 进程是 zabbix 用户启动的,因为 /var/log/myapp/myapp_20230525.log的权限是644且属主属组都是 root

所以说 zabbix 用户调用 alert.py脚本时发现写入日志因为没有权限而失败,导致脚本运行崩溃

3.排查问题

到这里基本就能知道是什么原因了,但是还有一点疑问:只有 /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

如何解决:修改一下日志文件的属主属组即可

chown zabbix.zabbix /var/log/myapp/myapp_20230525.log

X 关闭

【环球速看料】logging 模块因权限问题写入日志失败

哈喽大家好,我是咸鱼今天跟大家分享一个使用Python的logging模块写入日志文件时遇到的权限问题,不知道你

2023-06-02

win10微软拼音怎么卸载(微软拼音输入法怎么关闭)

导读综合小编来为大家讲解下win10微软拼音怎么卸载,微软拼音输入法怎么关闭这个很多人还不知道,现在让我们

2023-06-02

iphone12如何截屏发微信(iPhone12如何截屏) 世界热消息

想必现在有很多于iPhone12如何截屏方面的知识都比较想要了解,那么小编就为大家收集了一些Phone12如何截屏方面的

2023-06-02

大禹节水: 关于2021年限制性股票激励计划首次授予部分第二个解除限售期及预留授予部分第一个解除限售期解除限售条件未成就暨回购注销部分限制性股票的公告

大禹节水:关于2021年限制性股票激励计划首次授予部分第二个解除限售期及预留授予部分第一个解除限售期解除

2023-06-02

益阳高新区:打造国内一流的区域性先进碳基复合材料基地

6月1日,益阳高新区召开推进先进碳基材料产业集群工作会议,来自区先进碳基产业集群成员企业负责人及行业专

2023-06-02

华南理工大学2011年录取分数线_华南理工大学2011年录取分数线|要闻

1、不知楼主问的是本科还是研究生,投档线楼上有说了,外省的可以通过查自己省份的投档线。2、招生网一般都

2023-06-02

月子脚上长水泡怎么办_脚上长水泡怎么办

1、脚上的水泡需要先诊断。湿疹除水疱外,常伴有红斑、斑丘疹、丘疹性疱疹、糜烂和渗出。外用可给予糖皮质

2023-06-02

以“妈妈岗”助力灵活就业扩面升级

近日,继深圳肯德基宣布所属区域公司店数突破700家后,肯德基“社区友好主题餐厅”在妇儿大厦启动。走进该

2023-06-02

2022年中国平均霾日数为19.1天 较近5年平均减少5.8天

中新社北京6月2日电(记者陈溯)中国气象局国家气象中心2日发布的《2022年大气环境气象公报》(简称“公报”)

2023-06-02

进口新车报道:全新吉利帝豪将于3季度内上市 新车风阻0.27Cd

你想了解最新最前沿的汽车资讯吗?你想了解进口汽车的最新相关报道吗?对于买车的朋友们来说了解到一手汽车

2023-06-02

Copyright ©   2015-2023 京津冀科技网版权所有  备案号:京ICP备2022022245号-12   联系邮箱:434 922 62 @qq.com