如何禁用日志记录?

如何禁用日志记录?

我最近了解到它journalctl占用了我的 16GB SD 卡(Raspberry Pi)的很大一部分:

$ journalctl --disk-usage
Archived and active journals take up 312.1M in the file system.  

我没有这种感觉journalctl并且journald尽其所能在我的这台机器的用例中。这是一个老式的 RPi,并且rsyslog也在运行。我估计我的需要和使用journalctl可能是“千载难逢”。因此,我决定禁用journald- which “feeds” journalctl。我认为这很简单,使用systemctlto stop,或者可能只是disableing systemd-journald.service,这样它就不会在下次启动时启动。

在拔掉插头之前,我决定做一些研究。没有找到数千个提供“操作方法”建议的参考资料,而是针对我的特定搜索词的结果非常少:“如何禁用日志”。相反,结果主要提供了减少的journald建议资源消耗。我确实找到了一些让我犹豫的参考资料:

journaldArchLinux 论坛中的一个旧帖子表明,如果没有的话就不可能禁用反响;即"Masking systemd-journald causes all kinds of dependency failures and drops you at an emergency prompt."但是这篇文章已经有 10 年历史了......

systemd-journald.服务手册说,"stopping it [systemd-journald.service] is not recommended."。文档从那里开始讨论命名空间

我了解到阻止systemd单位启动的常用命令没有效果;即正常启动:

$ sudo systemctl disable systemd-journald.service
$ sudo reboot 

# ... and after boot & login:

$ systemctl status systemd-journald.service
● systemd-journald.service - Journal Service
     Loaded: loaded (/lib/systemd/system/systemd-journald.service; static)
     Active: active (running) since Fri 2022-06-03 07:30:29 UTC; 1min 59s ago
TriggeredBy: ● systemd-journald-audit.socket
             ● systemd-journald.socket
             ● systemd-journald-dev-log.socket
       Docs: man:systemd-journald.service(8)
             man:journald.conf(5)
   Main PID: 134 (systemd-journal)
     Status: "Processing requests..."
      Tasks: 1 (limit: 1598)
        CPU: 820ms
     CGroup: /system.slice/systemd-journald.service
             └─134 /lib/systemd/systemd-journald

...
$ 

怎样才能journald被禁用呢? ...或者可以禁用它吗?

如果不是,systemd开发者为什么要强迫用户这样做? (好吧,是的 - 征求意见,所以忘记问题的这一部分。)

答案1

之所以不想journald在使用的时候消除rsyslogd是因为rsyslogd可以得到它的信息日记,他们以这种方式一起玩得很好。

这有点与此处评论中链接的一些问答相反。在当前的 Linux 系统上对此进行了一些观察(在 Fedora 和 Debian 上检查了这一点),该系统配置为让日志仅使用易失性(内存中)存储,并rsyslog写入实际的日志文件:

  • /var/run/log是一个带有一个子目录的目录,journal.这包含由systemd-journald和写入的文件阅读者 rsyslogd。请注意,此目录位于tmpfs分区上,因此它算作内存易失性存储。
  • /dev/log是到 的符号链接/run/systemd/journal/dev-log

这些系统上的/etc/rsyslog.conf包括这个(不是库存rsyslog.conf):

# Input
module (
        load="imjournal"
        ...
)

Fedora 和 Debian 的不同之处在于这里的库存配置;前者确实使用imjournal以及imuxsock(用户空间套接字)。1 Debian 使用imuxsockand imklog(内核日志),大概是因为没有imjournal它需要监听内核本身。我还认为这有点不合时宜。

我的部分观点是,完全删除日志记录可能并非不可能,但这是一个坏主意。它是当代基于 systemd 的系统的核心组件。它的缺陷是它可能比 rsyslog 使用更多的磁盘空间,但这很容易通过使用Storage=volatile和 (例如)RuntimeMaxUse=64Min进行配置/etc/systemd/journald

从journald 获取rsyslogd 是一种后端/前端关系; rsyslog 很棒,因为它提供纯文本日志记录以及对记录内容、记录位置和方式的更细粒度控制,而 Journald 提供与系统服务更好的集成。


  1. rsyslog 建议使用imuxsockasimuxjournal效率较低,并且可能会遇到其他问题;另请参阅安德鲁·亨利对此的回答和下面的评论。

答案2

如何禁用日志记录?

首先,这就是Rsyslogd 文档介绍了imjournal用于从 systemd 日志获取日志消息的模块(粗体是原创,斜体是我的强调):

请注意,该模块读取日志数据库,什么被认为是相对性能密集的操作。因此,利用该模块的配置的性能可能是比使用 imuxsock 时明显慢。该日志为 imuxsock 提供了所有“经典”系统日志消息的副本,但是,它不提供结构化数据。仅当需要结构化数据时,才必须使用 imjournal。 否则,imjournal 可能会被 imuxsock 取代,我们强烈建议这样做

我们建议查看有关 rsyslog 日志集成的简短演示,以了解预期用例的更多详细信息。

警告:某些版本的 systemd 日志存在数据库损坏问题,这导致日志在紧密循环中无休止地返回相同的数据。这会导致 rsyslog 内出现大量消息重复,当系统资源耗尽时,可能会导致拒绝服务。通过使用适当的速率限制器可以在一定程度上缓解这种情况,但即使如此,旧数据也会出现无休止重复的峰值。默认情况下,速率限制已激活,并允许在 10 分钟内处理 20,000 条消息,这对于大多数用例来说应该足够了。如果不够,请使用下述参数调整允许的音量。强烈建议仅在确实需要时才使用此插件

您是否有“迫切需要”向 rsyslog 提供“结构化数据”?这样做时会使用更多的 CPU 周期,但速度会慢很多吗?

用直接 rsyslog 替换 systemd 的日志很容易:

  1. 编辑/etc/rsyslog.conf。删除所有对imjournal和 的引用imuxsock

  2. 将上面的行替换为

    module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
    SysSock.Use="on") # Turn on message reception via local log socket;

  3. 运行以下命令:

    systemctl stop systemd-journal-flush.service systemd-journald.service systemd-journald-dev-log.socket systemd-journald.socket

  4. 跑步

    systemctl stop systemd-journal-flush.service systemd-journald.service systemd-journald-dev-log.socket systemd-journald.socket

  5. 跑步

    systemctl restart rsyslog

  6. 验证消息出现在/var/log/messages 等人

您可能需要调整其中一些命令 - 特别是通过禁用更多 systemd 服务。

答案3

禁用此服务不会阻止您的设备运行,但日志记录将明显停止。我没有看到其他问题。

相关内容