【问题标题】:Clearing a log file which is in use清除正在使用的日志文件
【发布时间】:2011-05-06 06:42:27
【问题描述】:

在我的工作中,我正在处理一个写入日志文件的大型 .NET 应用程序。我们将应用程序称为CompanyApplication。我编写了一个简单的 Python 脚本来清除日志:

file_object = open('C:\\log.txt', 'w')
file_object.write("")
file_object.close()

CompanyApplication.exe 没有运行时,它可以正常工作。但是,当 CompanyApplication.exe 运行时,我收到此错误:

回溯(最近一次通话最后一次):

中的文件“deleteLog.py”,第 1 行 file_object = open('C:\log.txt', 'w')
IOError:[Errno 13] 权限被拒绝:'C:\log.txt'

这一定是因为CompanyApplication 持有日志文件的锁。有什么办法可以“解锁”日志文件,清除它,然后将锁“交还”给CompanyApplication?我更喜欢可以自动化的解决方案(这就是我首先编写 Python 脚本的原因)。

附加信息:我能做的只有这么多来改变CompanyApplication 本身。我正在使用 Windows XP Pro。我有管理员权限。

【问题讨论】:

  • 我想当时处理 SIGHUP 已经结束了......

标签: .net python file-io file-permissions


【解决方案1】:

没有。正如你所说,CompanyApplication 在文件上有一个lock。如果任何其他应用程序可以随时解锁,那么锁定的意义何在?

【讨论】:

  • 好吧,最终,CompanyApplication 和 Python 脚本都由我启动了,我是一个拥有管理员权限的人。
【解决方案2】:

您需要在 .NET 程序中为日志文件的 open 调用填写 FileShare 参数。

具体来说你会想allow read/write sharing

根据您的 .NET 应用程序在写入日志时的工作方式,您所建议的内容可能无法按预期工作,并且可能会导致 .NET 程序出现问题。

您可以简单地在 .NET 程序中启动一个线程,该线程创建一个事件并等待它。稍后您可以从 Python 程序中设置该事件,.NET 将安全地清除它自己的日志文件并重置该事件。

【讨论】:

  • 在 Windows 上用 Python 打开文件句柄时是否有等效的方法来设置 FileShare 类型参数?
【解决方案3】:

文件的输出很可能是缓冲的,因此即使您可以接管文件并将其清空,您也无法在正在运行的程序中清空缓冲区。结果可能是文件开头的部分条目,或者程序继续在前一个位置写入,这将用垃圾填充到该位置的所有内容。

为了能够在应用程序运行时清空日志,必须重写应用程序中的日志记录。它必须只在需要时打开日志文件,并在写入后关闭它。这样,您的脚本可以尝试清除文件,如果失败,它可以稍等片刻,然后重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多