【问题标题】:Python logging configuration filePython 日志记录配置文件
【发布时间】:2010-12-14 16:58:08
【问题描述】:

我在尝试登录我的 python 项目时似乎遇到了一些问题。

我只是试图模仿以下配置:

Python Logging to Multiple Destinations

但是,我不想在代码中执行此操作,而是将其放在配置文件中。

下面是我的配置文件:

[loggers]
keys=root

[logger_root]
handlers=screen,file

[formatters]
keys=simple,complex

[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_complex]
format=%(asctime)s - %(name)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s

[handlers]
keys=file,screen

[handler_file]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=complex
level=DEBUG
args=('logs/testSuite.log',)

[handler_screen]
class=StreamHandler
formatter=simple
level=INFO
args=(sys.stdout,)

问题是我的屏幕输出看起来像:
2010-12-14 11:39:04,066 - 根 - 警告 - 3
2010-12-14 11:39:04,066 - 根 - 错误 - 4
2010-12-14 11:39:04,066 - 根 - 关键 - 5

我的文件是输出的,但看起来和上面一样(尽管包含额外的信息)。但是,调试和信息级别都不会输出。

我使用的是 Python 2.7

这是我展示失败的简单示例:

import os
import sys
import logging
import logging.config

sys.path.append(os.path.realpath("shared/"))
sys.path.append(os.path.realpath("tests/"))

class Main(object):

  @staticmethod
  def main():
    logging.config.fileConfig("logging.conf")
    logging.debug("1")
    logging.info("2")
    logging.warn("3")
    logging.error("4")
    logging.critical("5")

if __name__ == "__main__":
  Main.main()

【问题讨论】:

    标签: python logging


    【解决方案1】:

    看起来您已经为处理程序设置了级别,但没有为您的记录器设置级别。记录器的级别过滤每条消息,然后才能到达其处理程序,默认值为WARNING 及以上(如您所见)。将根记录器的级别设置为NOTSET,并将其设置为DEBUG(或您希望记录的任何最低级别)应该可以解决您的问题。

    【讨论】:

      【解决方案2】:

      将以下行添加到根记录器解决了我的问题:

      level=NOTSET
      

      【讨论】:

        【解决方案3】:

        只需在[logger_root] 中添加日志级别。成功了。

        [logger_root]
        level=DEBUG
        handlers=screen,file
        

        【讨论】:

        • 我也面临同样的问题。
        • 但是,我在 [logger_root] 下添加了日志级别,它运行良好。
        • 只需在 logger_root @Scott 下添加日志级别
        【解决方案4】:
        #!/usr/bin/env python
        # -*- coding: utf-8 -*-
        
        import logging
        import logging.handlers
        from logging.config import dictConfig
        
        logger = logging.getLogger(__name__)
        
        DEFAULT_LOGGING = {
            'version': 1,
            'disable_existing_loggers': False,
        }
        def configure_logging(logfile_path):
            """
            Initialize logging defaults for Project.
        
            :param logfile_path: logfile used to the logfile
            :type logfile_path: string
        
            This function does:
        
            - Assign INFO and DEBUG level to logger file handler and console handler
        
            """
            dictConfig(DEFAULT_LOGGING)
        
            default_formatter = logging.Formatter(
                "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
                "%d/%m/%Y %H:%M:%S")
        
            file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
            file_handler.setLevel(logging.INFO)
        
            console_handler = logging.StreamHandler()
            console_handler.setLevel(logging.DEBUG)
        
            file_handler.setFormatter(default_formatter)
            console_handler.setFormatter(default_formatter)
        
            logging.root.setLevel(logging.DEBUG)
            logging.root.addHandler(file_handler)
            logging.root.addHandler(console_handler)
        
        
        
        [31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module
        

        我认为您应该将 disable_existing_loggers 添加为 false。

        【讨论】:

          【解决方案5】:

          写入终端和文件的简单方法如下:

          import logging.config
          
          logging.basicConfig(
              level=logging.INFO,
              format="%(asctime)s [%(levelname)s] %(message)s",
              handlers=[
                  logging.FileHandler("log_file.log"),
                  logging.StreamHandler()
              ]
          )
          logger = logging.getLogger(__name__)
          

          然后像这样在你的代码中使用它:

          logger.info('message')
          logger.error('message')
          

          【讨论】:

            猜你喜欢
            • 2018-10-12
            • 2020-01-03
            • 1970-01-01
            • 2014-06-11
            • 1970-01-01
            • 1970-01-01
            • 2013-01-02
            • 1970-01-01
            • 2015-01-13
            相关资源
            最近更新 更多