Python日志配置文件

Sco*_*ott 32 python logging

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

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

Python记录到多个目标

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

以下是我的配置文件:

[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,)
Run Code Online (Sandbox Code Playgroud)

问题是我的屏幕输出看起来像:
2010-12-14 11:39:04,066 - root - 警告 - 3
2010-12-14 11:39:04,066 - root - 错误 - 4
2010-12-14 11:39 :04,066 - root - CRITICAL - 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()
Run Code Online (Sandbox Code Playgroud)

bde*_*ker 22

看起来您已经为处理程序设置了级别,而不是您的记录器.记录器的级别会在每个消息到达其处理程序之前对其进行过滤,默认值为WARNING高于此值(如您所见).将根记录器的级别设置NOTSET为您所拥有的,并将其设置为DEBUG(或者您希望记录的最低级别)应解决您的问题.


Sco*_*ott 13

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

level=NOTSET
Run Code Online (Sandbox Code Playgroud)


P11*_*D8M 7

只需添加日志级别即可[logger_root]。这是有效的。

[logger_root]
level=DEBUG
handlers=screen,file
Run Code Online (Sandbox Code Playgroud)


Ami*_*khm 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__)
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中使用它,如下所示:

logger.info('message')
logger.error('message')
Run Code Online (Sandbox Code Playgroud)