调用其他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输出吗

谢谢大家!