在我写的python脚本中,我正在尝试使用日志记录模块记录事件.我有以下代码来配置我的记录器:
ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
'formatters':{'error':{'format':ERROR_FORMAT},
'debug':{'format':DEBUG_FORMAT}},
'handlers':{'console':{'class':'logging.StreamHandler',
'formatter':'debug',
'level':logging.DEBUG},
'file':{'class':'logging.FileHandler',
'filename':'/usr/local/logs/DatabaseUpdate.log',
'formatter':'error',
'level':logging.ERROR}},
'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行时logging.debug("Some string"),我没有输出到控制台,即使文档中的这个页面说logging.debug应该让根记录器输出消息.为什么我的程序没有输出任何内容,我该如何解决?
Omr*_*rel 81
默认日志记录级别为警告.由于您没有更改级别,因此根记录器的级别仍然是警告.这意味着它将忽略任何低于警告级别的日志记录,包括调试日志记录.
这在教程中解释:
import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything
Run Code Online (Sandbox Code Playgroud)
'info'行不打印任何内容,因为级别高于info.
要更改级别,只需在根记录器中设置它:
'root':{'handlers':('console', 'file'), 'level':'DEBUG'}
Run Code Online (Sandbox Code Playgroud)
换句话说,这是不够的定义与水平= DEBUG处理程序,实际的日志记录级别也必须DEBUG为了得到它的输出任何东西.
eri*_*ric 60
对于这里想要一个超级简单答案的任何人:只需设置您想要显示的级别。在我所有脚本的顶部,我只放了:
import logging
logging.basicConfig(level = logging.INFO)
Run Code Online (Sandbox Code Playgroud)
然后显示该级别或更高级别的任何内容:
logging.info("Hi you just set your fleeb to level plumbus")
Run Code Online (Sandbox Code Playgroud)
它是五个级别的分层集,以便日志将显示在您设置的级别或更高的级别。因此,如果您想显示错误,可以使用logging.error("The plumbus is broken").
水平,在日益严重的依次是DEBUG,INFO,WARNING,ERROR,和CRITICAL。默认设置是WARNING。
这是一篇包含此信息的好文章,比我的答案表达得更好:https :
//www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-3
Mos*_*sab 45
This problem wasted me so much time, so I'll just invest some more to write an answer and save yours
Cannot set logging level for custom loggers. (e.g: to DEBUG level)
Setting logging level to the handler.
import logging
# Get logger
logger = logging.getLogger("my logger")
# Create a handler and set logging level for the handler
c_handler = logging.StreamHandler()
c_handler.setLevel(logging.DEBUG) # <- Here things went wrong
# link handler to logger
logger.addHandler(c_handler)
# test
logger.debug('This is a debug message') # WILL NOT WORK
Run Code Online (Sandbox Code Playgroud)
Set the logging level via the logger object (instead of the handler) Customlogger.setLevel(logging.DEBUG)
import logging
# Get logger
logger = logging.getLogger("my logger")
# Create a handler
c_handler = logging.StreamHandler()
# link handler to logger
logger.addHandler(c_handler)
# Set logging level to the logger
logger.setLevel(logging.DEBUG) # <-- THIS!
# test
logger.debug('This is a debug message') # WILL WORK
Run Code Online (Sandbox Code Playgroud)
Hub*_*iak 19
许多年后,Python记录器似乎仍然存在可用性问题。以下是一些示例说明:
import logging
# This sets the root logger to write to stdout (your console)
logging.basicConfig()
# By default the root logger is set to WARNING and all loggers you define
# inherit that value. Here we set the root logger to NOTSET. This logging
# level is automatically inherited by all existing and new sub-loggers
# that do not set a less verbose level.
logging.root.setLevel(logging.NOTSET)
# The following line sets the root logger level as well.
# It's equivalent to both previous statements combined:
logging.basicConfig(level=logging.NOTSET)
# You can either share the `logger` object between all your files or the
# name handle (here `my-app`) and call `logging.getLogger` with it.
# The result is the same.
handle = "my-app"
logger1 = logging.getLogger(handle)
logger2 = logging.getLogger(handle)
# logger1 and logger2 point to the same object:
# (logger1 is logger2) == True
# Convenient methods in order of verbosity from highest to lowest
logger.debug("this will get printed")
logger.info("this will get printed")
logger.warning("this will get printed")
logger.error("this will get printed")
logger.critical("this will get printed")
# In large applications where you would like more control over the logging,
# create sub-loggers from your main application logger.
component_logger = logger.getChild("component-a")
component_logger.info("this will get printed with the prefix `my-app.component-a`")
# If you wish to control the logging levels, you can set the level anywhere
# in the hierarchy:
#
# - root
# - my-app
# - component-a
#
# Example for development:
logger.setLevel(logging.DEBUG)
# If that prints too much, enable debug printing only for your component:
component_logger.setLevel(logging.DEBUG)
# For production you rather want:
logger.setLevel(logging.WARNING)
Run Code Online (Sandbox Code Playgroud)
混乱的一个常见根源是初始化错误的根记录器。考虑一下:
import logging
log = logging.getLogger("myapp")
log.warning("woot")
logging.basicConfig()
log.warning("woot")
Run Code Online (Sandbox Code Playgroud)
输出:
woot
WARNING:myapp:woot
Run Code Online (Sandbox Code Playgroud)
根据您的运行时环境和日志记录级别,第一条日志行(在基本配置之前)可能不会在任何地方显示。
小智 8
也许试试这个?在我的情况下,删除所有处理程序后,似乎问题已解决。
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
logging.basicConfig(filename='output.log', level=logging.INFO)
Run Code Online (Sandbox Code Playgroud)
import logging
log = logging.getLogger()
log.setLevel(logging.DEBUG)
此代码会将默认日志记录级别设置为 DEBUG。
| 归档时间: |
|
| 查看次数: |
60175 次 |
| 最近记录: |