Python仅记录脚本日志

Dan*_*son 23 python logging

我在我的一个简单脚本中使用Python日志记录模块,目前正在进行以下设置.

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

我的问题是,它还捕获第三方模块,如请求和输出信息()日志消息.有没有办法抑制这些消息或告诉日志记录模块只记录我自己的脚本中的消息?

use*_*036 18

上面的答案并不是真的正确 - 它只会为来自其他模块的消息设置更高的标准.

一种非常快速的方法是使用这段代码:

import logging.config
logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': True,
})
Run Code Online (Sandbox Code Playgroud)

您必须在导入所有模块后设置它 - 它将禁用到目前为止创建的所有记录器.这将在大多数情况下工作,但是当您创建一个类实例时,某些模块会创建它们的记录器(这将在您的代码中稍后发生).


根据基本的python教程设置记录器时,它们会告诉您使用logging.basicConfig(...).这是一个问题,因为这会将处理程序(也就是将日志路由到的位置)设置logging.lastResort为stderr,从Python 3.2开始全局处理程序中的所有记录器.这意味着您现在已启用所有模块的完整日志记录.

因此,更好的方法是仅为您的模块创建一个不同的记录器,并为其提供一些自己的处理程序而不是使用basicConfig().

有两种方法:

1)所有功能:

import logging

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
                          datefmt="%Y-%m-%d - %H:%M:%S")
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
fh = logging.FileHandler("mylog.log", "w")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(ch)
log.addHandler(fh)
Run Code Online (Sandbox Code Playgroud)

这将为您提供您log可以使用的记录器log.error("Error found").它将写入一个名为mylog.log的新文件,并将记录sys.stdout.您可以根据自己的喜好随意更改.

2)使用dict:

import logging
import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'formatters': { 
        'standard': {
            'format': '%(asctime)s %(levelname)s: %(message)s',
            'datefmt': '%Y-%m-%d - %H:%M:%S' },
    },
    'handlers': {
        'console':  {'class': 'logging.StreamHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'stream': sys.stdout},
        'file':     {'class': 'logging.FileHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'filename': 'live_detector.log','mode': 'w'} 
    },
    'loggers': { 
        __name__:   {'level': 'INFO', 
                     'handlers': ['console', 'file'], 
                     'propagate': False },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)
log = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

这将产生与上述相同的结果,稍微长一些,但可能更容易阅读.这也将自动设置'disable_existing_loggers': True.如果您不想这样,则必须添加它并将其设置为False.

  • 这如何为记录器提供有关类创建问题的示例?我只看到提到的问题,没有解决方案。 (2认同)

Tho*_*ung 16

在模块中使用命名记录器:

import logging
logger = logging.getLogger(__name__)
logger.info("my info")
logger.error("my error")
Run Code Online (Sandbox Code Playgroud)

您可以将所有其他记录器的日志级别设置为error并让记录器进行调试:

import logging
logging.basicConfig(level=logging.ERROR)
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)