Python日志记录模块:处理程序重复消息

时间:2021-04-17 22:56:03

标签: python python-3.x logging handler filehandler

希望使用日志记录模块设置多个日志文件。能够记录但在 file_handler 的(log_file.log 和 debug_file.log)中获得重复的日志消息。任何帮助,我们如何消除重复消息 日志文件(log_file.log 和 debug_file.log)。

Stream 处理程序的预期输出看起来不错,没有重复的消息,并且在两个日志文件中都期望有相同的消息行

文件结构

MainScript.py
function_program.py
first_script.py
second_script.py
logconfig.yaml

MainScript.py 调用 first_script.py 并且 first 将调用 second_script.py function_program.py 是一个通用模块,在所有脚本中都被导入

脚本

###MainScript.py#######################
import logging, subprocess
import function_program as log

def main():
    logger.info(f'Main Program line1 : Calling First Script')
    logger.info(f'Main Program line2 : {log.file_path("first_script.py")}')
    return_code = subprocess.Popen(['python', f'{log.file_path("first_script.py")}'], stdout=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True)
    logger.info(f'Main script line3 : Return Code -- {return_code.communicate()[0]}')

if __name__ == '__main__':
    logger = log.logfun()
    main()

###function_program.py#######################
import os
import logging
import logging.config
import yaml

logger = logging.getLogger()

def logfun():
    with open('logconfig.yaml', 'r') as f:
        cfg = yaml.safe_load(f.read())
    logging.config.dictConfig(cfg)
    return logging.getLogger('function_program')

def file_path(filename):
    # logger.debug('Common Function program file_path() function call')
    return os.path.join('C:', os.sep, 'Users', 'Python', filename )

###first_script.py#######################
import logging, subprocess
import function_program as log

def main(name):
    logger.info(f'First Script line1 : Calling Second Script  - {name}')
    logger.info(f'First Script line2 : {log.file_path("second_script.py")}')
    return_code = subprocess.Popen(['python', f'{log.file_path("second_script.py")}', f'{name}'], stdout=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True)
    logger.info(f'First Script line3 : return code - {return_code.communicate()[0]}')

if __name__ == '__main__':
    logger = log.logfun()
    # if logger.hasHandlers():   # if enable handlers - console out is missing few lines
    #     logger.handlers = []
    main('First 1st')

###second_script.py#######################
import sys, logging
import function_program as log

def main(name):
    logger.info(f'Second Script line1: {name}')
    logger.info(f'Second Script line2 : {log.file_path("second_script.py")}')

if __name__ == '__main__':
    logger = log.logfun()
    main('Second 2nd')

配置 YAML

version: 1
disable_existing_loggers: False
formatters:
  simple:
    format: "%(levelname)s %(message)s"

handlers:
  console:
    class: logging.StreamHandler
    level: INFO
    formatter: simple
    stream: ext://sys.stdout  

  file_handler:
    class: logging.FileHandler
    level: INFO
    filename: 'log_file.log'
    formatter: simple

  debug_handler:
    class: logging.FileHandler
    level: DEBUG
    filename: 'debug_file.log'
    formatter: simple
  
loggers:
  function_program:
    level: DEBUG
    handlers: [console, file_handler, debug_handler]
    propagate : no

root:
  level: INFO
  handlers: [file_handler, console, debug_handler]
  propagate : no

控制台输出这是预期输出和控制台打印正确

INFO Main Program line1 : Calling First Script
INFO Main Program line2 : C:\Users\Python\first_script.py
INFO Main script line3 : Return Code -- INFO First Script line1 : Calling Second Script  - First 1st
INFO First Script line2 : C:\Users\Python\second_script.py
INFO First Script line3 : return code - INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py

日志文件输出日志文件中的重复消息

INFO Main Program line1 : Calling First Script
INFO Main Program line2 : C:\Users\Python\first_script.py
INFO First Script line1 : Calling Second Script  - First 1st
INFO First Script line2 : C:\Users\Python\second_script.py
INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py
INFO First Script line3 : return code - INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py
INFO Main script line3 : Return Code -- INFO First Script line1 : Calling Second Script  - First 1st
INFO First Script line2 : C:\Users\Python\second_script.py
INFO First Script line3 : return code - INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py

调试文件输出调试文件中的重复消息

INFO Main Program line1 : Calling First Script
INFO Main Program line2 : C:\Users\Python\first_script.py
INFO First Script line1 : Calling Second Script  - First 1st
INFO First Script line2 : C:\Users\Python\second_script.py
INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py
INFO First Script line3 : return code - INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py
INFO Main script line3 : Return Code -- INFO First Script line1 : Calling Second Script  - First 1st
INFO First Script line2 : C:\Users\Python\second_script.py
INFO First Script line3 : return code - INFO Second Script line1: Second 2nd
INFO Second Script line2 : C:\Users\Python\second_script.py

0 个答案:

没有答案