【问题标题】:Dynamic/changing last line in log file动态/更改日志文件中的最后一行
【发布时间】:2022-01-24 13:02:53
【问题描述】:

我有一个记录器,我在其中为每个下载的文件附加一行,因为我需要对其进行监控。

但是我最终得到了满是这些的日志。我想要一个解决方案,当从服务器下载 50.000 个文件时,最后一行只会更改已完成下载和最后下载文件的计数,如下所示:

[timestamp] Started downloading 50 000 files.
[timestamp] Downloaded 1002th file - filename.csv
[timestamp] <Error downloading this file> #show only when err ofc
[timestamp] Download finished.

这不是终端日志,是日志文件,我用tail -f主动阅读。

如何使Downloaded 1002th file - filename.csv 动态化?

【问题讨论】:

  • 所以最后你希望你的日志文件包含 4 行,而不是 50003?

标签: python logging


【解决方案1】:

最简单的解决方案是在每次下载完成后一次写入整个文件,并在每次写入之前截断它。否则你将不得不在相当低的水平上工作,使用 Python 文件对象的 seek 和 tell 函数,这将是相当大的杀伤力 (https://docs.python.org/3/tutorial/inputoutput.html) 只保存几行。在任何解决方案中,对文件的此类更改可能无法使用 tail -f 正常工作(因为如果文件大小不变,tail 可能不会更新文件中的位置;此外,如果您在 python 中重新打开文件,文件描述符将更改,您可能必须使用尾 -F )。也许使用watch cat就足够了?

【讨论】:

    【解决方案2】:

    尝试修改日志文件是:

    1. 非常困难,因为您正在尝试修改它,同时不断地从 Python 编写它:
      1. 如果您从外部程序执行此操作,则同一文件部分将有 2 个编写器,这可能会导致大问题。
      2. 如果您从 Python 中执行此操作,您实际上将无法使用日志记录模块,因为您需要开始创建自定义文件处理程序和标志。
      3. tail -F 实际阅读此内容时会出现问题。
    2. 气馁。日志是日志,你不应该随意进入并修改它们。

    如果您希望轻松监控这一点,您有多种不同的解决方案:

    • 使用logging.debug 而不是logging.info 写入“成功下载的文件”。然后监视logging.INFO 级别。我相信这是最好的做法。您甚至可以将debug 写入一个日志,将info 写入另一个日志,并监控信息。
    • 发送“已成功下载 10/100/1000 个文件”。这将批处理 logging.info 行。
    • 使用任何类型的外部监控。更多的是自定义解决方案,有点超出问题的范围。

    【讨论】:

    • 谢谢,是的,这是我现在使用记录器的解决方案。我想这是有道理的,我现在只需要使用 grep 就可以过滤掉 tail -f 输出。确实,另一个进程可能会记录某些内容,并且“动态”行不会是最后一行,这使得修改它确实是不好的做法。我认为tail -f | grep -v 'not wanted' 可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多