首页 > 其他分享 >logging 模块因权限问题写入日志失败

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

时间:2023-06-02 17:45:32浏览次数:31  
标签:logging log 写入 zabbix myapp 日志 logger

哈喽大家好,我是咸鱼

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

1.案例现象

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

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

上 zabbix 看看 action log
image

发现 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

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

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

标签:logging,log,写入,zabbix,myapp,日志,logger
From: https://www.cnblogs.com/edisonfish/p/17452538.html

相关文章

  • FLink写入Clickhouse优化
    一、背景ck因为有合并文件操作,适合批量写入。如单条插入则速度太慢二、Flink写入ck优化改为分批插入,代码如下DataStream<Row>stream=...stream.addSink(JdbcSink.sink("INSERTINTOmytable(col1,col2)VALUES(?,?)",(ps,row)->{ps.setString(1,row.ge......
  • nginx四层代理日志配置
    配置在stream段: log_formatproxy'$remote_addr[$time_local]' '$protocol$status$bytes_sent$bytes_received' '$session_time"$upstream_addr"' '"$upstream_bytes_sent""$upstre......
  • MySQL日志
    文章目录一、理论二、错误日志(ErrorLog)三、二进制日志四、事务日志(redo日志)五、慢查询日志(slowquerylog)一、理论数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。MySQ......
  • 工作记录:Skywalking 对Java服务进行日志分析指标收集
    版本号:8.9.0目标:通过日志分析生成日志对应级别指标,skywalking页面展示指标采集情况,并配置指标规则告警到钉钉分析前提:skywalking已收集到对应服务的日志,日志列表可查询到服务日志1.日志分析指标配置Application配置修改config/application.yamllog-analyzer:selector:$......
  • 日志脱敏之后,无法根据信息快速定位怎么办?
    日志脱敏之殇小明同学在一家金融公司上班,为了满足安全监管要求,最近天天忙着做日志脱敏。无意间看到了一篇文章金融用户敏感数据如何优雅地实现脱敏?感觉写的不错,用起来也很方便。不过日志脱敏之后,新的问题就诞生了:日志脱敏之后,很多问题无法定位。比如身份证号日志中看到的是3*......
  • 日志脱敏之后,无法根据信息快速定位怎么办?
    日志脱敏之殇小明同学在一家金融公司上班,为了满足安全监管要求,最近天天忙着做日志脱敏。无意间看到了一篇文章金融用户敏感数据如何优雅地实现脱敏?感觉写的不错,用起来也很方便。不过日志脱敏之后,新的问题就诞生了:日志脱敏之后,很多问题无法定位。比如身份证号日志中看到的是3......
  • ROS2-Beginner:8-使用rqt_console来浏览日志
    目标:了解rqt_console,用于查看日志消息的工具。背景rqt_console是一个图形化工具用于查看ROS2中的日志消息。通常,日志消息在你个终端显示。用rqt_console,可以统一浏览这些日志,过滤、保存以及从文件中加载。任务1、启动rqt_consoleros2runrqt_consolerqt_console启动turt......
  • 阿里Druid数据源,程序启动或日志记录报错 load filter error, filter not found : logb
      Druid支持配置多种Filter,配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties下面,具体如下:druid.filters.default=com.alibaba.druid.filter.stat.StatFilterdruid.filters.stat=com.alibaba.druid.filter.stat.StatFilterdruid.filters.mergeStat=com.a......
  • Flink流式数据缓冲后批量写入Clickhouse
    一、背景对于clickhouse有过使用经验的开发者应该知道,ck的写入,最优应该是批量的写入。但是对于流式场景来说,每批写入的数据量都是不可控制的,如kafka,每批拉取的消息数量是不定的,flink对于每条数据流的输出,写入ck的效率会十分缓慢,所以写了一个demo,去批量入库。生产环境使用还需要优......
  • MySQL 8错误日志出现"The table /home/work/mysql_3306/tmp/#sqla2b_298b06_4d is fu
    ##############    了解MySQL8.0.26的错误日志出现"Thetable /home/work/mysql_3306/tmp/#sqla2b_298b06_4disfu11!"的bug,暂时通过修改临时表的存储引擎为内存引擎解决  MySQL8.0.13开始引入新的临时内存表引擎TempTable,并将其作为内存中创建临时表的默认存......