logging 模块因权限问题写入日志失败
哈喽大家好,我是咸鱼
今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过
1.案例现象
今天上班的时候手机短信收到了 zabbix 告警,但是发现了不对劲的地方:微信没有收到告警信息,按理说短信跟微信应该是同时收到告警信息的
咸鱼这边的 zabbix 是通过一个 python 脚本实现连接微信接口并向微信发送告警消息
上 zabbix 看看 action log

发现 zabbix 发送告警到微信的操作执行失败了,报错如下:
Traceback (most recent call last):
File "/home/zabbix/alert.py", line 24, in <module>
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 logging
import 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 logger
if __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]abbix
zabbix 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
logging 模块因权限问题写入日志失败的更多相关文章
- python 写入日志的问题 UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence
最近,使用python的logging模块,因为这个写入日志写完后就没有管它.在存储日志信息的时候,一直提示: UnicodeEncodeError: 'gbk' codec can't encode ...
- 以打印日志为荣之logging模块详细使用
啄木鸟社区里的Pythonic八荣八耻有一条: 以打印日志为荣 , 以单步跟踪为耻; 很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python ...
- 【转】Python之日志处理(logging模块)
[转]Python之日志处理(logging模块) 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging ...
- Python之日志处理 logging模块
Python之日志处理(logging模块) 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四 ...
- Python 中 对logging 模块进行封装,记录bug日志、日志等级
是程序产生的日志 程序员自定义设置的 收集器和渠道级别那个高就以那个级别输出 日志和报告的作用: 报告的重点在于执行结果(执行成功失败,多少用例覆盖),返回结果 日志的重点在执行过程当中,异常点,哪里 ...
- Python日志输出——logging模块
Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...
- Python模块:日志输出—logging模块
1. logging介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/ ...
- Python入门之logging模块
本章目录: 一.logging模块简介 二.logging模块的使用 三.通过JSON或者YMAL文件配置logging模块 ===================================== ...
- Python学习日记(二十八) hashlib模块、configparse模块、logging模块
hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...
- python3之xml&ConfigParser&hashlib&Subprocess&logging模块
1.xml模块 XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. XML 被设计用来传输和存储 ...
随机推荐
- 第一章 1.1.1节 Kubeadm安装K8S高可用集群
1.1 安装前必读 请不要使用带中文的服务器和克隆的虚拟机. 生产环境建议使用二进制的方式安装. 文档中的IP地址要更换成自己的IP地址,要谨记!!! 1.2 基本环境配置 kubeadm安装方式自1 ...
- Live Home 3D Pro - 用于公寓和房屋的室内设计,支持 3D 实时渲染
Live Home 3D Pro是一个直观的应用程序,用于公寓和房屋的室内设计,以及几乎任何复杂的景观.专业版提供了一套扩展的工具和独特的出口质量. 下载 ► Live Home 3D Pro 下载安 ...
- 基于开源的 ChatGPT Web UI 项目,快速构建属于自己的 ChatGPT 站点
作为一个技术博主,了不起比较喜欢各种折腾,之前给大家介绍过 ChatGPT 接入微信,钉钉和知识星球(如果没看过的可以翻翻前面的文章),最近再看开源项目的时候,发现了一个 ChatGPT Web UI ...
- wpf CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南
CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代.快速且模块化的 MVVM 库.它支持:.NET Standard ...
- 四月二十五号java基础知识
1.注意:无论哪个构造方法,在创建文件输入输出流时都可能银给出的文件名不对.路径不对文件的属性不对等,不能打开文件而造成错误,此时系统会抛出FileNotFoundException异常执行read( ...
- 为什么 APISIX Ingress 是比 Emissary-ingress 更好的选择?
本文从可扩展性和服务发现集成等多个维度对比了 APISIX Ingress 与 Emissary-ingress 的性能. 作者:容鑫,API7.ai 云原生技术工程师,Apache APISIX C ...
- ROS2的安装与使用(超详细图文教程)
ROS2的安装与使用(超详细图文教程) 如果前面的虚拟机以及Ubuntu22.04镜像都安装好了,根据目录直接跳到ROS2的安装. 资料参考于:古月居 VMware虚拟机的安装 安装地址: 对于不了解 ...
- 基于深度强化学习(DQN)的迷宫寻路算法
QLearning方法有着明显的局限性,当状态和动作空间是离散的且维数不高时可使用Q-Table存储每个状态动作的Q值,而当状态和动作时高维连续时,该方法便不太适用.可以将Q-Table的更新问题变成 ...
- 封装统一请求状态返回Result
1.测试数据 public class Test { public static void main(String[] args){ System.out.println("Response ...
- Java线程中断机制
在阅读AQS源码以及juc包很多基于AQS的应用源码过程中,会遇到很多interrupted相关的方法,这里复习一下java线程中断相关. 要点:使用interrupt()中断一个线程,该方法只是标记 ...