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

这篇具有很好参考价值的文章主要介绍了logging 模块因权限问题写入日志失败。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

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

1.案例现象

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

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

上 zabbix 看看 action log
logging 模块因权限问题写入日志失败

发现 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 发送告警信息到微信的流程:

  1. zabbix 调用 /home/zabbix/alert.py 脚本实现告警信息发送到微信
  2. /home/zabbix/alert.py 脚本的大体逻辑就是首先通过 logging 模块将告警内容写进本地日志,然后返回一个 logger 对象
  3. 再将 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

如何解决:修改一下日志文件的属主属组即可文章来源地址https://www.toymoban.com/news/detail-468588.html

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

到了这里,关于logging 模块因权限问题写入日志失败的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安装ms sql server2000提示安装失败详见sqlstp.log日志

    目录 安装ms sql server2000提示安装失败详见sqlstp.log日志 一、可能的情况-其它位置不能有对它的引用 1.1、先安装了Delphi其options-环境变量-其中path中有sql,注册表将其清除 1. 2、注册表搜索-Microsoft SQL Server,全部清除 1. 3、删除失败安装的文件夹 二、不同CPU处理器及其对应的

    2024年02月06日
    浏览(41)
  • docker启动容器失败,然后查看日志,docker logs查看容器出现报错:

    docker 启动 容器失败,然后 docker logs 查看容器出现报错: 在网上看到的 解决方案: 找到你日志文件目录: 删除或者备份一下就就可以看到日志了

    2024年02月03日
    浏览(40)
  • [python]使用标准库logging实现多进程安全的日志模块

    原本应用的日志是全部输出到os的stdout,也就是控制台输出。因其它团队要求也要保留日志文件,便于他们用其他工具统一采集,另一方面还要保留控制台输出,便于出问题的时候自己直接看pod日志。具体需求如下: 日志支持同时控制台输出和文件输出 控制台的输出级别可以

    2024年01月23日
    浏览(35)
  • nginx 查看日志 failed (13: Permission denied) 失败(13:权限被拒绝)解决

    权限被拒绝 用户不一致: 打开  nginx.conf 文件    (一般在  etc/nginx 目录下) 把  nginx 改为 root 用户已经统一,现在可以正常访问了    

    2024年02月15日
    浏览(80)
  • Log4j疯狂写日志问题排查

    最近有个 Java 系统上线后不久就收到了磁盘使用率告警,磁盘使用率已经超过了 90% 以上,并且磁盘使用率还在不停增长。 由于服务器磁盘被打满,导致了系统正常的业务日志无法继续打印,严重影响了系统的可靠性。 刚开始收到磁盘告警的时候,怀疑是日志级别问题,业务

    2024年02月13日
    浏览(64)
  • 【运维知识大神篇】超详细的ELFK日志分析教程7(filebeat常用模块+filebeat采集固定格式日志+自定义日志格式写入ES+EFK架构转ELFK架构+两个业务实战练习)

    本篇文章继续给大家介绍ELFK日志分析,详细请见下面目录。 目录 filebeat采集nginx日志 filebeat模块使用 一、Nginx模块 二、tomcat模块 三、filebeat写数据到ES集群自定义索引 四、filebeat自定义字段之nginx写入ES 五、filebeat自定义字段之tomcat写入ES 六、indices模块实现多个input写入不同

    2024年02月05日
    浏览(41)
  • log4j2同步日志引发的性能问题

    在项目的性能测试中,相关的接口的随着并发数增加,接口的响应时间变长,接口吞吐不再增长,应用的CPU使用率较高。 谁导致的CPU较高,阻塞接口TPS的增长?接口的响应时间的调用链分布是什么样的,有没有慢的点? 1)使用火焰图分析应用的CPU如下,其中log4j2日志占了

    2024年02月08日
    浏览(36)
  • was下log4j设置日志不输出问题

    WAS 也是用的 commons-logging 日志框架 commons-logging 确定 LogFactory 实现的顺序是 从应用的 META-INF/services/org.apache.commons.logging.LogFactory 中获得 LogFactory 实现 从系统环境中获得 org.apache.commons.logging.LogFactory 获得 LogFactory 实现 从 classpath 下的 commons-logging.properties 文件中获得 LogFactory 实

    2024年02月08日
    浏览(52)
  • Flink使用log4j.properties不打印日志问题

    日志配置文件选择使用log4j.properties flink程序不打印日志。 问题原因         日志依赖包冲突 解决办法         将lib目录下的log4j2依赖移除,如下:         log4j-1.2-api-2.12.1.jar         log4j-api-2.12.1.jar         log4j-core-2.12.1.jar         log4j-slf4j-impl-2.12.

    2024年02月09日
    浏览(43)
  • 记录一次@Slf4j log.info 日志信息未输出到日志文件的问题

    Spring Boot的起步依赖(如spring-boot-starter-web)中已经包含了Slf4j的依赖,无需额外添加。: 当你在项目中添加了 spring-boot-starter-web 依赖后,它将自动引入以下关键组件和依赖项: Spring MVC:用于构建Web应用程序的模型-视图-控制器(Model-View-Controller)框架。 Tomcat(或其他嵌入式

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包