我有一个简单的日志记录设置:
def main()
# ....
# Create logger
logging.basicConfig(filemode='w', level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Create file handler for DEBUG and above
fh1 = logging.FileHandler(__name__ + '.debug.log')
fh1.setLevel(logging.DEBUG)
# Create file handler for INFO and above
fh2 = logging.FileHandler(__name__ + '.info.log')
fh2.setLevel(logging.INFO)
# Create console handler with INFO and above
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# Add all the handlers to the logger
logger.addHandler(fh1)
logger.addHandler(fh2)
logger.addHandler(ch)
# ....
然后我打电话
logger.info("this is an INFO message")
logger.debug("this is a DEBUG message")
我在控制台上获得以下内容:
this is an INFO message
INFO:__main__:this is an INFO message
this is a DEBUG message
DEBUG:__main__:this is a DEBUG message
即使我希望在控制台中只看到INFO
消息(因为我在上面为logging.info
指定了StreamHandler
)。为什么我会得到这些副本?
我的.debug.log
和info.log
个文件仅包含正确级别的邮件,但其格式不包含前缀INFO:__main__
或DEBUG:__main__
。为什么他们的格式不同?
答案 0 :(得分:2)
logging.basicConfig(filemode='w', level=logging.DEBUG)
创建StreamHandler
。因此,您的代码创建了两个StreamHandlers
,一个具有日志记录级别DEBUG
,另一个具有级别INFO
。
basicConfig
是一项便利功能。如果您想创建自己的处理程序,则无需调用basicConfig
。 (或者您可以致电basicConfig
并添加其他处理程序......)
如果您在调用basicConfig
时未提供文件名,则会向根记录器添加StreamHandler
。这是代码inside the basicConfig
function:
if handlers is None:
filename = kwargs.get("filename")
if filename:
mode = kwargs.get("filemode", 'a')
h = FileHandler(filename, mode)
else:
stream = kwargs.get("stream")
h = StreamHandler(stream)