一个适应性范围较广的日志处理

# 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对日志处理的封装相关推荐

  1. python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器

    在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...

  2. Python学习日志12 - 办公自动化

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志12课 - 办公自动 ...

  3. Python学习日志10 - 高阶函数和高级应用

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志10课 - 高阶函数 ...

  4. python的日志库logging,真香!!!

    学习资源 Python之日志处理(logging模块) python之配置日志的几种方式 logging 官方高级用法 使用方法 LOG_FORMAT = "%(asctime)-15s - ...

  5. python 的日志logging模块学习

    2019独角兽企业重金招聘Python工程师标准>>> python 的日志logging模块学习 分类: python 2011-08-02 23:51 8338人阅读 评论(0) ...

  6. Python的日志模块logging的使用

    Python的日志模块logging的使用 1 logging模块介绍 2 logging 简单示例 3 logging.basicConfig() 4 logging组件 4.1 Logger类 4 ...

  7. 【直播资料下载】Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲...

    流畅的Python数据处理及大数据处理ETL Python 系列直播--深入Python与日志服务,玩转大规模数据分析处理实战 直播讲师:丁来强(成喆)--阿里高级技术专家,从事阿里云日志服务相关的产 ...

  8. Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day09[面向对象(封装.继承.多态).重写.私有权限] Python基础day ...

  9. python log日志_Python中logging日志的四个等级和使用

    1. logging日志的介绍 在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录:飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序 ...

  10. python写日志文件_Python logging日志模块 配置文件方式

    在一些微服务或web服务中我们难免需要日志功能,用来记录一些用户的登录记录,操作记录,以及一些程序的崩溃定位,执行访问定位等等; Python内置 非常强大的日志模块 ==> logging 今 ...

最新文章

  1. 社会工程学到底有多可怕
  2. 云监控状态调查:公有云和混合云的监控成熟度落后于传统数据中心
  3. 一个简单好用的Android Tab 设计与实现
  4. Java Web整合开发(26) -- Spring概述
  5. QT的QOpenGLShaderProgram类的使用
  6. c# XML和实体类之间相互转换(序列化和反序列化)
  7. 谷歌微软高通反对英伟达收购ARM 值得国人深思
  8. 有了bootstrap,为什么还要做amaze ui
  9. php array_reduce 降维,使用array_reduce降维
  10. 反向传播算法的详细解释(上)
  11. 在ubuntu 上安装pycharm
  12. mysql archive分区_MYSQL-分区表
  13. Error:java.lang.RuntimeException: Some file crunching failed, see logs for details
  14. Word将英文数字全部修改为Times New Roman字体
  15. 01费曼技巧 - 助你快速掌握软件测试知识
  16. thinkphp如何调试,打印错误信息sql等
  17. 异步调用案例_异步案例研究
  18. openEuler 的安装及内核编译
  19. Android史上最强分割线全攻略
  20. 【黑曼巴】菜鸟HTML

热门文章

  1. RequestHeaders添加自定义参数
  2. 十年软件开发经验小结
  3. 【程序猿】2016年自己的十年计划篇
  4. 黑马程序员-关于C语言基本运算的一些注意点
  5. C#使用mybatis学习笔记
  6. Intent调用大全
  7. PAT B1035 插入与归并 (25 分)
  8. Day11名称空间,作用域,闭包函数
  9. Java:String和Date、Timestamp之间的转换
  10. equals 跟== 的区别