日志模块

一、日志的介绍

1.1 日志与print的区别:

  print:灵活打印,移除困难

  loger:多种格式化方案,方便移除,方便输出到文本

1.2 日志的级别 与 单例模式

 一、等级从低到高分为5个等级,默认的显示等级为warning

    1. debug        详细信息,通常在诊断问题时感兴趣
2. info 确认事情的按期工作
3. warning 表示意外的发生,或者在不久的将来将要出现的问题(如:磁盘不足)
4. error 由于更严重的问题,程序无法执行
5. critical 一个严重的错误,指示程序本身可能无法继续执行

二、 loggin的默认显示等级
logging 是一个单列模式,如果在日志显示之后再去配置显示等级,则无作用。
只能在日志显示之前配置。
logging.basicConfig(level=logging.ERROR)
使用这个配置等级,包含这个等级与比等级高的日志

  

# logging 的配置只能在最开始配置
logging.basicConfig(level=logging.ERROR)
logging.disable(logging.ERROR)

logging.debug('1.基础调试信息')
logging.disable(logging.CRITICAL)
logging.info('2.输出信息')
logging.warning('3.告警信息')
logging.error('4.程序错误信息')
logging.critical('5.严重告警信息')

logging.basicConfig(level=logging.ERROR)
# 在此处配置无效,还是从3开始显示 。因为是单列模式

logging.debug('11.基础调试信息')
logging.info('22.输出信息')
logging.warning('33.告警信息')
logging.error('44.程序错误信息')

二、日志的配置

2.1 日志的格式化配置

  单独使用的时候,使用logging.basicConfig这个函数

  使用logging.getloger这个对象的时候。使用 logging.Formatter来配置

  basicConfig 每个文件只配置一次,且放在最前面,重复配置只有第一条起作用
  具体的format配置选项在
  https://docs.python.org/3/library/logging.html#formatter-objects 中的LogRecord attributes
import logging

# 注意basciConfig 只能被写一次,多次配置,不是覆盖,只会第一条生效。
# 如果第一条没配置就使用默认的,在日志显示之后再配置无效,因为是单列模式
# 1. 修改显示格式 # logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG) # 2.添加时间 # logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.DEBUG) # 3. 添加文件,行号 # logging.basicConfig(level=logging.DEBUG, format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s') # 4. 组合比较多 logging.basicConfig(level=logging.DEBUG, format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s') de8ug = 'de8ug' logging.warning('%s python', de8ug) logging.debug('这一行跟着格式走') logging.info('这行也是') logging.warning('来吧') logging.debug('看下多复杂')

2.2 封装成函数多次使用

import logging
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

"""
工程使用需求:
1-不同日志名称
2-打印同时在控制台,也有文件
3-灵活控制等级
"""

# 日志的控制开关,关闭最高级别的日志,就是关闭所有的
# logging.disable(logging.CRITICAL)


def lh_log(logger_name='LH-LOG', log_file='lh-log.log', level=logging.DEBUG):
    log_file = os.path.join(BASE_DIR, 'log', log_file)

    # 创建 logger对象
    logger = logging.getLogger(logger_name)
      if logger.hasHandlers():  # 如果已经存在hander就直接返回,在一个模块中重复引用,会造成重复答应
      return logger
    logger.setLevel(level)  # 添加等级

    # 创建控制台 console handler
    ch = logging.StreamHandler()
    ch.setLevel(level)

    # 创建文件 handler
    fh = logging.FileHandler(filename=log_file, encoding='utf-8')

    # 创建 formatter
    formatter = logging.Formatter('%(asctime)s %(filename)s [line:%(lineno)d] %(name)s %(levelname)s %(message)s')

    # 添加 formatter
    ch.setFormatter(formatter)
    fh.setFormatter(formatter)

    # 把 ch, fh 添加到 logger
    logger.addHandler(ch)
    logger.addHandler(fh)

    return logger


def main():
    # 测试
    logger = lh_log()
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warn message')
    logger.error('error message')
    logger.critical('critical message')

if __name__ == '__main__':
    main()
原文地址:https://www.cnblogs.com/louhui/p/9126238.html