logging日志模块

I.日志级别

低到高分别为:

(1)DEBUG:输出详细的运行情况,主要用于调试---》debug()

(2)INFO:确认一切按预期运行,一般用于输出重要运行情况---》info()

(3)WARNING:一些意想不到的事情发生了(比如:警告),但是这个软件还能按预期工作 ---》warning()

(4)ERROR:发生了错误,软件没能执行一些功能,还可以继续执行 ---》error()

(5)CRITICAL:一个严重的错误,表名程序本身可能无法继续运行 ---》ctritical()

注意:logging模块默认收集的日志:warning以上等级

II.日志原理

py文件中记录日志 ---收集日志---》日志收集器---输出日志---》控制台/文件

 

III.写日志过程

(1)创建一个收集器,名称自定义: logger = logging.getLogger('name')

(2)设置日志收集器的等级: logger.setLevel(LEVEL)

(3)输出到日志

  • 创建一个输出渠道
    • 输出到日志文件
fh = logging.FileHandler(LOG_PATH ,encoding='utf-8')  # 输出模式默认a(追加)
    • 输出到控制台
sh = logging.StreamHandler()
  • 设置输出级别:fh.setLevel(FHLEVEL) 或 sh.setLevel(SHLEVEL)

(4)设置输出格式

formatter =  logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s') # 时间-文件名-行号-日志级别-输出信息 

详细说明:

%(name)s 收集器名称
%(levelno)s 打印日志级别的数值【数字形式】
%(levelname)s 打印日志级别名称【文本形式】
%(pathname)s 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s 打印当前执行程序名
%(module)s 打印当前模块名
%(lineno)d 打印日志输出函数的语句所在的代码行
%(funcName)s 打印日志当前函数名
%(thread)d 打印线程ID
%(threadName)s 打印线程名称
%(process)d 打印进程ID
%(message)s 打印日志信息
%(name)s Logger的名字
%(created)f 当前时间,用unix标准表示时间的浮点数表示
%(relativeCreated)d 输出日志信息时,自Logger创建的毫秒数
%(asctime)s 字符串形式的当前时间,默认格式为"年-月-日 时:分:秒,毫秒"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(5)收集器对接输出渠道,并格式化

#输出到日志文件
logger.addHandler(fh)
fh.setFormatter(formatter)

#输出到控制台
logger.addHandler(sh)
sh.setFormatter(formatter)

(6)收集日志

  if level == 'DEBUG':
            logger.debug(msg)
        elif level == 'ERROR':
            logger.error(msg)
        elif level == 'INFO':
            logger.info(msg)
        elif level == 'WARNING':
            logger.warning(msg)
        elif level == 'CRITICAL':
            logger.critical(msg)

(7)关闭日志渠道

 logger.removeHandler(fh)
 logger.removeHandler(sh)

日志文件完整代码

import os
import time
import logging
from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler # 日志轮转
from com.contants import LOG_DIR # 日志文件路径
from com.myconf import conf # 配置文件对象


log_path = os.path.join(LOG_DIR,'log' + time.strftime('%Y-%m-%d') +'.log') # 输出日志文件名称

class MyLogger(object):

    @staticmethod
    def get_log():
    # 1. 定义一个日志收集器,默认名称为root
        logger = logging.getLogger()
    # 2. 设置日志收集器的等级
        logger.setLevel(conf.get('logging', 'level'))
    # 3. 输出到日志
    # (1) 创建一个输出到日志文件的输出渠道
        fh = logging.FileHandler(log_path ,encoding='utf-8')
        """
   
    #  按文件大小进行轮转,保留最新的日志信息
        fh = RotatingFileHandler(filename= 'test.logs',
                                 maxBytes =1024*1024, # 设置文件大小:字节--1MB = 1024*1024byte
                                 backupCount= 3 ) # 轮转的文件数量
    # 按时间进行轮转
        fh = TimedRotatingFileHandler(filename='test.logs',
                                      encoding='utf8',
                                      when='D', # D:表示天
                                      interval = 1, # 时间间隔
                                      backupCount=30) # 轮转的文件数量
        """

    # (2) 设置输出级别
        fh.setLevel(conf.get('logging', 'fhlevel'))
    # 4. 输出到控制台
    # (1) 创建一个输出到控制台的输出渠道
        sh = logging.StreamHandler()
    # (2) 设置输出级别
        sh.setLevel(conf.get('logging', 'shlevel'))
    # 5. 设置输出格式
        formatter =  logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s')
    # 6. 收集器对接输出渠道,并格式化
        logger.addHandler(fh)
        fh.setFormatter(formatter)

        logger.addHandler(sh)
        sh.setFormatter(formatter)
        return logger

# 调用类的静态方法,创建一个日志收集器
my_log = MyLogger.get_log()
上一篇:python – PySpark – 将列表作为参数传递给UDF


下一篇:python – pyspark错误:AttributeError:’SparkSession’对象没有属性’parallelize’