python对日志处理的封装
一个适应性范围较广的日志处理
# coding=utf8 """ @author bfzs """ import os import logging from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler from cloghandler import ConcurrentRotatingFileHandlerformat_dict = {1: logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"),2: logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"),3: logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"),4: logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"),5: logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), }class LogLevelException(Exception):def __init__(self, log_level):err = '设置的日志级别是 {0}, 设置错误,请设置为1 2 3 4 5 范围的数字'.format(log_level)Exception.__init__(self, err)class Log(object):"""一个日志类,用于创建和捕获日志,支持将日志打印到控制台打印和写入日志文件。"""def __init__(self, logger_name=None, log_level_int=1, is_add_stream_handler=True, log_path=None, log_filename=None):""":param logger_name: 日志名称,当为None时候打印所有日志:param log_level_int: 日志级别,设置为 1 2 3 4 5,分别对应DEBUG,INFO,WARNING,ERROR,CRITICAL:param is_add_stream_handler: 是否打印日志到控制台:param log_path: 设置存放日志的文件夹路径:param log_filename: 日志的名字,仅当log_path和log_filename都不为None时候才写入到日志文件。:type logger_name :str:type log_level_int :int:type is_add_stream_handler :bool:type log_path :str:type log_filename :str"""self.logger = logging.getLogger(logger_name)self.__check_log_level(log_level_int)self._logger_level = self.__transform_logger_level(log_level_int)self._is_add_stream_handler = is_add_stream_handlerself._log_path = log_pathself._log_filename = log_filenameself._formatter = format_dict[log_level_int]self.__set_logger_level()self.__add_handlers()def debug(self, msg):self.logger.debug(msg)def info(self, msg):self.logger.info(msg)def warning(self, msg):self.logger.warning(msg)def error(self, msg):self.logger.error(msg)def critical(self, msg):self.logger.critical(msg)def __set_logger_level(self):self.logger.setLevel(self._logger_level)@staticmethoddef __check_log_level(log_level_int):if log_level_int not in [1, 2, 3, 4, 5]:raise LogLevelException(log_level_int)@staticmethoddef __transform_logger_level(log_level_int):logger_level = Noneif log_level_int == 1:logger_level = logging.DEBUGelif log_level_int == 2:logger_level = logging.INFOelif log_level_int == 3:logger_level = logging.WARNINGelif log_level_int == 4:logger_level = logging.ERRORelif log_level_int == 5:logger_level = logging.CRITICALreturn logger_leveldef __add_handlers(self):if self._is_add_stream_handler:self.__add_stream_handler()if all([self._log_path, self._log_filename]):self.__add_file_handler()def __add_stream_handler(self):"""日志显示到控制台"""stream_handler = logging.StreamHandler()stream_handler.setLevel(self._logger_level)stream_handler.setFormatter(self._formatter)self.logger.addHandler(stream_handler)def __add_file_handler(self):"""日志写入日志文件"""if not os.path.exists(self._log_path):os.makedirs(self._log_path)log_file = os.path.join(self._log_path, self._log_filename)os_name = os.nameprint os_namerotate_file_handler = Noneif os_name == 'nt':# windows下用这个,非进程安全rotate_file_handler = RotatingFileHandler(log_file, mode="a", maxBytes=10 * 1024 * 1024, backupCount=10, encoding="utf-8")if os_name == 'posix':# linux下可以使用ConcurrentRotatingFileHandler,进程安全的日志方式rotate_file_handler = ConcurrentRotatingFileHandler(log_file, mode="a", maxBytes=10 * 1024 * 1024, backupCount=10, encoding="utf-8")rotate_file_handler.setLevel(logging.DEBUG)rotate_file_handler.setFormatter(self._formatter)self.logger.addHandler(rotate_file_handler)def test_func():"""测试日志打印,单独运行test_func函数是不会打印出这条日志,没有添加handler"""logger = logging.getLogger('test')logger.info(u'需要被打印的日志')if __name__ == "__main__":test_log = Log('test', 1, log_path='./logs', log_filename='test.log')test_func()test_log.info(u'添加一条日志')import requestsrequest_log = Log('urllib3.connectionpool', 1) # 测试三方包的日志resp = requests.get('https://www.baidu.com')
场景:将不同的日志写入到不同的文件,分析业务问题,查看三方包的日志。
有的三方包的日志是必须捕获,例如concurrent包的日志,线程池运行错误都是通过日志的方式报错,如果不对日志进行打印捕获,很多语法错误或者流程错误都看不到,可能会以为写的东西没毛病呢。
python对日志处理的封装相关推荐
- python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器
在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...
- Python学习日志12 - 办公自动化
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志12课 - 办公自动 ...
- Python学习日志10 - 高阶函数和高级应用
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志10课 - 高阶函数 ...
- python的日志库logging,真香!!!
学习资源 Python之日志处理(logging模块) python之配置日志的几种方式 logging 官方高级用法 使用方法 LOG_FORMAT = "%(asctime)-15s - ...
- python 的日志logging模块学习
2019独角兽企业重金招聘Python工程师标准>>> python 的日志logging模块学习 分类: python 2011-08-02 23:51 8338人阅读 评论(0) ...
- Python的日志模块logging的使用
Python的日志模块logging的使用 1 logging模块介绍 2 logging 简单示例 3 logging.basicConfig() 4 logging组件 4.1 Logger类 4 ...
- 【直播资料下载】Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲...
流畅的Python数据处理及大数据处理ETL Python 系列直播--深入Python与日志服务,玩转大规模数据分析处理实战 直播讲师:丁来强(成喆)--阿里高级技术专家,从事阿里云日志服务相关的产 ...
- Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】
视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day09[面向对象(封装.继承.多态).重写.私有权限] Python基础day ...
- python log日志_Python中logging日志的四个等级和使用
1. logging日志的介绍 在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录:飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序 ...
- python写日志文件_Python logging日志模块 配置文件方式
在一些微服务或web服务中我们难免需要日志功能,用来记录一些用户的登录记录,操作记录,以及一些程序的崩溃定位,执行访问定位等等; Python内置 非常强大的日志模块 ==> logging 今 ...
最新文章
- 社会工程学到底有多可怕
- 云监控状态调查:公有云和混合云的监控成熟度落后于传统数据中心
- 一个简单好用的Android Tab 设计与实现
- Java Web整合开发(26) -- Spring概述
- QT的QOpenGLShaderProgram类的使用
- c# XML和实体类之间相互转换(序列化和反序列化)
- 谷歌微软高通反对英伟达收购ARM 值得国人深思
- 有了bootstrap,为什么还要做amaze ui
- php array_reduce 降维,使用array_reduce降维
- 反向传播算法的详细解释(上)
- 在ubuntu 上安装pycharm
- mysql archive分区_MYSQL-分区表
- Error:java.lang.RuntimeException: Some file crunching failed, see logs for details
- Word将英文数字全部修改为Times New Roman字体
- 01费曼技巧 - 助你快速掌握软件测试知识
- thinkphp如何调试,打印错误信息sql等
- 异步调用案例_异步案例研究
- openEuler 的安装及内核编译
- Android史上最强分割线全攻略
- 【黑曼巴】菜鸟HTML