Python多程式記錄日誌
用gevent(或封裝了gevent的gunicore)啟動python程式,會出現多個獨立程式同時寫一個日誌檔案,
可以觀察到有日誌部分丟失:一個程式日誌沒寫完,另一個程式把日誌覆蓋在同一行的後面;有些日誌甚至完全丟失。
用mlogging包可以解決多程式寫日誌的問題,沒有發現不完整的日誌,是否丟失日誌有待進一步檢測。
下面是一個在python程式中記錄重要資訊,以便以後解析統計的函式
# -*- coding: utf-8 -*- import os.path import logging from mlogging import FileHandler_MP, TimedRotatingFileHandler_MP from functools import partial class LevelFilter(logging.Filter): def __init__(self, level, *args, **kwargs): #super(LevelFilter, self).__init__(*args, **kwargs) self.level = level def filter(self, record): return record.levelno == self.level def init_info_logger(name, logging_dir): logging_file = os.path.join(logging_dir, name+".log") handler = TimedRotatingFileHandler_MP(logging_file, "midnight", 1) handler.setFormatter( logging.Formatter( "%(asctime)s %(levelname)-8s %(name)-20s %(message)s", #設定日誌格式,固定寬度便於解析 datefmt = "%Y-%m-%d %H:%M:%S" #設定asctime時間格式 )) handler.suffix = "%Y%m%d" #只記錄INFO級別資訊,拋棄上面的WARNING、ERROR、CRITICAL幾個級別 handler.addFilter( LevelFilter(logging.INFO) ) logger = logging.getLogger(name) logger.setLevel(logging.INFO) #有些Python版本會報錯KeyError,找不到clientip或user,這裡用一個短橫(-)做預設值 extra={"clientip":"-", "user":"-"} #exc_info是出錯時的Debug詳細回溯資訊,這裡禁止記錄,只記錄錯誤資訊這一行 setattr(logger, "info", partial(logger.info, exc_info=False, extra=extra)) logger.addHandler( handler ) return logger def init_error_logger(logging_dir): logging_file = os.path.join(logging_dir, "errors.log") handler = FileHandler_MP(logging_file) handler.setFormatter( logging.Formatter( "%(asctime)s %(levelname)-8s %(message)s", #設定日誌格式,固定寬度便於解析 datefmt = "%Y-%m-%d %H:%M:%S" #設定asctime時間格式 )) logger = logging.getLogger() logger.setLevel(logging.WARNING) #有些Python版本會報錯KeyError,找不到clientip或user,這裡用一個短橫(-)做預設值 extra={"clientip":"-", "user":"-"} #exc_info是出錯時的Debug詳細回溯資訊 setattr(logger, "critical", partial(logger.critical, exc_info=True, extra=extra)) setattr(logger, "error", partial(logger.error, exc_info=True, extra=extra)) setattr(logger, "warning", partial(logger.warning, exc_info=True, extra=extra)) logger.addHandler( handler ) return logger if __name__ == "__main__": logger = init_info_logger("test", "./") logger.debug("低階別的DEBUG,不會記錄。") logger.info("哈哈哈,這才是我想要的資訊,請記下來。") logger.error("高階別的ERROR,也被過濾掉。")
相關文章
- 使用配置檔案方式記錄Python程式日誌Python
- 【Python】logging模組記錄程式日誌Python
- php日誌,記錄日誌PHP
- python日誌記錄器的配置Python
- python logging日誌模組以及多程式日誌Python
- 日誌記錄器
- [python] Python日誌記錄庫loguru使用指北Python
- Laravel sql 日誌記錄LaravelSQL
- secureCRT記錄操作日誌Securecrt
- 記錄日誌檔案
- PHP日誌記錄方法PHP
- oracle日誌操作記錄Oracle
- python多程式檢查埠並寫日誌Python
- Python:使用logging模組記錄日誌Python
- Python日誌記錄中新增自定義屬性Python
- 日誌記錄 PHP下往linux目錄下寫日誌PHPLinux
- Oracle補充日誌及日誌記錄規則Oracle
- db2不記錄日誌插入記錄DB2
- 記錄騰訊雲使用日誌
- 記錄 | 實習日誌 9
- mysql開啟日誌記錄MySql
- 記錄 sql 查詢日誌SQL
- SecureCRT自動記錄日誌Securecrt
- Appfuse:記錄操作日誌APP
- storm 問題日誌記錄ORM
- 第11章 日誌記錄
- Python模組學習:logging 日誌記錄Python
- monolog 日誌記錄器解析Mono
- iptables防火牆如何記錄日誌防火牆
- 使用Redis記錄系統日誌Redis
- log4net日誌記錄
- 使用Rsyslog記錄Apache日誌Apache
- secureCRT自動記錄log日誌Securecrt
- 使用 .NET Core 的日誌記錄
- 駭客攻擊日誌記錄(轉)
- Rust 實現日誌記錄功能Rust
- Laravel 指定日誌檔案記錄任意日誌Laravel
- 一篇文章教你如何用 Python 記錄日誌Python