jetz
6/19/2013 - 9:43 AM

自定义logger,除了默认logger可显示类型的信息外,根据需要添加logger显示其他字段信息

自定义logger,除了默认logger可显示类型的信息外,根据需要添加logger显示其他字段信息

#!/usr/bin/env python
#-*- coding: utf-8 -*-

##############################################################################
# 自定义logger,除了默认logger可显示类型的信息外,根据需要添加logger显示其他字段信息
##############################################################################

import logging

_NAME = None
_ID = None


class CustomLogRecord(logging.LogRecord):
    def __init__(self, *args, **kwargs):
        super(CustomLogRecord, self).__init__(*args, **kwargs)
        self.custom_name = _NAME
        self.custom_id = _ID


class CustomLogger(logging.Logger):
    def makeRecord(self, name, level, fn, lno,
                   msg, args, exc_info, func=None, extra=None):
        return CustomLogRecord(name, level, fn, lno,
                               msg, args, exc_info, func=func)


def get_custom_logger(filename, custom_name='???', custom_id='???'):
    global _NAME, _ID
    _NAME = custom_name
    _ID = custom_id
    logging.setLoggerClass(CustomLogger)
    logger = logging.getLogger(filename)
    logger.setLevel(logging.DEBUG)
    return logger


LOG_FORMAT = '[%(asctime)s <%(custom_name)s,%(custom_id)s>] %(levelname)s: %(message)s'  # noqa
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'

formater = logging.Formatter(LOG_FORMAT, DATE_FORMAT)

logger = get_custom_logger(__name__, custom_name='name', custom_id='id')

streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formater)
logger.addHandler(streamHandler)

fileHandler = logging.FileHandler('log.txt', 'a+')
fileHandler.setFormatter(formater)
logger.addHandler(fileHandler)

logger.info('custom logger test')