ITPub博客

首页 > 数据库 > 数据库开发技术 > logging 模块因权限问题写入日志失败

logging 模块因权限问题写入日志失败

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2023-06-02 17:31:00 0 删除 编辑

哈喽大家好,我是咸鱼


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



案例现象


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


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


上 zabbix 看看 action log

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



定位问题


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

  1. zabbix 调用 /home/zabbix/alert.py 脚本实现告警信息发送到微信

  2. /home/zabbix/alert.py 脚本的大体逻辑就是首先通过 logging 模块将告警内容写进本地日志,然后返回一个 logger 对象

  3. 再将 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


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



感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84233