Python的logging使用

2019-02-07  本文已影响0人  冬至是条狗

自己使用的配置:

import os
import logging.config

# 定义三种日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
 \
                  '[%(levelname)s][%(message)s]'  # 其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

My_log_format = "[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]"
# 定义日志输出格式 结束

# 定义日志文件夹

logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
# 如果不存在定义的日志目录就创建一个
logfile_dir = os.path.join(logfile_dir, 'logs')
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

logfile_name = 'My_log.log'  # log文件名

# log文件的全路径

logfile_path = os.path.join(logfile_dir, logfile_name)

# log配置字典

LOGGING_DIC = {

    'version': 1,

    'disable_existing_loggers': False,
    # 定义 格式
    'formatters': {

        'standard': {

            'format': My_log_format

        },

        'simple': {

            'format': simple_format

        },

        'id_simple': {

            'format': id_simple_format

        },

    },

    'filters': {},

    'handlers': {

        # 打印到终端的日志

        'console': {

            'level': 'DEBUG',

            'class': 'logging.StreamHandler',  # 打印到屏幕

            'formatter': 'simple'

        },

        # 打印到文件的日志,收集info及以上的日志

        'default': {

            'level': 'DEBUG',

            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件

            'formatter': 'standard',

            'filename': logfile_path,  # 日志文件

            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M

            'backupCount': 5,

            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了

        },

        'boss': {

            'level': 'DEBUG',

            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件

            'formatter': 'standard',

            'filename': logfile_path,  # 日志文件

            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M

            'backupCount': 5,

            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },

        'My_log': {

            'level': 'DEBUG',

            'class': 'logging.handlers.TimedRotatingFileHandler',  # 保存到文件,使用时间轮转

            'formatter': 'standard',

            'filename': logfile_path,  # 日志文件

            'when': 'D',  # 每天一个文件

            'backupCount': 30,  # 最大保存日期

            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },

    },

    'loggers': {

        # logger1=logging.getLogger(__name__)拿到的logger配置

        '': {

            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕

            'level': 'DEBUG',

            'propagate': True,  # 向上(更高level的logger)传递

        },

        # logger1=logging.getLogger('collect')拿到的logger配置

        'collect': {

            'handlers': ['boss', ],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕

            'level': 'DEBUG',

            'propagate': True,  # 向上(更高level的logger)传递

        },

    },

}


def load_my_logging_cfg():
    logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
    my_log = logging.getLogger('My_log')
    return my_log
    

if __name__ == '__main__':
    load_my_logging_cfg()

import 此文件调用load_my_logging_cfg(); 返回一个打印日志的对象

import My_logging

logger = My_logging.load_my_logging_cfg()
logger.info(" info ")
logger.debug(" debug ")
logger.warning(" warning ")
logger.error(" debug ")
logger.critical(" critical ")

同时会在同级目录下创建一个logs文件夹,并创建log日志

此外,格式可以自己定制,可定制的内容如下:

%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息

上一篇下一篇

猜你喜欢

热点阅读