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

问题描述

希望使用日志记录模块设置多个日志文件。能够记录但在 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}'],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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...