调用其他Python包时,Python日志会打印两次(1个格式化,1个未格式化)
我有自己的日志设置:调用其他Python包时,Python日志会打印两次(1个格式化,1个未格式化),python,python-3.x,logging,stdout,handler,Python,Python 3.x,Logging,Stdout,Handler,我有自己的日志设置: def init_logger(level, name): """ Create logger and its handlers, and set them to the given level """ from logging.handlers import RotatingFileHandler logger = logging.getLogger(name) # set level of logger logg
def init_logger(level, name):
"""
Create logger and its handlers, and set them to the given level
"""
from logging.handlers import RotatingFileHandler
logger = logging.getLogger(name)
# set level of logger
logger.setLevel(level)
# define custom formats
formatterFile = logging.Formatter(' * [%(asctime)s]:[%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
formatterStream = logging.Formatter(' * [%(asctime)s] %(message)s', '%Y-%m-%d %H:%M:%S')
# Create handler writing to 'logfile'.
logfile_handler = RotatingFileHandler("mylog-file.log", 'w', 10000000, 5)
logfile_handler.setLevel(logging.INFO)
logfile_handler.setFormatter(formatterFile)
logger.addHandler(logfile_handler)
# Add handler for stdout
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(logging.DEBUG)
stream_handler.setFormatter(formatterStream)
logger.addHandler(stream_handler)
我正在我的主函数中初始化这个名为“myname”的记录器。然后我调用它来打印一些信息。在我的主脚本中,我还调用子模块。每个子模块都有:
#submodule1.py
import logging
logger = logging.getLogger("myname.mod1")
def function():
logger.warning("warning !!")
因此,在我的主要剧本中,我有:
#myscript.py
import logging
import submodule1
def main():
init_logger(logging.DEBUG, 'myname')
logger = logging.getLogger('myname')
logger.info("some information")
submodule1.function()
这样,我就有了stdout格式的预期行,还有一个名为“mylog file.log”的文件,其中包含与预期格式相同的信息。所以,在这里之前,一切都很完美
然后,我导入另一个python包(来自pip安装程序包),并调用它的一个函数。另一个包使用的是导入日志记录
,然后是日志记录。错误(“消息”)
(或任何其他级别)。
当我从脚本中调用它时,其他工具提供的信息不会被打印出来(因为它们没有我的子parser),所以这是可以的
但是,在调用known_package
之后,当我调用我的记录器时,我会在stdout中两次获取每个日志信息:首先使用我自己的格式,然后使用默认格式(在known_package
中使用的格式)
总而言之,以下是我的主要剧本:
#myscript.py
import logging
import submodule1
import knownpackage
def main():
init_logger(logging.DEBUG, 'myname')
logger = logging.getLogger('myname')
logger.info("some information")
submodule1.function()
knowpackage.say_something("smt") # where there is a line like `logging.info("smt")`
logger.info("more info")
logger.warning("more warning")
submodule1.function()
以下是输出:
Writes:
* [2018-07-25 14:41:23] some information
* [2018-07-25 14:41:23] warning!!
* [2018-07-25 14:41:23] more info
INFO:myname:more info
* [2018-07-25 14:41:23] more warning
WARNING:myname:more warning
* [2018-07-25 14:41:23] warning!!
WARNING:myname.mod1: warning !!
而且,在我的日志文件中,我有我所期望的:
* [2018-07-25 14:41:23]: INFO some information
* [2018-07-25 14:41:23]: WARNING warning!!
* [2018-07-25 14:41:23]: INFO more info
* [2018-07-25 14:41:23]: WARNING more warning
* [2018-07-25 14:41:23]: WARNING warning!!
有人知道为什么它在调用外部包时用其他格式复制我的stdout输出吗
谢谢大家!