色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

python 實現多進程日志輪轉ConcurrentLogHandler

瀏覽:25日期:2022-06-24 18:52:45

記錄日志是我們程序中必不可少的一個功能,但是日志文件如果沒有合理的管理,時間長了幾百兆的日志文件就很難分析了(都不想打開看),但是又不可能經常手動去管理它

日志輪轉:根據時間或者文件大小控制日志的文件個數,不用我們手動管理

python中logging模塊內置的有幾個支持日志輪轉的handler

常用的有TimedRotatingFileHandler根據時間輪轉 RotatingFileHandler根據文件大小輪轉

但是內置的這些handler是多線程安全的,而不支持多進程(可以修改源碼加鎖保證進程安全)

多進程的時候可以使用ConcurrentLogHandler(需要自行安裝)按照文件大小輪轉

pip install ConcurrentLogHandler一、簡單的日志輪轉功能實現:

#!/usr/bin/env python# -*- coding: utf-8 -*- import osimport loggingfrom cloghandler import ConcurrentRotatingFileHandlerfrom 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’)# 生成一個loggerlogger = 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 = DEBUGhandlers = consoleHandler [logger_public]handlers = publicFileHandlerqualname = publicpropagate = 0 [handler_consoleHandler]class = StreamHandlerlevel = DEBUGformatter = my_formatterargs = (sys.stdout,) [handler_publicFileHandler]class = cloghandler.ConcurrentRotatingFileHandlerlevel = INFOformatter = my_formatterkwargs = {'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)sdatefmt = %Y-%m-%d %H:%M:%S

創建mylogger.py

import loggingimport 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:Python27liblogginghandlers.py”, line 77, in emit self.doRollover() File “F:Python27liblogginghandlers.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:UserspcDesktopyunserver-1.1manage.py runserver --noreload 0.0.0.0:8000

使用不動態加載方式運行(這樣可能會影響開發環境中動態加載)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 亚洲乱强 | 日韩欧美精品在线观看 | 国产成人综合日韩精品婷婷九月 | 高清国产一区二区三区 | 成人午夜精品久久不卡 | 美女被cao免费看在线看网站 | 日韩欧美一二区 | 欧美一区2区 | 欧美一级毛片免费大全 | 国产在线观看成人免费视频 | 亚洲第一大网站 | a男人的天堂久久a毛片 | 手机在线亚洲 | 亚洲另类视频在线观看 | 欧美日韩一区二区三区在线视频 | 亚洲免费一级视频 | 亚洲精品国产免费 | 国内精品一区二区三区最新 | 亚洲欧美一区在线 | 国产成人毛片视频不卡在线 | 国产在线精品一区二区中文 | 国产亚洲精品成人a在线 | 日本一区午夜爱爱 | 欧美亚洲91| 成人自拍网站 | 91日本在线观看亚洲精品 | 日本高清无吗免费播放 | 99热成人精品热久久66 | 日本人在线看片 | 三级视频网站 | 欧美成人在线免费观看 | a级片在线观看视频 | 欧美大尺度xxxxx视频 | 国产高清精品自在久久 | 天天亚洲 | 91精品国产乱码久久久久久 | 99久久精品免费观看区一 | 欧美一级毛片免费高清的 | 国产第四页 | 久久香蕉国产线看观看式 | 国产精品日本欧美一区二区 |