Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志记录模块不一致行为_Python_Logging - Fatal编程技术网

Python日志记录模块不一致行为

Python日志记录模块不一致行为,python,logging,Python,Logging,我看到记录器模块有一些非常奇怪的行为。它从一个相对复杂的项目开始,但现在我看到了以下脚本: 导入日志 导入操作系统 #取消注释以下行以删除处理程序 #logging.getLogger().handlers=[] filePath=os.environ['userprofile']+r'\Documents\log.txt' logging.basicConfig(文件名=文件路径) logging.debug('Gleep')) logging.shutdown() 这应该只需将“Gleep

我看到记录器模块有一些非常奇怪的行为。它从一个相对复杂的项目开始,但现在我看到了以下脚本:

导入日志
导入操作系统
#取消注释以下行以删除处理程序
#logging.getLogger().handlers=[]
filePath=os.environ['userprofile']+r'\Documents\log.txt'
logging.basicConfig(文件名=文件路径)
logging.debug('Gleep'))
logging.shutdown()
这应该只需将“Gleep”写入log.txt文件到您的文档中即可。目前它正在写入文件,但没有向其中写入任何内容,但是,我不一致地看到了以下行为:

  • 列表项
  • 根本没有写入日志文件
  • 已创建日志文件,但未写入任何内容
  • 一切正常
  • 我以前让它工作的唯一方法是删除现有的处理程序(在上面的示例中注释掉)。 这在位于不同位置的多台机器上


    那么…我是不是做错了什么怪事了?为什么日志模块会这样做?

    我不知道如何证明/反驳/调试您的“其他”情况,但以下内容可能有助于从您的问题中澄清代码中发生了什么:

    首先,不需要设置
    logging.getLogger().handlers=[]
    ,因为
    logging.getLogger()
    默认情况下是根记录器,没有处理程序。下面是一个全新的Python 3.7 shell:

    >>> import logging
    >>> logging.getLogger()
    <RootLogger root (WARNING)>
    >>> logging.getLogger().handlers
    []
    
    (这使用
    .getEffectiveLevel()
    而不仅仅是普通属性,因为记录器将遍历其层次结构,直到在其级别为
    NOTSET
    时找到一个级别为止)

    所有这一切都意味着:正如您当前所拥有的,您正在从根记录器(level
    WARNING
    )记录一个具有level
    DEBUG
    的消息对象,因此消息将无处可去



    我不知道如何证明/反驳/调试您的“其他”情况,但以下内容可能有助于从您的问题中澄清代码中发生了什么:

    首先,不需要设置
    logging.getLogger().handlers=[]
    ,因为
    logging.getLogger()
    默认情况下是根记录器,没有处理程序。下面是一个全新的Python 3.7 shell:

    >>> import logging
    >>> logging.getLogger()
    <RootLogger root (WARNING)>
    >>> logging.getLogger().handlers
    []
    
    (这使用
    .getEffectiveLevel()
    而不仅仅是普通属性,因为记录器将遍历其层次结构,直到在其级别为
    NOTSET
    时找到一个级别为止)

    所有这一切都意味着:正如您当前所拥有的,您正在从根记录器(level
    WARNING
    )记录一个具有level
    DEBUG
    的消息对象,因此消息将无处可去



    使用线程/多处理?或者是像Spyder这样有内存的IDE(或者甚至是Jupyter,我不使用它——IPython的任何东西)。换句话说,您的设置在这里可能很重要。上面的脚本只是通过升华文本运行的。我不确定默认值应该是什么,但我注意到,如果我将level=logging.DEBUG添加到basicConfig,那么文本将写入该文件。这正常吗?我编辑了几次我的评论。请看它的最终版本。这只是一个在python27上运行的常规python脚本。日志库是标准的。是否使用线程/多处理?或者是像Spyder这样有内存的IDE(或者甚至是Jupyter,我不使用它——IPython的任何东西)。换句话说,您的设置在这里可能很重要。上面的脚本只是通过升华文本运行的。我不确定默认值应该是什么,但我注意到,如果我将level=logging.DEBUG添加到basicConfig,那么文本将写入该文件。这正常吗?我编辑了几次我的评论。请看它的最终版本。这只是一个在python27上运行的常规python脚本。日志库是标准的,这是因为我对日志模块及其工作方式没有足够的了解,特别是当它与新的处理程序结合在一起时。最后,我做了以下
    watchLogger=logging.getLogger()watchLogger.setLevel(logging.INFO)handler=logging.FileHandler(os.path.join(path,'log.txt'))handler.setFormatter(logging.Formatter(fmt='%(levelname)s:%(asctime)s-%(message)s),datefmt='%Y-%m-%d%H:%m:%s'))watchLogger.addHandler(handler)
    因此,我在已经存在的StreamHandler中添加了一个FileHandler。这是因为我对日志模块及其运行方式没有足够的了解,尤其是在日志级别与新的处理程序结合时。最后,我做了以下
    watchLogger=logging.getLogger()watchLogger.setLevel(logging.INFO)handler=logging.FileHandler(os.path.join(path,'log.txt'))handler.setFormatter(logging.Formatter(fmt='%(levelname)s:%(asctime)s-%(message)s),datefmt='%Y-%m-%d%H:%m:%s'))watchLogger.addHandler(handler)
    因此,我将向已经存在的StreamHandler添加一个FileHandler。