繁体   English   中英

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

[英]Python logging into several files across several modules

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

# 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模块,但我还没有找到任何好的示例来实现此目的。 我已经阅读了本教程,所以我知道如何格式化输出等等。 预先感谢您的帮助!

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

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()

然后在您的例外处理程序代码中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM