返回顶部
首页 > 资讯 > 后端开发 > Python >python 实现多进程日志轮转ConcurrentLogHandler
  • 237
分享到

python 实现多进程日志轮转ConcurrentLogHandler

2024-04-02 19:04:59 237人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

记录日志是我们程序中必不可少的一个功能,但是日志文件如果没有合理的管理,时间长了几百兆的日志文件就很难分析了(都不想打开看),但是又不可能经常手动去管理它 日志轮转:根据时间或者文件

记录日志是我们程序中必不可少的一个功能,但是日志文件如果没有合理的管理,时间长了几百兆的日志文件就很难分析了(都不想打开看),但是又不可能经常手动去管理它

日志轮转:根据时间或者文件大小控制日志的文件个数,不用我们手动管理

python中logging模块内置的有几个支持日志轮转的handler

常用的有TimedRotatingFileHandler根据时间轮转 RotatingFileHandler根据文件大小轮转

但是内置的这些handler是多线程安全的,而不支持多进程(可以修改源码保证进程安全)

多进程的时候可以使用ConcurrentLogHandler(需要自行安装)按照文件大小轮转


pip install ConcurrentLogHandler

一、简单的日志轮转功能实现:


#!/usr/bin/env Python
# -*- coding: utf-8 -*- 
import os
import logging
from cloghandler import ConcurrentRotatingFileHandler
from config import LOG_PATH, LOG_FILENAME, LOG_MAX_BYTES
 
 
def create_logger(log_path=os.getcwd(), # 存放日志的目录
         level=logging.DEBUG,
         fORMatter=logging.BASIC_FORMAT, # 日志输出格式
         logger_name="", # 可以使用logging.getlogger(logger_name)使用此logger
         mode='a', 
         delay=0,
         debug=True,
         log_filename=LOG_FILENAME, # 保存日志的文件名(备份出的文件会以此名+.1、 .2命名)
         encoding=None,
         maxBytes=LOG_MAX_BYTES, # 每个日志文件的最大容量
         backupCount=3 # 最多备份几个日志文件):
  # 判断存放日志的文件夹是否存在 如果不存在新建
  if not os.path.exists(log_path):
    os.mkdir(log_path)
  # 存放log的文件名
  log_filename = os.path.join(log_path, log_filename)
 
  # 创建一个logger
  logger = logging.getLogger(logger_name)
  # 设置日志等级
  logger.setLevel(level)
  # 创建一个滚动日志处理器
  crfh = ConcurrentRotatingFileHandler(log_filename, mode=mode, maxBytes=maxBytes, backupCount=backupCount, delay=delay, debug=debug, encoding=encoding)
  # 定义handler的输出格式
  # 设定日志输出格式
  crfh.setFormatter(formatter)
  # 添加日志处理器
  logger.addHandler(crfh)
  # 返回logger对象
  return logger
 
# 日志格式
formatter_log = logging.Formatter('%(asctime)s - %(filename)s [line: %(lineno)d] 【%(levelname)s】 ----- %(message)s')
# 生成一个logger
logger = create_logger(log_path=LOG_PATH, logger_name="mylogger", formatter=formatter_log) 
 

这样就可以在其他模块导入logger进行使用了


logger.error("error msg") 

有时候我们会记录一些数据到文件中,如果多个程序同时写入同一文件会把数据写乱 我们也可以使用这个模块来代替f.write()


from config import CHANNEL_PATH, CHANNEL_FILENAME, LOG_MAX_BYTES
# 只需要把日志的格式改为只存入信息就可以了
formatter_writer = logging.Formatter('%(message)s')
# 创建一个写入器(logger)
writer = create_logger(logger_name="writer",log_path=CHANNEL_PATH, log_filename=CHANNEL_FILENAME, formatter=formatter_writer, level=logging.INFO)

这样就可以使用writer.info("msg")记录数据了

二、使用ini配置文件

创建文件xxx.ini


[loggers]
keys = root,public
 
[handlers]
keys = consoleHandler,publicFileHandler
 
[formatters]
keys = my_formatter
 
[logger_root]
level = DEBUG
handlers = consoleHandler
 
[logger_public]
handlers = publicFileHandler
qualname = public
propagate = 0
 
[handler_consoleHandler]
class = StreamHandler
level = DEBUG
formatter = my_formatter
args = (sys.stdout,)
 
[handler_publicFileHandler]
class = cloghandler.ConcurrentRotatingFileHandler
level = INFO
formatter = my_formatter
kwargs = {"filename": "./logs/public.log", "maxBytes": 1024 * 1024 * 10, "backupCount": 10, "delay": True, "debug": True}
 
[formatter_my_formatter]
format = %(asctime)s - %(filename)s [line: %(lineno)d] [%(levelname)s] ----- %(message)s
datefmt = %Y-%m-%d %H:%M:%S
 

创建mylogger.py


import logging
import logging.config 
logging.config.fileConfig("./xxx.ini") 
logger = logging.getLogger("public") 
logger.info("hello world!")

补充:python日志轮转RotatingFileHandler动态加载导致不能记录日志问题

linux下:

Traceback (most recent call last): File “/usr/lib64/python2.7/logging/handlers.py”, line 77, in emit self.doRollover() File “/usr/lib64/python2.7/logging/handlers.py”, line 136, in doRollover os.rename(sfn, dfn) OSError: [Errno 13] Permission denied Logged from file utils.py, line 89

windows下:

Traceback (most recent call last): File “F:\Python27\lib\logging\handlers.py”, line 77, in emit self.doRollover() File “F:\Python27\lib\logging\handlers.py”, line 142, in doRollover os.rename(self.baseFilename, dfn) WindowsError: [Error 32] Logged from file utils.py, line 89

这是由于Django开发模式时会同时启动两个进程加载settings.py,导致日志文件占用后无法重命名或者删除

都知道djanGo开发模式下如果有文件变动会自动重新启动,所以同时又两个进程,一个是程序正常运行的进程,另一个是用来监听变更并重启服务的进程,他们都会加载一遍settings.py,可以在settings.py中加print然后启动会看到控制台又两次输出。

解决方式:

python C:\Users\pc\Desktop\yunserver-1.1\manage.py runserver --noreload 0.0.0.0:8000

使用不动态加载方式运行(这样可能会影响开发环境中动态加载)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: python 实现多进程日志轮转ConcurrentLogHandler

本文链接: https://lsjlt.com/news/121670.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 实现多进程日志轮转ConcurrentLogHandler
    记录日志是我们程序中必不可少的一个功能,但是日志文件如果没有合理的管理,时间长了几百兆的日志文件就很难分析了(都不想打开看),但是又不可能经常手动去管理它 日志轮转:根据时间或者文件...
    99+
    2024-04-02
  • mysql慢查询日志轮转_MySQL慢查询日志实操
    目录一、概述二、慢查询日志设置1、临时设置2、查询慢查询日志的开启状态和慢查询日志储存的位置3、查看存放日志的形式4、永久开启慢日志三、慢查询测试四、慢查询分析工具五、mysql 清理slowlog方法六、小结一、概述 ...
    99+
    2024-04-02
  • Linux中使用Systemd和Crontab实现日志轮转的方法和步骤
    在Linux中,可以使用Systemd和Crontab来实现日志轮转。下面是使用这两个工具来实现日志轮转的方法和步骤:使用Syste...
    99+
    2023-10-09
    Linux
  • python 多进程实现ssh
    多进程实现多台服务器ssh命令:# -*- coding: UTF-8 -*- from multiprocessing import Process,Pool import paramiko import sys,os host_list...
    99+
    2023-01-31
    进程 python ssh
  • python logging多进程多线程输出到同一个日志文件的实战案例
    参考官方案例:https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.html import logging import ...
    99+
    2024-04-02
  • python logging 日志轮转文件不删除问题的解决方法
    前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据。 分析 项目使用了 logging...
    99+
    2022-06-04
    解决方法 文件 日志
  • python多进程实现进程间通信实例
    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个...
    99+
    2022-06-04
    进程 实例 通信
  • python多进程怎么实现的
    python 多进程使用 multiprocessing 模块实现。关键类和函数包括:process(代表进程)、pool(管理进程和任务分配)、queue(进程间数据传递)、lock(...
    99+
    2024-05-22
    python
  • logrotate实现日志切割方式(转储)
    目录logrotate日志切割(转储)背景日志切割配置文件/etc/logrotate.conf设置定时任务logrotate日志切割报错 文件不再同一个用户组下总结logrotate日志切割(转储) 背景 系统每天凌晨...
    99+
    2023-05-12
    logrotate日志切割 logrotate转储 logrotate实现日志切割
  • python中用logging实现日志滚
    用python中的logging库实现日志滚动和过期日志删除。 logging库提供了两个可以用于日志滚动的class(可以参考https://docs.python.org/2/library/logging.handler...
    99+
    2023-01-31
    中用 日志 python
  • python实现磁盘日志清理
    一、描述:以module的方式组件python代码,在磁盘文件清理上复用性更好二、达到目标:     清空过期日志文件,清理掉超过自定大小日志文件三、原码#!/usr/bin/env python # -*- coding: utf-8 -...
    99+
    2023-01-31
    磁盘 日志 python
  • 基于python实现日志收集
    脚本: #! /usr/bin/python # encoding:utf-8 import paramiko import time import os import re import codecs import commands ...
    99+
    2023-01-31
    日志 python
  • python日志记录模块实例及改进
    python 打印对象的所有属性值: def prn_obj(obj): print 'n'.join(['%s:%s' % item for item in obj.__dict__.items...
    99+
    2022-06-04
    实例 模块 日志
  • 利用 Python 实现多任务进程
    目录一、进程介绍二、线程和进程之间的对比三、使用多进程的优势1、拥有独立GIL2、效率高四、Python 实现多进程1、使用 process 类2、继承 process 类五、进程之...
    99+
    2024-04-02
  • Python实现多任务进程示例
    目录一、进程介绍二、线程和进程之间的对比三、Python 实现多进程四、进程之间的通信五、进程池之间的通信六、案例:文件批量复制一、进程介绍 进程:正在执行的程序,由程序、数据和进程...
    99+
    2024-04-02
  • Python怎么实现日志实时监测
    这篇文章主要讲解了“Python怎么实现日志实时监测”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实现日志实时监测”吧!介绍观察者模式:是一种行为型设计模式。主要关注的是对象...
    99+
    2023-06-29
  • Qt5实现qDebug日志信息写入日志文件过程
    目录1、思路2、代码3、问题4、结果与扩展思路1、思路 其实Qt提供了将日志写入文件的方式,是以接口的形式提供的,我们只需要按照我们的需求完成回调函数和我们自己的接口即可。 为方便调...
    99+
    2024-04-02
  • python自定义日志怎么实现
    这篇文章主要介绍了python自定义日志怎么实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、导入logging模块:import logging2、创建日志收...
    99+
    2023-06-15
  • Python多进程协作模拟实现流程
    由于python多线程无法发挥多核的作用,因此当计算量很大的时候就需要考虑多进程。 只不过多进程比较麻烦一些,进程中通信向来是一件麻烦事。 python提供了multiprocess...
    99+
    2023-01-17
    Python多进程协作 Python多进程协作模拟
  • python3多进程实现
    python多进程的主要方式有两种,一种是使用os模块的fork方法,另一种方法是使用multiprocessing模块,这两种方法的就别在于前者仅适用于Unix/Linux操作系统,后者是跨平台的实现方式 1.使用fork方法实...
    99+
    2023-01-31
    进程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作