我有一个脚本,我试图选择将各种内容(可选)记录到控制台和日志文件中。我还希望能够为日志目标设置不同的日志级别,即DEBUG到日志文件,INFO到控制台。
我已经通过启动" root"记录器然后可选地为此记录器创建不同的处理程序,我可以在其中独立设置日志级别。但是,我担心这需要将最低可能的日志级别设置为" root"记录器,即使我没有将任何处理程序设置为低级别,也许系统仍然会被大量的日志事件所困扰。
澄清一下,如果我设置了logger.setLevel(logging.WARNING),然后在fileHandler或consoleHandler中尝试使用' logging.DEBUG',我仍然只能获得WARNING级日志打印在我的任一个日志目的地中。这对我来说是有道理的,因为fileHandler和consoleHandler是记录器的子对象(原谅我缺乏适当的词汇),但同样,我只想确保对我的" root"具有尽可能低的日志级别。记录器实际上并没有做任何事情,除非处理程序实际上也设置为低级别。
import logging
import logging.handlers
LOG_TO_STDOUT = 1
ENABLE_LOGFILE = 1
logFormatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
### DO NOT CHANGE main logger log level. This sets the lowest log level available for other loggers
logger.setLevel(logging.DEBUG)
if ENABLE_LOGFILE == 1:
fileHandler = logging.handlers.RotatingFileHandler('crisco.log', maxBytes=2000, backupCount = 5)
fileHandler.setFormatter(logFormatter)
### Set logfile log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
fileHandler.setLevel(logging.DEBUG)
logger.addHandler(fileHandler)
if LOG_TO_STDOUT == 1:
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
### Set console log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
consoleHandler.setLevel(logging.INFO)
logger.addHandler(consoleHandler)
logger.info("this message should show both in file and console")
logger.debug("this message should be in the file only")
答案 0 :(得分:2)
来自docs
<强>处理程序强>
...
setLevel()方法与logger对象一样,指定将分派到适当目标的最低严重性。为什么有两个setLevel()方法?记录器中设置的级别确定将传递给其处理程序的消息的严重性。每个处理程序中设置的级别确定处理程序将发送哪些消息。
答案 1 :(得分:2)
我只是想确保我的&#34; root&#34;具有尽可能低的日志级别。记录器实际上并没有做任何事情,除非处理程序实际上也设置为低级别。
这不是它的工作方式。记录器的日志级别是处理程序的网关,如果希望处理程序接收消息,则必须将其设置为最低处理程序。记录器会将通过其日志级别检查的所有消息传递给其所有处理程序,并让处理程序决定是否接受它。有一些开销,但对于大多数程序来说,它是微不足道的。