Coding ... ....

Python 日志类

一个好的日志类可以帮助维护人员很方便的定位问题。
最近在重构公司的打包脚本,第一件事就是写好日志的方法,实际上就是改造下Python自带的logging类,觉得还比较有通用性,决定把代码贴出来。

import os
import json
import logging
import logging.handlers
from sys import stdout


def logger(module_name, log=None, console=True):
    """
    日志的级别依次是:debug 、info 、warning 、error 、critical
    log 指定日志的输出路径,为None则不输出    
    console=True,会把日志输出到标准输出

    eg:
    log = logger('/tmp/server.log')
    log.debug('...')
    log.exception('exception:') 会额外打印出异常信息
    """
    if log is None and console == False:
        raise ValueError('<log> or <console> should be appoint')

    logger_instance = logging.getLogger(module_name)

    if log is not None:
        dir_path, file_name = os.path.split(log)
        try:
            if not os.path.exists(dir_path):
                os.makedirs(dir_path)
        except Exception:
            pass

        file_handler = logging.handlers.RotatingFileHandler(
            log, maxBytes=20 * 1024 * 1024, backupCount=10)
        fmt = '%(asctime)s [%(filename)s:%(lineno)d] %(levelname)s %(message)s'
        formatter = logging.Formatter(fmt)
        file_handler.setFormatter(formatter)

        logger_instance.addHandler(file_handler)

    if console:
        console_handler = logging.StreamHandler(stdout)
        fmt = '[%(filename)s:%(lineno)d](%(process)d:%(threadName)s) %(levelname)s %(message)s'
        formatter = logging.Formatter(fmt)
        console_handler.formatter = formatter  # 也可以直接给formatter赋值
        logger_instance.addHandler(console_handler)

    logger_instance.setLevel(logging.DEBUG)
    return logger_instance
版权声明:本文为博主原创文章,转载请说明出处。
http://pipe.b3log.org/blogs/like290/articles/2018/07/31/1533023881644

380 浏览
0评论                
评论
留下你的脚步
0