Python 2.7 如何在python中附加日志

Python 2.7 如何在python中附加日志,python-2.7,Python 2.7,python项目中有两个名为file1和file2的文件 在file1.py中,Iam将日志捕获到文件“sample.log”,并通过os.system()命令执行file2.py。 在file2.py中,我以追加模式打开示例日志文件sample.log,并将日志发送到该文件 我已经执行了file1.py,即使我在append模式下打开了日志文件(file2.py),我也无法看到file2.py日志。 File2内容被file1内容覆盖 如何在sample.log中附加file2.py日志和fi

python项目中有两个名为file1和file2的文件

在file1.py中,Iam将日志捕获到文件“sample.log”,并通过os.system()命令执行file2.py。 在file2.py中,我以追加模式打开示例日志文件sample.log,并将日志发送到该文件

我已经执行了file1.py,即使我在append模式下打开了日志文件(file2.py),我也无法看到file2.py日志。 File2内容被file1内容覆盖

如何在sample.log中附加file2.py日志和file1.py日志

file1.py

import logging
import os

logFile = 'sample.log'
logging.basicConfig( filename = logFile,filemode = 'w',level = logging.DEBUG,format = '%(asctime)s - %(levelname)s: %(message)s',\
                     datefmt = '%m/%d/%Y %I:%M:%S %p' )

logging.debug("Starting of the file1")

os.system("python file2.py")

for i in range(0,2):
    logging.debug("Iam in file1")
file2.py:

import logging

logFile = 'sample.log'
logging.basicConfig( filename = logFile,filemode = 'a',level = logging.DEBUG,format = '%(asctime)s - %(levelname)s: %(message)s',\
                     datefmt = '%m/%d/%Y %I:%M:%S %p' )

for i in range(0,2):
   logging.debug("Iam in file2")
需要这样的输出吗

2015年6月3日08:02:03 PM-调试:启动文件1

2015年6月3日08:02:03 PM-调试:文件2中的Iam

2015年6月3日08:02:03 PM-调试:文件2中的Iam

2015年6月3日08:02:03 PM-调试:文件1中的Iam

2015年6月3日08:02:03 PM-调试:文件1中的Iam

但是像这样:

2015年6月3日08:02:49 PM-调试:启动文件1

2015年6月3日08:02:49 PM-调试:文件1中的Iam

2015年6月3日08:02:49 PM-调试:文件1中的Iam


有人能帮我得到我的预期结果吗,提前谢谢你的方法有两个主要缺点:

  • 一个文件上应该只有一个记录器。如果要使用
    os.system
    ,则必须使用两个日志文件,因为无法在file2.py中打开重复的记录器句柄

  • 您有不同的写入模式,这会导致竞争条件。可能是您的
    filemode='a'
    完成了所有写入,然后
    filemode='w'
    从一开始就覆盖日志文件,清除所有以前写入的“file2”日志输出

  • 两者

    始终在Windows和Linux上以Python 2.7追加


    这是一个bug,但我怀疑他们会在2.7中修复它,因为它将在2020年下线。

    您只能从
    file1
    中获取日志(有时在日志文件末尾从
    file2
    中获得几行日志),因为每当file2向日志写入内容时,它(大致上)都会首先查找到文件末尾,然后写入数据(
    filemode='a'
    )但是当
    file1
    写入文件时,它只写入数据,并且它在文件中的位置不会更新,它会覆盖
    file2
    中的任何行(
    filemode='w'


    您需要在两个文件中使用
    filemode='a'

    1.无法将两个文件(file1.py和file2.py)日志捕获到同一个日志中。是的,请参见我的答案。但是@msw是正确的,它不能保证安全(除非底层系统能够提供这样的保证,因为我认为python不会考虑),尽管对于简单的用例,可以轻松地实现所需的输出。它仍然会覆盖文件。我是否应该添加除上述命令之外的任何内容,以便在python 3.6中附加相同的日志文件?
    handler=logging.FileHandler(log_filename, 'w')
    
    handler=logging.FileHandler(log_filename, 'w+')