Python 程序执行多次,但不执行';不能正确更新日志文件

Python 程序执行多次,但不执行';不能正确更新日志文件,python,logging,Python,Logging,这个脚本的日志文件有点问题。启动脚本时,第一个日志文件将正确填充。没有问题。该脚本几乎连续运行,因为它使用rabbitmq并充当使用者。(它将消息从队列中拉出来,运行,然后等待重复)问题是脚本运行第二次或第三次时,等等。此时,日志文件与第一次测试相同,尽管它应该不同 总之,我正在运行一些测试,并使用rabbitmq将适当的测试分发给正确的使用者。消费者(上面有此脚本的pc)每次收到消息时都会运行。代码的主要目的是执行一个工具(比如nmap),然后打包结果。我假设问题可能与我如何设置我的记录器有关

这个脚本的日志文件有点问题。启动脚本时,第一个日志文件将正确填充。没有问题。该脚本几乎连续运行,因为它使用rabbitmq并充当使用者。(它将消息从队列中拉出来,运行,然后等待重复)问题是脚本运行第二次或第三次时,等等。此时,日志文件与第一次测试相同,尽管它应该不同

总之,我正在运行一些测试,并使用rabbitmq将适当的测试分发给正确的使用者。消费者(上面有此脚本的pc)每次收到消息时都会运行。代码的主要目的是执行一个工具(比如nmap),然后打包结果。我假设问题可能与我如何设置我的记录器有关,因此对于那些阅读,不要过于关注工具正在做什么。日志相关或shutil.copy可能是问题所在,但我不确定它到底出了什么问题。下面是简化的代码

import os
import subprocess
from ast import literal_eval
from datetime import datetime
import logging
import logging.config
import shutil
import zipfile
import yaml


TOOL = 'nmap'
LOGGER_NAME = 'nmap-Run'

logger = None


class Tool(object):
    ''' class for test execution'''

    def __init__(self):
        ToolDefault.__init__(self, tool=TOOL)

    def _execute_tool(self):
        ''' Execute test based on associated yaml'''

        logging.config.fileConfig('C:\\Users\\cschu\\Documents\\Sec\\src\\config\\test_log.conf')
        global logger
        logger = logging.getLogger(LOGGER_NAME)
        logger.info('Retrieving options')
        options = literal_eval(self.options)

        split_string = ['some', 'command', 'here']

        try:
            cmd_line_process = subprocess.Popen(split_string,
                                                stdout=subprocess.PIPE,
                                                stderr=subprocess.STDOUT)
            process_output, process_error = cmd_line_process.communicate()
            logger.info(process_output)
        except (OSError, subprocess.CalledProcessError) as e:
            logger.info('An exception occurred: ', str(e))
            logger.info('Test failed')

        else:
            logger.info('Test has concluded')

    def _package_report(self):
        ''' Find latest test results and zip into local directory folder results.zip

        '''

        logger.info('Finding most recent test results')

        # do some work in a directory here looking for latest file with strftime
        upload_path = r"C:\test\resultFolder"

        logger.debug('Most recent test result is ' + upload_path)
        try:
            shutil.copy(r'C:\Users\cschu\Documents\Sec\src\Logg.log', upload_path)
        except IOError as e:
            pass

        # do work to zip upload_path which has Logg.log copied to it 
        # zip folder is called results.zip in local dir
        return r'C:\Users\cschu\Documents\Sec\src\results.zip'


def main():
    ''' 
    Do some work with rabbitmq and run the test based off rabbitmq message. 
    '''
    tool_object = Tool()
    rabbit_connection = RabbitConnection(tool_object)
    rabbit_connection.start()


if __name__ == '__main__':
    main()
这是我的test_log.conf文件

[loggers]
keys=root

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=(os.getenv('LOG_FILE_PATH'), 'w')
# LOG_FILE_PATH is 'C:\Users\cschu\Documents\Sec\src\Logg.log'

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

因此,将返回一个压缩文件夹,其中包含测试和日志文件的内容。该日志文件始终与第一个测试相同,即使它应该不同。有人看到我的脚本如何初始化配置文件或类似的问题吗?我想这就是问题所在

可能只有其中一个在日志文件上有锁,其他人无法访问它,这就是为什么您只能看到第一个。也许它们的运行顺序相反,你只能看到最后一个。他们都在写同一个文件吗?尝试将日志文件更改为特定于每个测试。所有测试都将写入同一个日志文件。不过,这些测试从未同时运行。它们总是顺序的。我认为锁在这里没有意义。我现在可以尝试使用datetime创建多个日志文件。我想我只需要将我的fileHandler移动到我的脚本中,而不是我的日志配置文件,并将新创建的日志文件每次移动到压缩文件夹中。如果它们都写入同一个文件,您确定要以追加模式打开它吗?我怀疑问题在于他们不是锁定了文件就是覆盖了文件。检查当每个文件都有不同的名称时会发生什么情况,这将为您提供其写入模式的答案。看看我的配置文件中的fileHandler。我想用新测试的结果覆盖文件。未追加为什么发生异常IOError?这可能是在跟踪你的bug,你以前在那里遇到过错误吗?