我有一些在无限循环中运行的Python代码,我在其中执行一些日志记录,并且根据特定条件,使用subprocess
模块运行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.
但是一旦subprocess.call
生成,我注意到所有日志行(只是控制台中的那些;日志文件的输出都没问题)恢复为默认值:
DEBUG:__main__:Sleeping for 60 seconds.
更不用说我不应该在控制台中看到调试级别的日志记录,只有info和up。
为什么会这样?
答案 0 :(得分:1)
我不确定为什么会这样,但我解决了这个程序的类似问题。 显然,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()