Skip to content

Instantly share code, notes, and snippets.

@123Daoxyz
Created August 6, 2014 05:13
Show Gist options
  • Save 123Daoxyz/e66e7b1e4f47e7168978 to your computer and use it in GitHub Desktop.
Save 123Daoxyz/e66e7b1e4f47e7168978 to your computer and use it in GitHub Desktop.
logging module used in python project
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
log模块,这里利用了一些sys.modules和python系统库查找的一些trick。
log模块第一次导入的时候,是作为一个文件被查找到的。查找成功后,文件会跑一个生成log实例的逻辑,然后把它加入到全局sys.modules字典里面。
以后所有模块的`import log`动作都会绕开文件查找的过程,直接在sys.modules里面找这个模块。
"""
#FIXME tornado的日志记录有点问题,经常会和testing的模块的日志混在一起。比如slave_ok这个字段。
import sys
import logging.handlers
from settings import ACCESS_LOG_PATH, ERROR_LOG_PATH, LOG_NAME
from utils import get_real_file_path
# FIXME avoid to influence tornado log module
class Log(object):
ACCESS_LOG_PATH = get_real_file_path(
__file__, ACCESS_LOG_PATH)
ERROR_LOG_PATH = get_real_file_path(
__file__, ERROR_LOG_PATH)
FMT = (
'[%(levelname)s][%(name)s:%(process)d][%(asctime)s]' +
': %(message)s')
def __init__(self, name):
log = logging.getLogger(name)
fmt = logging.Formatter(self.FMT)
afh = logging.handlers.TimedRotatingFileHandler(
self.ACCESS_LOG_PATH, 'D', 1, 7)
afh.setLevel(logging.INFO)
afh.setFormatter(fmt)
efh = logging.handlers.RotatingFileHandler(
self.ERROR_LOG_PATH,
maxBytes=1024*1024, backupCount=5)
efh.setLevel(logging.ERROR)
efh.setFormatter(fmt)
log.addHandler(afh)
log.addHandler(efh)
self.log = log
def __call__(self):
return self.log
sys.modules[__name__] = Log(LOG_NAME)()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment