将日志文件变成一种循环缓冲区

pac*_*nga 26 logging

伙计们,是否有 *nix 解决方案可以使日志文件充当循环缓冲区?例如,我希望日志文件存储最大 1Gb 的数据,并在达到限制后丢弃较旧的条目。

有可能吗?我相信为了实现日志文件应该变成某种特殊的设备......

PS我知道misc logrotating工具,但这不是我需要的。Logrotating 需要大量 IO,通常每天发生一次,而我需要一个“运行时”解决方案。

Den*_*son 16

Linux 有一个内核环形缓冲区。您可以使用dmesg显示它

或者这里是一个 Linux 内核模块,它似乎可以满足您的需求。

什么是emlog?

emlog 是一个 Linux 内核模块,可以轻松访问进程的最新(并且仅是最近的)输出。它就像日志文件上的“tail -f”一样工作,只是所需的存储空间永远不会增长。这在没有足够内存或磁盘空间来保存完整日志文件的嵌入式系统中很有用,但有时需要最新的调试消息(例如,在观察到错误之后)。

emlog 内核模块实现了简单的字符设备驱动程序。驱动程序就像一个命名管道,它有一个有限的循环缓冲区。缓冲区的大小很容易配置。随着更多数据写入缓冲区,最旧的数据将被丢弃。从 emlog 设备读取的进程将首先读取现有缓冲区,然后在写入时查看新文本,类似于使用“tail -f”监视日志文件。(也支持非阻塞读取,如果进程需要获取日志的当前内容而不阻塞等待新数据。)


Dan*_*tta 5

我能想到的最接近的东西是 RRDTools,但它可能不是你想要的。另一种解决方案是监视日志文件(例如每秒或在 Linux 中使用 inotify),例如您编写如下脚本:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

使用 inotify:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

您可以使用djb 的 Daemontools 中的multilog。您将日志输出通过管道传输其中。是的,它是日志轮换,但轮换很简单:

ln current $tai64nlocaltimestamp
Run Code Online (Sandbox Code Playgroud)

其中,几乎在任何现代 linux 文件系统上都是一个超级快速的操作。您可以指定所需的日志文件数量和大小。制作 10 x 1024mb 文件,您将拥有 1gb 环形缓冲区。

请注意,由于自动轮换,每个多日志实例是一个源。但是您可以通过使用 netcat 或手动编写一个简单的包装器来解决这个问题。