您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python日志记录确保仅将处理程序添加一次

python日志记录确保仅将处理程序添加一次

作为@offbyone注释,可以将冗余处理程序添加到记录器的同一实例。用于记录python文档说-

“多次调用具有相同名称的getLogger()将返回对相同记录器对象的引用。”

因此,我们不必担心将实现变成单一实例。

不幸的是,对于与记录器的相同实例相关联的处理程序,情况 。有 可能 是连接重复处理。

例-

复制此代码并将其保存在main.py中

import logging

print ‘inside main.py’, print ‘-‘*50 def logger():

  print 'initializing logger....'
  logPath = '.'
  fileName = 'temp'

  # configure log formatter
  logFormatter = logging.Formatter("%(asctime)s [%(filename)s] [%(funcName)s] [%(levelname)s] [%(lineno)d] %(message)s")

  # configure file handler
  fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName))
  fileHandler.setFormatter(logFormatter)

  # configure stream handler
  consoleHandler = logging.StreamHandler()
  consoleHandler.setFormatter(logFormatter)

  # get the logger instance
  logger = logging.getLogger(__name__)

  # set the logging level
  logger.setLevel(logging.DEBUG)

  print 'adding handlers- '

  #if not len(logger.handlers):
  logger.addHandler(fileHandler)
  logger.addHandler(consoleHandler)

  print 'logger initialized....\n'
  print 'associated handlers - ', len(logger.handlers)
  for handler in logger.handlers:
        print handler
  print
  return logger

main_logger = logger() main_logger.info(‘utilizing main.py logger.’) print ‘exiting main.py’, print ‘-‘*50

以及sub.py中的以下代码

print 'inside sub.py',

print ‘-‘50 print ‘importing main.py’ import main print ‘imported main.py’ import logging print ‘getting logger instance in sub’ sub_logger = main.logger() print ‘got logger instance in sub’ sub_logger.info(“utilizing sub_logger”) print ‘exiting sub.py’, print ‘-‘50

运行sub.py

narayan@y510p:~/code/so$ python sub.py

inside sub.py -------------------------------------------------- importing main.py inside main.py -------------------------------------------------- initializing logger.... adding handlers- logger initialized....

associated handlers - 2

2015-08-04 07:41:01,824 [main.py] [ ] [INFO] [41] utilizing main.py logger. exiting main.py -------------------------------------------------- imported main.py getting logger instance in sub initializing logger.... adding handlers- logger initialized....

associated handlers - 4 # <===== 4 handlers (duplicates added)

got logger instance in sub 2015-08-04 07:41:01,824 [sub.py] [ ] [INFO] [10] utilizing sub_logger 2015-08-04 07:41:01,824 [sub.py] [ ] [INFO] [10] utilizing sub_logger exiting sub.py --------------------------------------------------

因此,对返回相同记录器的方法的多次调用增加了重复的处理程序。

现在,对于您的问题-

有什么办法可以检查处理程序是否已经存在

在这里-

logger.handlers返回与给定的关联的所有处理程序的列表logger

在将处理程序添加到记录器实例之前,请确保不要在main.py中添加重复的处理程序,只需取消注释表示的行if not len(logger.handlers):并正确缩进以下两行:

if not len(logger.handlers):
    logger.addHandler(fileHandler)
    logger.addHandler(consoleHandler)

现在再次运行sub.py

narayan@y510p:~/code/so$ python sub.py
inside sub.py --------------------------------------------------
importing main.py
inside main.py --------------------------------------------------
initializing logger....
adding handlers- 
logger initialized....

associated handlers -  2
<logging.FileHandler object at 0x7fd67a891c90>
<logging.StreamHandler object at 0x7fd67a862b10>

2015-08-04 08:14:45,620 [main.py] [<module>] [INFO] [41] utilizing main.py logger.
exiting main.py --------------------------------------------------
imported main.py
getting logger instance in sub
initializing logger....
adding handlers- 
logger initialized....

associated handlers -  2 # <===== Still 2 handlers (no duplicates)
<logging.FileHandler object at 0x7fd67a891c90>
<logging.StreamHandler object at 0x7fd67a862b10>

got logger instance in sub
2015-08-04 08:14:45,620 [sub.py] [<module>] [INFO] [10] utilizing sub_logger
exiting sub.py --------------------------------------------------

此外,如果您想限制要添加到logger实例中的处理程序的类型,则可以执行以下操作:

    print 'adding handlers- '
    # allows to add only one instance of file handler and stream handler
    if len(logger.handlers) > 0:
        print 'making sure we do not add duplicate handlers'
        for handler in logger.handlers:
              # add the handlers to the logger
              # makes sure no duplicate handlers are added

              if not isinstance(handler, logging.FileHandler) and not isinstance(handler, logging.StreamHandler):
                    logger.addHandler(fileHandler)
                    print 'added file handler'
                    logger.addHandler(consoleHandler)
                    print 'added stream handler'
    else:
        logger.addHandler(fileHandler)
        logger.addHandler(consoleHandler)
        print 'added handlers for the first time'

希望这可以帮助!

编辑:

不幸的是,对于与记录器的相同实例相关联的处理程序,情况 。有 可能 是连接重复处理。

事实证明,上述说法并不完全正确。

假设我们已经在主模块中创建并配置了一个名为 “ main_logger” 的记录器(仅配置记录器,不返回任何内容)。

# get the logger instance
logger = logging.getLogger("main_logger")
# configuration follows
...

现在在子模块中,如果我们按照命名层次 “ main_logger.sub_module_logger” 创建子记录器,则无需在子模块中对其进行配置。只需按照命名层次创建记录器就足够了。

# get the logger instance
logger = logging.getLogger("main_logger.sub_module_logger")
# no configuration needed
# it inherits the configuration from the parent logger
...

而且它也不会添加重复的处理程序。

参考-在多个模块中使用日志

python 2022/1/1 18:43:56 有492人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶