Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 日志记录的级别和格式。StreamHandler()在运行子流程后更改_Python_Logging - Fatal编程技术网

Python 日志记录的级别和格式。StreamHandler()在运行子流程后更改

Python 日志记录的级别和格式。StreamHandler()在运行子流程后更改,python,logging,Python,Logging,我有一些在无限循环中运行的Python代码,其中我做了一些日志记录,并根据特定条件,使用子流程模块运行一个shell命令,然后再做更多日志记录。大致如下: #!/usr/bin/env python import logging import subprocess import time TIME_FORMAT = '%a %b %-d %Y %-I:%M:%S %p' logger = logging.getLogger(__name__)

我有一些在无限循环中运行的Python代码,其中我做了一些日志记录,并根据特定条件,使用
子流程
模块运行一个shell命令,然后再做更多日志记录。大致如下:

#!/usr/bin/env python

import logging
import subprocess
import time

TIME_FORMAT = '%a %b %-d %Y %-I:%M:%S %p'
logger = logging.getLogger(__name__)                                                                                                                                                                                                                                                                                
logger.setLevel(logging.DEBUG)                                                  
logformat = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'                 
formatter = logging.Formatter(fmt=logformat, datefmt=TIME_FORMAT)               

file_handler = logging.FileHandler('/path/to/logfile.log')          
file_handler.setLevel(logging.DEBUG)                                            
file_handler.setFormatter(formatter)                                            
logger.addHandler(file_handler)                                                 

console = logging.StreamHandler()                                               
console.setLevel(logging.INFO)                                                  
console.setFormatter(formatter)                                                 
logger.addHandler(console) 

def main():
    if some_condition:
        return_code = subprocess.call(['./some_other_process'])
        if return_code == 0:
            logger.info('Just ran some_other_process')
    else:
        logger.debug('Sleeping for 60 seconds.')
        time.sleep(60)

if __name__ == '__main__':
    main()
Fri Aug 22 2014 3:35:11 PM [DEBUG] __main__: Sleeping for 60 seconds.
当我第一次开始执行这个过程时,我注意到输出是正确的;i、 e.日志行应如下所示:

#!/usr/bin/env python

import logging
import subprocess
import time

TIME_FORMAT = '%a %b %-d %Y %-I:%M:%S %p'
logger = logging.getLogger(__name__)                                                                                                                                                                                                                                                                                
logger.setLevel(logging.DEBUG)                                                  
logformat = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'                 
formatter = logging.Formatter(fmt=logformat, datefmt=TIME_FORMAT)               

file_handler = logging.FileHandler('/path/to/logfile.log')          
file_handler.setLevel(logging.DEBUG)                                            
file_handler.setFormatter(formatter)                                            
logger.addHandler(file_handler)                                                 

console = logging.StreamHandler()                                               
console.setLevel(logging.INFO)                                                  
console.setFormatter(formatter)                                                 
logger.addHandler(console) 

def main():
    if some_condition:
        return_code = subprocess.call(['./some_other_process'])
        if return_code == 0:
            logger.info('Just ran some_other_process')
    else:
        logger.debug('Sleeping for 60 seconds.')
        time.sleep(60)

if __name__ == '__main__':
    main()
Fri Aug 22 2014 3:35:11 PM [DEBUG] __main__: Sleeping for 60 seconds.
但是,一旦执行了
子流程.call
,我注意到所有日志行(仅控制台中的日志行;日志文件的输出正常)都恢复为默认值:

DEBUG:__main__:Sleeping for 60 seconds.
更不用说我不应该在控制台中看到调试级别的日志记录,只有info和up


为什么会这样

我不确定为什么会发生这种情况,但我用这个程序解决了一个类似的问题。 显然,getLogger和StreamHandler例程创建了两个不同的StreamHandler

请尝试使用以下代码:

#!/usr/bin/env python

import logging
import subprocess
import time

TIME_FORMAT = '%a %b %-d %Y %-I:%M:%S %p'
logformat = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'                 
formatter = logging.Formatter(fmt=logformat, datefmt=TIME_FORMAT)               

file_handler = logging.FileHandler('/path/to/logfile.log')          
file_handler.setLevel(logging.DEBUG)                                            
file_handler.setFormatter(formatter)                                            
logging.getLogger('').addHandler(file_handler)                                                 

console = logging.StreamHandler()                                               
console.setLevel(logging.INFO)                                                  
console.setFormatter(formatter)                                                 
logging.getLogger('').addHandler(console) 

def main():
    if some_condition:
        return_code = subprocess.call(['./some_other_process'])
        if return_code == 0:
            logger.info('Just ran some_other_process')
    else:
        logger.debug('Sleeping for 60 seconds.')
        time.sleep(60)

if __name__ == '__main__':
    main()

您能否修改您发布的代码,使其显示您描述的不需要的行为?