Python跨多个模块登录到多个文件

时间:2016-03-25 21:52:21

标签: python logging python-module

我正在处理如何在我的项目中设置日志记录的任务,例如对myApp。它由几个模块和文件组成,我想为日志记录创建一些基本模式。所有日志都应位于/var/log/myApp。该目录应包含文件,例如user_errors.logerrors.log。这两个文件将具有相同的格式模式,包括日期,文件,lineno等。现在请考虑以下结构:

# a.py:
class A(object):
  def __init__(self):
    self.c = my_app.C()
  ...
  def some_method(self)
    raise MyUserError(...)

# b.py
class B(object):
  ...
  raise MyException(...)

# c.py
class C(object):
  ...
  raise MyException(...)


# d.py which has instances of A and B
class D(object):
  ...
  def some_method(self):
    ...
    except MyUserError as ue:
      # log into user_error.log
    except MyException as e:
      # log into error.log

主要方法是根据异常类型将任何违反的异常记录到不同的文件中。同样重要的是记录违反例外的名称和行号。我想我会创建一些myLogger类,它会以某种方式扩展logging模块,但我还没有找到任何好的例子如何做到这一点。我已经阅读了教程,所以我知道如何格式化输出等等。提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您在某个集中位置(或几个集中位置)捕获所有错误,您可以使用两个单独的记录器和单独的处理程序。

log = logging.getLogger('errors')
userlog = logging.getLogger('user_errors')

error_handler = logging.FileHandler('/var/log/myApp/errors.log')
usererror_handler = logging.FileHandler('/var/log/myApp/user_errors.log')

log.addHandler(error_handler)
userlog.addHandler(usererror_handler)

def some_method(self):
    ...
    except MyUserError as ue:
        # log into user_error.log
        userlog.exception('User Error')
    except MyException as e:
        # log into error.log
        log.exception('Error')

如果要处理很多不同的异常和文件,可以像这样创建它们

LOGGERS = {}

def create_loggers():
    logdir = '/var/log/appData'
    exceptions = [
        (MyError, 'errors.log'), 
        (MyUserError, 'user_errors.log'), 
        (OtherError, 'other.log')
    ]
    for exc, fn in exceptions:
        logger = logging.getLogger(exc.__name__)
        hdlr = logging.FileHandler(os.path.join(logdir, fn))
        logger.addHandler(hdlr)
        LOGGERS[exc] = logger

create_loggers()

然后在你的例外hanlder代码中

except OtherException:
    LOGGERS[OtherException].exception('Error')