Documentation for a newer release is available. View Latest

查看和管理日志文件

当试图排除系统问题时,如试图加载内核驱动程序或寻找未经授权的系统登录尝试,日志文件可能非常有用。 本章讨论到哪里查找日志文件,如何查看日志文件,以及在日志文件中查找什么。 某些日志文件由守护进程 rsyslogd 控制。rsyslogd 守护进程是对 sysklogd 的一个增强的替代,并提供了扩展的消息过滤、加密保护、各种配置选项、输入和输出模块,支持通过 TCPUDP 协议传输。请注意, rsyslogsysklogd 兼容。

日志文件也可以由 systemd 的组件 journald 守护进程管理 。 journald 守护进程捕获 Syslog 消息、内核日志消息、初始 RAM 磁盘和早期引导消息,以及所有服务写入标准输出和标准错误输出的消息,对它们进行索引,并让用户可以使用这些消息。本机 journal 日志文件格式是结构化和索引的二进制文件,它改进了搜索并提供了更快的操作,还存储了时间戳或用户 id 等元数据信息。由 journald 生成的日志文件默认情况下是不持久的,日志文件只存储在内存中或 /run/Log/journal/ 目录下的一个小的循环缓冲区中。日志数据的数量取决于可用内存,当达到容量限制时,最老的条目将被删除。但是,这个设置可以修改,参阅 Enabling Persistent Storage。有关日志的更多信息,请参阅 Using the Journal

默认情况下,系统上只安装 journald。你必须自己安装 rsyslog。在继续本指南的其余部分之前,不要忘记在安装之后启用并启动它。journald 守护进程是故障排除的主要工具。它还提供了创建结构化日志消息所需的额外数据。journald 获取的数据被转发到 /run/systemd/journal/syslog 套接字,rsyslogd 可能会使用该套接字进一步处理数据。然而,rsyslog 在默认情况下通过 imjournal 输入模块进行实际的集成,从而避免了前面提到的套接字。您也可以使用 omjournal 模块以相反的方向,从 rsyslogdjournald 传输数据。详细信息请参见 Interaction of Rsyslog and Journal。该集成支持以一致的格式维护基于文本的日志,以确保与可能依赖于 rsyslogd 的应用程序或配置的兼容性。另外,你可以用结构化的格式来维护 rsyslog 消息(参见 Structured Logging with Rsyslog)。

定位日志文件

在 /etc/rsyslog.conf 配置文件中可以找到由 rsyslogd 维护的日志文件列表。大多数日志文件位于 /var/log/ 目录下。一些应用程序,如 httpdsamba/var/log/ 中有一个目录来存放它们的日志文件。 你可能会注意到 /var/log/ 目录下有多个文件后面都有数字(例如,cron-20100906)。这些数字表示已添加到轮换日志文件中的时间戳。日志文件被轮转,因此它们的文件大小不会变得太大。logrotate 包,包含一个cron任务,该任务根据 /etc/logrotate.conf 配置文件和 /etc/logrotate.d/ 目录中的配置文件自动轮换日志文件。

Rsyslog 的基本配置

rsyslog 的主要配置文件是 /etc/rsyslog.conf 。在这里,您可以指定由 filter 和 action 部分组成的 global directives、modules 和 rules。此外,您可以在井号 (#) 后以文本形式添加注释。

过滤器

规则由 filter 部分指定,它选择 syslog 消息的子集,以及用选定的消息做什么的 action 部分。要在 /etc/rsyslog.conf 配置文件中定义规则,请在一行上定义过滤器和操作,并用一个或多个空格或制表符分隔它们。

rsyslog 提供了多种方法来根据选定的属性过滤 syslog 消息。可用的过滤方法可分为 Facility/Priority-basedProperty-basedExpression-based 过滤器。

基于设施/优先级的过滤器

过滤系统日志消息最常用和众所周知的方法是使用基于设施/优先级的过滤器,它根据两个条件过滤系统日志消息:facilitypriority 用点分隔。要创建选择器,请使用以下语法:

FACILITY.PRIORITY

其中:

  • FACILITY 指定产生特定系统日志消息的子系统。例如,mail 子系统处理所有与邮件相关的系统日志消息。FACILITY 可以由以下关键字(或数字代码)之一表示:kern (0)、user (1)、mail (2)、daemon (3), auth (4), syslog (5), lpr (6), news (7), uucp (8), cron (9), authpriv (10), ftp (11), ntp (12), logaudit (13)、logalert (14)、clock (15) 和 local0local7 (16 - 23)。

  • PRIORITY 指定系统日志消息的优先级。PRIORITY 可以由以下关键字(或数字)之一表示:debug (7)、info (6)、notice (5)、[command] warning (4)、err (3)、crit (2)、alert (1) 和 emerg (0)。

上述语法选择具有定义或 更高 优先级的系统日志消息。通过在任何优先级关键字前面加上等号 (=),您可以指定仅选择具有指定优先级的系统日志消息。所有其他优先级将被忽略。相反,在优先级关键字前面加上感叹号 (!) 会选择除具有已定义优先级的消息之外的所有 syslog 消息。

除了上面指定的关键字之外,您还可以使用星号 (*) 来定义所有设施或优先级(取决于您把星号放在逗号之前或之后)。指定优先级关键字“none”用于没有给定优先级的设施。设施条件和优先级条件都不区分大小写。

要定义多个设施和优先级,请用逗号 (,) 分隔它们。要在一行上定义多个选择器,请用分号 (;) 分隔它们。请注意,选择器字段中的每个选择器都能够覆盖前面的选择器,这可以从模式中排除一些优先级。

Example 1. 设施/基于优先级的过滤器

以下是一些简单的可以在 /etc/rsyslog.conf 中指定的基于设施/优先级的过滤器示例。要选择具有任何优先级的所有内核系统日志消息,请将以下文本添加到配置文件中:

kern.*

要选择具有优先级 crit 和更高优先级的所有邮件系统日志消息,请使用:

mail.crit

要选择除具有 infodebug 优先级的消息之外的所有 cron syslog 消息,请设置如下配置:

cron.!info,!debug
基于优先级的过滤器

基于属性的过滤器允许您按任何属性过滤系统日志消息,例如 timegeneratedsyslogtag。有关属性的详细信息,请参阅:Properties。您可以使用 Property-based compare-operations 中列出的比较操作之一将每个指定属性与特定值进行比较。属性名称和比较操作都区分大小写。

基于属性的过滤器必须以冒号 (:) 开头。要定义过滤器,请使用以下语法:

:PROPERTY, [!]COMPARE_OPERATION, "STRING"

其中:

  • PROPERTY 属性指定所需的属性。

  • 可选的感叹号 (!) 否定比较操作的输出。基于属性的过滤器目前不支持其他布尔运算符。

  • COMPARE_OPERATION 属性指定 Property-based compare-operations 中列出的比较操作之一。

  • STRING 属性指定与属性提供的文本进行比较的值。该值必须用引号引起来。要转义字符串中的某些字符(例如引号 (")),请使用反斜杠字符 (\)。

Table 1. 基于优先级的比较操作
比较操作 描述

contains

检查提供的字符串是否与属性提供的文本的任何部分匹配。要执行不区分大小写的比较,请使用 contains_i

isequal

将提供的字符串与属性提供的所有文本进行比较。这两个值必须完全相等才能匹配。

startswith

检查提供的字符串是否恰好位于属性提供的文本的开头。要执行不区分大小写的比较,请使用 startswith_i

regex

将提供的 POSIX BRE(基本正则表达式)与属性提供的文本进行比较。

ereregex

将提供的 POSIX ERE(扩展正则表达式)与属性提供的文本进行比较。

isempty

检查属性是否为空。该值被丢弃。这在处理规范化数据时特别有用,其中某些字段可能会根据规范化结果填充。

Example 2. 基于属性的过滤器

下面是一些可以在 /etc/rsyslog.conf 中指定的基于属性的过滤器的例子。要选择消息文本中包含字符串 error 的 syslog 消息,请使用:

:msg, contains, "error"

以下过滤器选择从主机名为 host1 的主机接收的 syslog 消息:

:hostname, isequal, "host1"

要选择不包含任何提及 fatalerror 且它们之间有或没有任何文本的系统日志消息(例如,fatal lib error),请键入:

:msg, !regex, "fatal .* error"
基于表达式的过滤器

基于表达式的过滤器根据定义的算术、布尔或字符串操作选择系统日志消息。基于表达式的过滤器使用 rsyslog 自己的脚本语言 RainerScript 来构建复杂的过滤器。

基于表达式的过滤器的基本语法如下所示:

if EXPRESSION then ACTION else ACTION

其中:

  • EXPRESSION 属性表示要评估的表达式,例如:$msg startswith 'DEVNAME'$syslogfacility-text == 'local0'。您可以使用 andor 运算符在单个过滤器中指定多个表达式。

  • ACTION 属性表示如果表达式返回值 true 时要执行的操作。这可以是单个操作,也可以是用大括号括起来的任意复杂脚本。

  • 新行开头的 if 关键字指示基于表达式的过滤器。then 关键字将 EXPRESSIONACTION 分开。您可以选择使用 else 关键字来指定在不满足条件时要执行的操作。

使用基于表达式的过滤器,您可以使用用大括号括起来的脚本来嵌套条件,如 Expression-based Filters 中所示。该脚本允许您在表达式中使用 facility/priority-based 过滤器。另一方面,这里不推荐使用 property-based 过滤器。RainerScript 支持具有专用函数 re_match()re_extract() 的正则表达式。

Example 3. 基于表达式的过滤器

以下表达式包含两个嵌套条件。由名为 prog1 的程序创建的日志文件根据消息中是否存在“test”字符串分为两个文件。

if $programname == 'prog1' then {
   action(type="omfile" file="/var/log/prog1.log")
   if $msg contains 'test' then
     action(type="omfile" file="/var/log/prog1test.log")
   else
     action(type="omfile" file="/var/log/prog1notest.log")
}

参考 Online Documentation 以获取更多基于表达式的过滤器的示例。RainerScript 是 rsyslog 的新配置格式的基础,参见 Using the New Configuration Format

操作

操作指定要对已定义的选择器过滤掉的消息执行什么操作。以下是您可以在规则中定义的一些操作:

将 syslog 消息保存到日志文件

大多数操作指定将 syslog 消息保存到哪个日志文件。这是通过在已定义的选择器之后指定文件路径来完成的:

FILTER PATH

其中 FILTER 代表用户指定的选择器,PATH 是目标的路径文件。

例如,以下规则由选择所有 cron syslog 消息的选择器和将它们保存到 /var/log/cron.log 日志文件的操作组成:

cron.* /var/log/cron.log

默认情况下,每次生成 syslog 消息时都会同步日志文件。使用破折号 (-) 作为您指定省略同步的文件路径的前缀:

FILTER -PATH

请注意,如果系统在写入尝试后立即终止,可能会造成信息丢失。但是,此设置可以提高性能,尤其是在您运行产生非常冗长的日志消息的程序时。

您指定的文件路径可以是 staticdynamic 的。静态文件由固定文件路径表示,如上例所示。动态文件路径可以根据收到的消息而有所不同。动态文件路径由模板和问号 (?) 前缀表示:

FILTER ?DynamicFile

其中 DynamicFile 是修改输出路径的预定义模板的名称。您可以使用破折号前缀 (-) 禁用同步,也可以使用由冒号 (:) 分隔的多个模板。有关模板的详细信息,请参照 Generating Dynamic File Names

如果您指定的文件是现有的 terminal/dev/console 设备,在使用 X Window 系统时,系统日志消息将分别发送到标准输出(使用特殊的 terminal-handling)或您的控制台(使用特殊的 /dev/console-handling) 。

通过网络发送 syslog 消息

rsyslog 允许您通过网络发送和接收 syslog 消息。此功能允许您在一台机器上管理多个主机的系统日志消息。要将系统日志消息转发到远程计算机,请使用以下语法:

@(zNUMBER)HOST:PORT

其中:

  • at 符号 (@) 表示系统日志消息使用 UDP 协议转发到主机。要使用 TCP 协议,请使用两个 at 符号,它们之间没有空格 (@@)。

  • 可选的 zNUMBER 设置为 syslog 消息启用 zlib 压缩。NUMBER 属性指定压缩级别(从最低值1到最大值9)。压缩收益由 rsyslogd 自动检查,仅当有任何压缩收益时才会压缩消息,并且永远不会压缩低于 60 字节的消息。

  • HOST 属性指定接收所选系统日志消息的主机。

  • PORT 属性指定主机的端口。

将“IPv6”地址指定为主机时,请将地址括在方括号中([, ])。

Example 4. 通过网络发送系统日志消息

以下是通过网络转发 syslog 消息的一些操作示例(请注意,所有操作前面都有一个选择器,该选择器选择具有任何优先级的所有消息)。要通过 UDP 协议将消息转发到 192.168.0.1,请键入:

*.* @192.168.0.1

使用端口 18 和 TCP 协议将消息转发到“example.com”,使用:

*.* @@example.com:18

以下使用 zlib 压缩消息(9 级压缩)并使用 UDP 协议将它们转发到 2001:db8::1

*.* @(z9)[2001:db8::1]
输出通道

输出通道主要用于指定日志文件可以增长到的最大大小。这对于日志文件轮换非常有用(有关更多信息,请参阅 Log Rotation)。输出通道基本上是有关输出操作的信息的集合。输出通道由 $outchannel 指令定义。要在 /etc/rsyslog.conf 中定义输出通道,请使用以下语法:

$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION

其中:

  • NAME 属性指定输出通道的名称。

  • FILE_NAME 属性指定输出文件的名称。输出通道只能写入文件,不能写入管道、终端或其他类型的输出。

  • MAX_SIZE 属性表示指定文件(在 FILE_NAME 中)可以增长到的最大大小。该值以 bytes 指定。

  • ACTION 属性指定在达到 MAX_SIZE 中定义的最大值时采取的操作。

要将定义的输出通道用作规则内的操作,请键入:

FILTER :omfile:$NAME
Example 5. 输出通道日志轮换

以下输出显示了通过使用输出通道进行的简单日志轮换。首先,通过`$outchannel`指令定义输出通道:

 $outchannel log_rotation, /var/log/test_log.log, 104857600, /home/joe/log_rotation_script

然后应用于选择任何优先级的 syslog 消息的规则,并在把获取的 syslog 消息输出到先前定义的输出通道:

*.* :omfile:$log_rotation

一旦达到限制(在示例中为 100{nbsp }MB) ,/home/joe/log_rotation_script 被执行。该脚本可以包含任何内容,包括将文件移动到不同的文件夹、编辑其中的特定内容或简单地删除它。

向特定用户发送 syslog 消息

rsyslog 可以通过指定用户名向特定用户发送 syslog 消息(如 Specifying Multiple Actions 所述)。要指定多个用户,请用逗号 (,) 分隔每个用户名。要向当前登录的每个用户发送消息,请使用星号 (*)。

执行程序

rsyslog 允许您为选定的 syslog 消息执行程序,并使用 system() 调用在 shell 中执行程序。要指定要执行的程序,请在其前面加上插入字符 (^)。随后,指定一个模板来格式化接收到的消息并将其作为单行参数传递给可执行文件(有关模板的更多信息,请参阅:Templates)。

FILTER ^EXECUTABLE; TEMPLATE

这里 FILTER 条件的输出由 EXECUTABLE 表示的程序处理。该程序可以是任何有效的可执行文件。将 TEMPLATE 替换为格式模板的名称。

Example 6. 执行程序

在下面的例子中,任何具有任何优先级的系统日志消息都会被选中,使用 template 模板格式化并作为参数传递给 test-program 程序,然后使用提供的参数执行:

*.* ^test-program;template
使用 shell 执行操作时要小心

当接受来自任何主机的消息并使用 shell 执行操作时,您可能容易受到命令注入攻击。攻击者可能会尝试在您执行的程序中注入和执行命令。为避免任何可能的安全威胁,请仔细考虑此操作。

在数据库中存储 syslog 消息

可以使用 database writer 操作将选定的 syslog 消息直接写入数据库表中。数据库写入使用以下语法:

:PLUGIN:DB_HOST,DB_NAME,DB_USER,DB_PASSWORD;TEMPLATE

其中:

  • PLUGIN 调用指定的处理数据库写入的插件(例如,ommysql 插件)。

  • DB_HOST 属性指定数据库主机名。

  • DB_NAME 属性指定数据库的名称。

  • DB_USER 属性指定数据库用户。

  • DB_PASSWORD 属性指定用于上述数据库用户的密码。

  • TEMPLATE 可选属性指定修改系统日志消息的模板。有关模板的详细信息,请参阅:Templates

使用 MySQL 和 PostgreSQL

目前,rsyslog 仅支持 MySQLPostgreSQL 数据库。为了使用 MySQLPostgreSQL 数据库写入功能,请分别安装 rsyslog-mysqlrsyslog-pgsql 软件包。此外,请确保在 /etc/rsyslog.conf 配置文件中加载适当的模块:

$ModLoad ommysql    # Output module for MySQL support
$ModLoad ompgsql    # Output module for PostgreSQL support

更多有关 rsyslog 模块的信息,请参阅:使用 Rsyslog 模块

或者,您可以使用“omlibdb”模块提供的通用数据库接口(支持:Firebird/Interbase、MS SQL、Sybase、SQLLite、Ingres、Oracle、mSQL)。

丢弃系统日志消息

要丢弃您选择的消息,请使用波浪号 (~)。

FILTER ~

丢弃动作主要用于在进行任何进一步处理之前过滤掉消息。如果您想省略一些会填满日志文件的重复消息,它可能会很有效。丢弃操作的结果取决于在配置文件中指定的位置,为了获得最佳结果,请将这些操作放在操作列表的顶部。请注意,一旦消息被丢弃,就无法在以后的配置文件行中检索它。

例如,以下规则丢弃任何 cron 系统日志消息:

cron.* ~
指定多个操作

对于每个选择器,您可以指定多个操作。要为一个选择器指定多个操作,请将每个操作写在单独的行上,并在其前面加上一个 & 字符:

FILTER ACTION
& ACTION
& ACTION

多个操作提高了预期结果的整体性能,因为指定的选择器只需评估一次。

Example 7. 指定多个操作

在以下示例中,所有具有关键优先级 (crit) 的内核 syslog 消息都发送给用户 user1,由模板 temp 处理并传递给 test-program 可执行文件,然后通过 UDP 协议转发到 192.168 .0.1

kern.=crit user1
& ^test-program;temp
& @192.168.0.1

任何操作都可以跟随一个模板来格式化消息。要指定模板,请使用分号 (;) 为操作添加后缀并指定模板的名称。有关模板的详细信息,请参阅:Templates

使用模板

模板必须在用于操作之前定义,否则将被忽略。换句话说,模板定义应该总是在 /etc/rsyslog.conf 中的规则定义之前。

模板

rsyslog 生成的任何输出都可以使用 templates 根据您的需要进行修改和格式化。要创建模板,请在 /etc/rsyslog.conf 中使用以下语法:

$template TEMPLATE_NAME,"text %PROPERTY% more text", OPTION

其中:

  • $template 是模板指令,指示它后面的文本定义了一个模板。

  • TEMPLATE_NAME 是模板的名称。使用此名称来引用模板。

  • 两个引号 (“…”) 之间的任何内容都是实际的模板文本。在此文本中,可以使用特殊字符,例如用于换行的“\n”或用于回车的“\r”。其他字符,例如 %",如果您想按字面意思使用这些字符,则必须转义。

  • 在两个百分号 (%) 之间指定的文本指定了一个允许您访问特定内容的 property 系统日志消息。有关属性的更多信息,请参阅:Properties

  • OPTION 属性指定修改模板功能的任何选项。当前支持的模板选项是 sqlstdsql,它们用于将文本格式化为 SQL 查询。

sql 和 stdsql 选项

请注意,数据库写入器检查是否在模板中指定了 sqlstdsql 选项。如果不是,则数据库写入器不执行任何操作。这是为了防止任何可能的安全威胁,例如 SQL 注入。

有关详细信息,请参阅:Actions 中的 Storing syslog messages in a database 部分。

生成动态文件名

模板可用于生成动态文件名。通过将属性指定为文件路径的一部分,将为每个唯一属性创建一个新文件,这是对 syslog 消息进行分类的便捷方式。

例如,使用从消息中提取时间戳的 timegenerated 属性为每个 syslog 消息生成唯一的文件名:

$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"

请记住,$template 指令仅指定模板。您必须在规则中使用它才能生效。在 /etc/rsyslog.conf 中,在操作定义中使用问号 (?) 来标记动态文件名模板:

*.* ?DynamicFile
属性

Properties 在模板内定义的属性(在两个百分号 (%) 之间)允许通过使用 property replacer 访问系统日志消息的各种内容。要在模板内定义属性(在两个引号之间 (“…”)),请使用以下语法:

%PROPERTY_NAME:FROM_CHAR:TO_CHAR:OPTION%

其中:

  • PROPERTY_NAME 属性指定一个属性。所有可用属性的列表及其详细描述可以在 rsyslog.conf(5) 手册页的 Available Properties 部分下找到。

  • FROM_CHAR_ 和 TO_CHAR 属性表示指定属性起作用的字符范围。或者,可以使用正则表达式来指定字符范围。为此,请将字母“R”设置为 FROM_CHAR 属性,并将所需的正则表达式指定为 TO_CHAR 属性。

  • OPTION 属性指定任何属性选项,例如将输入转换为小写的 lowercase 选项。所有可用属性选项的列表及其详细说明可以在 rsyslog.conf(5) 手册页的 Property Options 部分找到。

以下是一些简单属性的示例:

  • 以下属性获取系统日志消息的整个消息文本:

%msg%
  • 以下属性获取系统日志消息的消息文本的前两个字符:

%msg:1:2%
  • 以下属性获取系统日志消息的整个消息文本并删除其最后一个换行符:

%msg:::drop-last-lf%
  • 以下属性获取收到 syslog 消息时生成的时间戳的前 10 个字符,并根据 RFC 3339 日期标准对其进行格式化。

%timegenerated:1:10:date-rfc3339%
Template 示例

本节介绍 rsyslog 模板的几个示例。

A verbose syslog message template 显示了一个格式化 syslog 消息的模板,以便输出消息的严重性、设施、收到消息时的时间戳、主机名、消息标签、消息文本,并以新行结束。

Example 8. 一个详细的系统日志消息模板
$template verbose, "%syslogseverity%, %syslogfacility%, %timegenerated%, %HOSTNAME%, %syslogtag%, %msg%\n"

A wall message template 显示了一个类似于传统墙上消息的模板(该消息发送给每个登录的用户,并且他们的 mesg(1) 权限设置为 yes)。此模板在新行上输出消息文本以及主机名、消息标记和时间戳(使用 \r\n)并响铃(使用 \7)。

Example 9. 信息墙模板
$template wallmsg,"\r\n\7Message from syslogd@%HOSTNAME% at %timegenerated% ...\r\n %syslogtag% %msg%\n\r"

A database formatted message template 显示了一个格式化系统日志消息的模板,以便它可以用作数据库查询。请注意模板末尾指定了 sql 选项。它告诉数据库写入器将消息格式化为 MySQL SQL 查询。

Example 10. 数据库格式的消息模板
$template dbFormat,"insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%', %syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')", sql

rsyslog 还包含一组由 RSYSLOG_ 前缀标识的预定义模板。这些是为 syslog 保留的,建议不要使用此前缀创建模板以避免冲突。以下列表显示了这些预定义模板及其定义。

RSYSLOG_DebugFormat

用于解决属性问题的特殊格式。

"Debug line with all properties:\nFROMHOST: '%FROMHOST%', fromhost-ip: '%fromhost-ip%', HOSTNAME: '%HOSTNAME%', PRI: %PRI%,\nsyslogtag '%syslogtag%', programname: '%programname%', APP-NAME: '%APP-NAME%', PROCID: '%PROCID%', MSGID: '%MSGID%',\nTIMESTAMP: '%TIMESTAMP%', STRUCTURED-DATA: '%STRUCTURED-DATA%',\nmsg: '%msg%'\nescaped msg: '%msg:::drop-cc%'\nrawmsg: '%rawmsg%'\n\n\"
RSYSLOG_SyslogProtocol23Format

IETF 的互联网草案 ietf-syslog-protocol-23 中指定的格式,假定会成为新的 syslog 标准 RFC。

"%PRI%1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n\"
RSYSLOG_FileFormat

现代风格的日志文件格式,类似于传统文件格式,但具有高精度的时间戳和时区信息。

"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"
RSYSLOG_TraditionalFileFormat

具有低精度时间戳的较旧的默认日志文件格式。

"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"
RSYSLOG_ForwardFormat

具有高精度时间戳和时区信息的转发格式。

"%PRI%%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"
RSYSLOG_TraditionalForwardFormat

低精度时间戳的传统转发格式。

"%PRI%%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"

全局指令

全局指令是适用于 rsyslogd 守护进程的配置选项。他们通常为特定的预定义变量指定一个值,该变量会影响 rsyslogd 守护进程的行为或遵循的规则。所有全局指令都必须以美元符号 ($) 开头。每行只能指定一个指令。以下是指定 syslog 消息队列最大大小的全局指令示例:

$MainMsgQueueSize 50000

该指令的默认大小为 10,000 条消息,可以通过指定不同的值来覆盖它(如上例所示)。

您可以在 /etc/rsyslog.conf 配置文件中定义多个指令。指令会影响所有配置选项的行为,直到检测到同一指令再次出现。全局指令可用于配置操作、队列和调试。可以在参考 在线文档中找到所有可用配置指令的完整列表。目前,已开发出一种新的配置格式来替代基于 $ 的语法(请参阅:Using the New Configuration Format)。但是,经典的全局指令仍然作为传统格式得到支持。

日志轮换

以下是一个示例 /etc/logrotate.conf 配置文件:

# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# uncomment this if you want your log files compressed
compress

示例配置文件中的所有行都定义了适用于每个日志文件的全局选项。在我们的示例中,日志文件每周轮换一次,轮换的日志文件保存 4 周,所有轮换的日志文件都通过 gzip 压缩为 .gz 格式。任何以井号 (#) 开头的行都是注释,不会被处理。

您可以为特定日志文件定义配置选项并将其放在全局选项下。但是,建议在 /etc/logrotate.d/ 目录中为任何特定日志文件创建一个单独的配置文件,并在那里定义任何配置选项。

以下是放置在 /etc/logrotate.d/ 目录中的配置文件示例:

/var/log/messages {
    rotate 5
    weekly
    postrotate
    /usr/bin/killall -HUP syslogd
    endscript
}

此文件中的配置选项仅适用于 /var/log/messages 日志文件。此处指定的设置会尽可能覆盖全局设置。因此,轮换的 /var/log/messages 日志文件将保存五周,而不是全局选项中定义的四周。

以下是您可以在 logrotate 配置文件中指定的一些指令列表:

  • weekly — 指定按周轮换。类似的指令包括:

    • daily

    • monthly

    • yearly

  • compress — 启用循环日志文件的压缩。类似的指令包括:

    • nocompress

    • compresscmd — 指定用于压缩的命令。

    • uncompresscmd

    • compressext — 指定用于压缩的扩展名。

    • compressoptions — 指定要传递给使用的压缩程序的任何选项。

    • delaycompress — 将日志文件的压缩推迟到日志文件的下一个轮换。

  • rotate INTEGER - 指定日志文件在被删除或邮寄到特定地址之前所经历的轮换次数。如果指定了值 0,旧的日志文件将被删除而不是轮换。

  • mail ADDRESS - 此选项允许将已轮换多次的日志文件邮寄到指定地址。类似的指令包括:

    • nomail

    • mailfirst — 指定要邮寄刚刚轮换的日志文件,而不是即将过期的日志文件。

    • maillast — 指定要邮寄即将到期的日志文件,而不是刚刚轮换的日志文件。这是启用“邮件”时的默认选项。

有关指令和各种配置选项的完整列表,请参阅 logrotate(8) 手册页。

使用新配置格式

rsyslog 版本 6 中,引入了新的配置语法。这种新的配置格式旨在更强大、更直观,并通过不允许某些无效构造来防止常见错误。语法增强由依赖 RainerScript 的新配置处理器启用。其仍然完全支持旧格式,默认情况下在 /etc/rsyslog.conf 配置文件中使用。

RainerScript 是一种脚本语言,设计用于处理网络事件和配置事件处理器,例如 rsyslog。RainerScript 最初用于定义基于表达式的过滤器,请参阅:Expression-based Filters。rsyslog 版本 7 中的 RainerScript 版本实现了 input()ruleset() 语句,允许以新语法编写 /etc/rsyslog.conf 配置文件。新语法的不同之处主要在于它更加结构化。参数作为语句的参数传递给语句,例如输入、操作、模板和模块加载。选项的范围受块的限制。这增强了可读性并减少了由错误配置引起的错误。还显著提高了性能。

比较使用 legacy-style 参数编写的配置:

$InputFileName /tmp/inputfile
$InputFileTag tag1:
$InputFileStateFile inputfile-state
$InputRunFileMonitor

和使用新格式声明的相同配置:

input(type="imfile" file="/tmp/inputfile" tag="tag1:" statefile="inputfile-state")

这显着减少了配置中使用的参数数量,提高了可读性,还提供了更高的执行速度。有关 RainerScript 语句和参数的更多信息,请参阅: Online Documentation

规则集

撇开特殊指令不谈,rsyslog 按照 rules 处理消息,rules 由过滤条件和条件为真时要执行的操作组成。使用传统的 /etc/rsyslog.conf 文件,所有规则都按照每个输入消息的出现顺序进行评估。此过程从第一条规则开始,一直持续到所有规则都已处理完毕或消息被其中一条规则丢弃为止。

但是,可以将规则分组为称为 rulesets 的序列。使用规则集,您可以将某些规则的影响仅限于选定的输入,或通过定义绑定到特定输入的一组不同的操作来提高 rsyslog 的性能。换句话说,对于某些类型的消息,不可避免地会被评估为假的过滤条件可以被跳过。/etc/rsyslog.conf 中的旧规则集定义如下所示:

$RuleSet rulesetname
rule
rule2

规则在定义另一个规则时结束,或者默认规则集被如下调用:

$RuleSet RSYSLOG_DefaultRuleset

在 rsyslog 7 的新配置格式中,input()ruleset() 语句被保留用于此操作。/etc/rsyslog.conf 中的新格式规则集定义如下所示:

ruleset(name="rulesetname") {
      rule
      rule2
      call rulesetname2
      …
}

rulesetname 替换为您的规则集的标识符。规则集名称不能以 RSYSLOG_ 开头,因为此命名空间保留给 rsyslog 使用。如果消息没有分配其他规则集,则 RSYSLOG_DefaultRuleset 定义默认规则集。rulerule2 定义上述过滤操作格式的规则。使用 call 参数,您可以通过从其他规则集块中调用它们来嵌套规则集。

创建规则集后,您需要指定它应用于哪些输入:

input(type="input_type" port="port_num" ruleset="rulesetname");

在这里,您可以通过 input_type(收集消息的输入模块)或 port_num ( 端口号)来识别输入消息。可以为 input() 指定其他参数,例如 filetag。将 rulesetname 替换为要根据消息评估的规则集的名称。如果输入消息未明确绑定到规则集,则会触发默认规则集。

您还可以使用旧格式来定义规则集,有关详细信息,请参阅:在线文档

Example 11. 使用规则集

以下规则集确保对来自不同端口的远程消息进行不同的处理。添加以下内容到 /etc/rsyslog.conf:

ruleset(name="remote-10514") {
    action(type="omfile" file="/var/log/remote-10514")
}

ruleset(name="remote-10515") {
    cron.* action(type="omfile" file="/var/log/remote-10515-cron")
    mail.* action(type="omfile" file="/var/log/remote-10515-mail")
}

input(type="imtcp" port="10514" ruleset="remote-10514");
input(type="imtcp" port="10515" ruleset="remote-10515");

上例中显示的规则集定义了来自两个端口的远程输入的日志目的地,如果是 10515,则根据设施对消息进行排序。然后,TCP 输入被启用并绑定到规则集。请注意,您必须加载所需的模块 (imtcp) 才能使此配置正常工作。

与 syslogd 的兼容性

rsyslog 版本 6 开始,通过 -c 选项指定的兼容模式已被删除。此外,不推荐使用 syslogd 样式的命令行选项,应避免通过这些命令行选项配置 rsyslog。但是,您可以使用多个模板和指令来配置 rsyslogd 以模拟类似 syslogd 的行为。

有关各种 rsyslogd 选项的更多信息,请参阅 rsyslogd(8) 手册页。

在 Rsyslog 中使用队列

队列用于在 rsyslog 的组件之间传递内容,主要是 syslog 消息。使用队列,rsyslog 能够同时处理多条消息,并一次将多个操作应用于单个消息。rsyslog 内部的数据流可以表示如下:

Rsyslog 中的消息流
Figure 1. Rsyslog 中的消息流

每当 rsyslog 收到消息时,它将这条消息传递给预处理器,然后将其放入主消息队列 。消息在那里等待出列并传递给规则处理器。

规则处理器 是一个解析和过滤引擎。在这里,应用了`/etc/rsyslog.conf` 中定义的规则。基于这些规则,规则处理器评估要执行哪些操作。每个动作都有自己的动作队列。消息通过此队列传递到创建最终输出的相应操作处理器。请注意,此时,可以在一条消息上同时运行多个操作。为此,一条消息被复制并传递给多个动作处理器。

每个动作只能有一个队列。根据配置,消息可以直接发送到动作处理器,而无需动作队列。这是 直接队列 的行为(见下文)。如果输出动作失败,动作处理器会通知动作队列,然后队列会取回一个未处理的元素,并在一段时间间隔后再次尝试该动作。

综上所述,队列在 rsyslog 中有两个位置:要么作为单个 主消息队列 在规则处理器之前,要么作为 action queues 在各种类型的输出操作之前。队列提供了两个主要优势,这两个优势都可以提高消息处理的性能:

  • 它们充当缓冲区,在 rsyslog 的结构中 解耦 生产者和消费者

  • 它们允许对消息执行的操作 并行化

除此之外,可以使用多个指令配置队列,以为您的系统提供最佳性能。以下部分介绍了这些配置选项。

如果输出插件无法传递消息,则将其存储在前面的消息队列中。如果队列已满,则输入会阻塞,直到不再满为止。这将防止通过阻塞队列记录新消息。在没有单独的操作队列的情况下,这可能会产生严重的后果,例如阻止“SSH”日志记录,这反过来又会阻止“SSH”访问。因此,建议对通过网络或数据库转发的输出使用专用的操作队列。

定义队列

根据消息的存储位置,有几种使用最广泛的队列类型:directin-memorydiskdisk-assisted in-memory 队列。您可以为主消息队列和操作队列选择其中一种类型。将以下内容添加到`/etc/rsyslog.conf`中:

$objectQueueType queue_type

在这里,您可以把设置应用于主消息队列(将 object 替换为 MainMsg)或应用于操作队列(将 object 替换为 Action)。将 queue_type 替换为 directlinkedlistfixedarray(内存队列)或 disk 之一。

主消息队列的默认设置是 FixedArray 队列,限制为 10,000 条消息。动作队列默认设置为直接队列。

直接队列

对于许多简单的操作,例如将输出写入本地文件时,不需要在操作之前构建队列。为避免排队,请使用:

$objectQueueType Direct

object 替换为 MainMsgAction 分别将此选项用于主消息队列或操作队列。使用直接队列,消息直接并立即从生产者传递到消费者。

磁盘队列

磁盘队列将消息严格存储在硬盘驱动器上,这使得它们非常可靠,但也是所有可能的队列模式中最慢的。此模式可用于防止丢失非常重要的日志数据。但是,在大多数用例中不建议使用磁盘队列。要设置磁盘队列,请在 /etc/rsyslog.conf 中键入以下内容:

$objectQueueType Disk

object 替换为 MainMsgAction 以分别将此选项应用于主消息队列或操作队列。磁盘队列按部分写入,默认大小为 10 Mb。可以使用以下配置指令修改此默认大小:

$objectQueueMaxFileSize size

其中 size 表示磁盘队列部分的大小。定义的大小限制不是限制性的,rsyslog 总是写入一个完整的队列条目,即使它违反了大小限制。磁盘队列的每个部分都与单个文件匹配。这些文件的命名指令如下所示:

$objectQueueFilename name

这设置了一个 name 文件前缀后跟一个 7 位数字,从 1 开始,每个文件递增。

内存队列

使用内存队列,排队的消息被保存在内存中,这使得进程非常快。如果计算机重启或关闭,排队的数据会丢失。但是,您可以使用 $ActionQueueSaveOnShutdown 设置在关机前保存数据。内存中的队列有两种类型:

  • FixedArray 队列 — 主消息队列的默认模式,限制为 10,000 个元素。这种类型的队列使用一个固定的、预先分配的数组来保存指向队列元素的指针。由于这些指针,即使队列为空,也会消耗一定量的内存。但是,FixedArray 提供了最佳的运行时性能,并且当您期望相对较少的排队消息和高性能时,它是最佳选择。

  • LinkedList 队列 — 在这里,所有结构都在链表中动态分配,因此仅在需要时分配内存。LinkedList 队列可以很好地处理偶尔的突发消息。

一般来说,如有疑问,请使用 LinkedList 队列。与 FixedArray 相比,它消耗更少的内存并降低了处理开销。

使用以下语法配置内存队列:

$objectQueueType LinkedList
$objectQueueType FixedArray

object 替换为 MainMsgAction 以分别将此选项用于主消息队列或操作队列。

磁盘辅助的内存队列

磁盘和内存队列各有它们的优势,rsyslog 让您可以将它们组合成 磁盘辅助的内存队列。为此,请配置一个普通的内存队列,然后添加 $objectQueueFileName 指令来定义磁盘辅助的文件名。然后,此队列变为 磁盘辅助,这意味着它将内存队列与磁盘队列耦合以协同工作。

如果内存队列已满或需要在关机后保留,则磁盘队列被激活。使用磁盘辅助队列,您可以设置特定于磁盘的配置参数和特定于内存的配置参数。这种类型的队列可能是最常用的,它对于可能长时间运行且不可靠的操作特别有用。

要指定磁盘辅助内存队列的功能,请使用所谓的 watermarks

$objectQueueHighWatermark number
$objectQueueLowWatermark number

object 替换为 MainMsgAction 以分别将此选项用于主消息队列或操作队列。将 number 替换为排队的消息。当内存中的队列达到高水位线定义的数量时,它开始将消息写入磁盘并继续,直到内存中的队列大小下降到低水位线定义的数量。正确设置水位线可以最大程度地减少不必要的磁盘写入,也会为消息突发留出内存空间,因为写入磁盘文件的时间相当长。因此,高水位线必须低于使用 $objectQueueSize 设置的整个队列容量。高水位线和总队列大小之间的差异是为消息突发保留的备用内存缓冲区。另一方面,高水位线设置得太低会不必要地经常打开磁盘辅助。

Example 12. 可靠地将日志消息转发到服务器

Rsyslog 通常用于维护集中式日志系统,其中日志消息通过网络转发到服务器。为避免服务器不可用时消息丢失,建议为转发操作配置一个操作队列。这样,发送失败的消息将被存储在本地,直到再次可以访问服务器。请注意,此类队列不可配置为使用“UDP”协议的连接。要建立完全可靠的连接,例如当您的日志服务器位于您的专用网络之外时,请考虑使用:使用 RELP 中描述的 RELP 协议。

转发到单个服务器

假设任务是将日志消息从系统转发到主机名为 example.com 的服务器,并配置一个操作队列以在服务器中断时缓冲消息。为此,请执行以下步骤:

  1. 创建一个工作目录来存储队列文件。例如:

~]# mkdir /rsyslog/work/
  1. /etc/rsyslog.conf 中如下配置或在 /etc/rsyslog.d/ 目录中创建具有以下内容的文件:

$WorkDirectory /rsyslog/work

$ActionQueueType LinkedList
$ActionQueueFileName example_fwd
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
*.*       @@example.com:18

其中:

  • 上一步创建的`/rsyslog/work/`目录被标记为工作目录,

  • $ActionQueueType 启用内存中的 LinkedList 队列,

  • $ActionFileName 定义磁盘存储,在这种情况下,备份文件在 /rsyslog/work/ 目录中创建并带有 example_fwd 前缀,

  • $ActionResumeRetryCount -1 设置防止 rsyslog 表单在服务器未响应并重试连接时丢弃消息,

  • 启用 $ActionQueueSaveOnShutdown 则当 rsyslog 关闭时保存内存中的数据,

  • 最后一行将所有收到的消息转发到日志服务器,端口是可选的。

通过上述配置,如果远程服务器无法访问,rsyslog 会将消息保存在内存中。只有当 rsyslog 用完配置的内存队列空间或需要关闭时,才会在磁盘上创建文件,这有利于系统性能。

转发到多个服务器

将日志消息转发到多个服务器的过程与前面的过程类似:

  1. 为 rsyslog 创建一个工作目录来存储队列文件。例如:

~]# mkdir /rsyslog/work/
  1. 每个目标服务器都需要单独的转发规则、操作队列规范和磁盘上的备份文件。例如,在`/etc/rsyslog.conf`中使用如下配置或者在`/etc/rsyslog.d/`目录下创建一个内容如下的文件:

$WorkDirectory /rsyslog/work

$ActionQueueType LinkedList
$ActionQueueFileName example_fwd1
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
*.*       @@example1.com

$ActionQueueType LinkedList
$ActionQueueFileName example_fwd2
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
*.*       @@example2.com

管理队列

所有类型的队列都可以进一步配置以满足您的要求。您可以使用多个指令来修改操作队列和主消息队列。目前,有 20 多个队列参数可用,请参阅:在线文档。其中一些设置是常用的,其他设置(例如工作线程管理)提供对队列行为的更密切控制,并为高级用户保留。通过高级设置,您可以优化 rsyslog 的性能、调度队列或修改系统关闭时队列的行为。

限制队列的大小

您可以使用以下设置限制队列可以包含的消息数量:

$objectQueueHighWatermark number

object 替换为 MainMsgAction 以使此选项分别用于主消息队列或动作队列。将 number 替换为排队的消息。您只能将队列大小设置为消息数,而不是它们的实际内存大小。主消息队列和规则集队列的默认队列大小为 10,000 条消息,操作队列为 1000 条。

磁盘辅助队列默认是无限的,不能用这个指令限制,但是你可以通过以下设置为它们保留物理磁盘空间:

$objectQueueMaxDiscSpace number

object 替换为 MainMsgAction。当达到 number 指定的大小限制时,消息将被丢弃,直到出队的消息释放出足够的空间。

丢弃消息

当队列达到一定数量的消息时,您可以丢弃不太重要的消息,以便为更高优先级的条目节省队列空间。启动丢弃过程的阈值可以用所谓的 丢弃标记 设置:

$objectQueueDiscardMark number

object 替换为 MainMsgAction 以分别将此选项用于主消息队列或操作队列。在这里,number 代表消息队列中的消息达到此数量才开始丢弃。要定义要丢弃的消息,请使用:

$objectQueueDiscardSeverity priority

priority 替换为以下关键字之一(或数字):debug (7)、info (6)、notice (5)、warning (4)、err (3)、crit (2)、alert (1) 和 emerg (0)。使用此设置,在达到丢弃标记后,将立即从队列中删除具有低于定义优先级的新传入和已排队消息。

使用时间范围

您可以配置 rsyslog 以在特定时间段内处理队列。例如,使用此选项,您可以将一些处理转移到非高峰时间。要定义时间范围,请使用以下语法:

$objectQueueDequeueTimeBegin hour
$objectQueueDequeueTimeEnd hour

使用 hour 您可以指定限制时间的小时数框架。使用没有分钟的 24 小时格式。

配置工作线程

一个 worker thread 对排队的消息执行指定的操作。例如,在主消息队列中,一个工作任务是将过滤逻辑应用于每个传入的消息,并将它们排入相关的操作队列。当消息到达时,会自动启动一个工作线程。当消息数量达到一定数量时,会开启另一个工作线程。要指定此数字,请使用:

$objectQueueWorkerThreadMinimumMessages number

number 替换为将触发补充工作线程的消息数。例如,将 number 设置为 100,当超过 100 条消息到达时启动一个新的工作线程。当超过 200 条消息到达时,第三个工作线程启动,依此类推。但是,并行运行的工作线程过多会变得低效,因此您可以使用以下方法限制它们的最大数量:

$objectQueueWorkerThreads number

其中 number 代表可以并行运行的最大工作线程数。对于主消息队列,默认限制为 1 个线程。一旦启动了工作线程,它就会一直运行,直到出现不活动超时。要设置超时长度,请键入:

$objectQueueWorkerTimeoutThreadShutdown time

time 替换为以毫秒为单位的持续时间。如果没有此设置,则会应用零超时,并且工作线程在消息用完时会立即终止。如果您将 time 指定为 -1,则不会关闭任何线程。

批量出队

为了提高性能,您可以配置 rsyslog 以一次将多条消息出列。要设置此类出队的上限,请使用:

$objectQueueDequeueBatchSize number

number 替换为一次可以出队的最大消息数。请注意,更高的设置与更多的允许工作线程相结合会导致更大的内存消耗。

终止队列

当终止仍然包含消息的队列时,可以尝试通过指定工作线程完成队列处理的时间间隔来尽量减少数据丢失:

$objectQueueTimeoutShutdown time

以毫秒为单位指定 time。如果在那段时间之后仍有一些排队的消息,工作线程完成当前数据元素然后终止。因此,未处理的消息会丢失。可以为工作线程设置另一个时间间隔来完成最后一个元素:

$objectQueueTimeoutActionCompletion time

如果此超时到期,任何剩余的工作线程都将关闭。要在关机时保存数据,请使用:

$objectQueueTimeoutSaveOnShutdown time

如果设置,所有队列元素都会在 rsyslog 终止之前保存到磁盘。

在日志服务器上配置 rsyslog

rsyslog 服务为运行日志服务器和配置单个系统以将其日志文件发送到日志服务器提供了便利。有关客户端 rsyslog 配置的信息,请参阅:可靠地将日志消息转发到服务器

rsyslog 服务必须安装在您打算用作日志服务器的系统上,以及所有将配置为向其发送日志的系统上。Rsyslog 默认安装在 Fedora 34 中。如果需要,请以 root 执行以下命令确保安装:

~]# dnf install rsyslog

必须在您打算用作日志服务器的系统上执行此过程中的步骤。此过程中的所有步骤都必须以“root”用户身份进行:

  1. 配置防火墙以允许 rsyslog TCP 流量。

    1. rsyslog TCP 流量的默认端口是 514。要允许此端口上的 TCP 流量,请输入如下命令:

~]# firewall-cmd --zone=zone --add-port=514/tcp
success

其中 zone 是要使用的接口的区域。

  1. 在文本编辑器中打开 /etc/rsyslog.conf 文件并执行以下操作:

    1. 在 modules 部分下方,Provides UDP syslog reception 部分上方添加这些行:

# 在使用它们的规则之前定义模板

### Per-Host Templates for Remote Systems ###
$template TmplAuthpriv, "/var/log/remote/auth/%HOSTNAME%/%PROGRAMNAME:::secpath-replace%.log"
$template TmplMsg, "/var/log/remote/msg/%HOSTNAME%/%PROGRAMNAME:::secpath-replace%.log"
  1. 将默认的 Provides TCP syslog reception 部分替换为以下内容:

# Provides TCP syslog reception
$ModLoad imtcp
# Adding this ruleset to process remote messages
$RuleSet remote1
authpriv.*   ?TmplAuthpriv
*.info;mail.none;authpriv.none;cron.none   ?TmplMsg
$RuleSet RSYSLOG_DefaultRuleset   #End the rule set by switching back to the default rule set
$InputTCPServerBindRuleset remote1  #Define a new input and bind it to the "remote1" rule set
$InputTCPServerRun 514

将更改保存到 /etc/ rsyslog.conf 文件。

  1. rsyslog 服务必须在日志服务器和试图登录它的系统上运行。

    1. 使用 systemctl 命令启动 rsyslog 服务。

~]# systemctl start rsyslog
  1. 为确保 rsyslog 服务以后自动启动,请以 root 身份执行命令:

~]# systemctl enable rsyslog

您的日志服务器现在已配置为接收和存储来自您环境中其他系统的日志文件。

在日志服务器上使用新模板语法

Rsyslog 7 有许多不同的模板样式。字符串模板最接近旧格式。使用字符串格式从上面的示例中复制模板如下所示:

template(name="TmplAuthpriv" type="string"
         string="/var/log/remote/auth/%HOSTNAME%/%PROGRAMNAME:::secpath-replace%.log"
        )

template(name="TmplMsg" type="string"
         string="/var/log/remote/msg/%HOSTNAME%/%PROGRAMNAME:::secpath-replace%.log"
        )

这些模板也可以写成列表格式如下:

template(name="TmplAuthpriv" type="list") {
    constant(value="/var/log/remote/auth/")
    property(name="hostname")
    constant(value="/")
    property(name="programname" SecurePath="replace")
    constant(value=".log")
    }
template(name="TmplMsg" type="list") {
    constant(value="/var/log/remote/msg/")
    property(name="hostname")
    constant(value="/")
    property(name="programname" SecurePath="replace")
    constant(value=".log")
    }

这种模板文本格式对于那些刚接触 rsyslog 的人来说可能更容易阅读,因此更容易适应需求改变。

完成对新语法的更改,我们需要重现模块加载命令,添加规则集,然后将规则集绑定到协议、端口和规则集:

module(load="imtcp")

ruleset(name="remote1"){
     authpriv.*   action(type="omfile" DynaFile="TmplAuthpriv")
      *.info;mail.none;authpriv.none;cron.none action(type="omfile" DynaFile="TmplMsg")
}

input(type="imtcp" port="514" ruleset="remote1")

使用 Rsyslog 模块

由于其模块化设计,rsyslog 提供了多种 modules 以提供附加功能。请注意,模块可以由第三方编写。大多数模块提供额外的输入(参见下面的 输入模块)或输出(参见下面的 输出模块)。其他模块提供特定于每个模块的特殊功能。模块可以提供额外的配置指令,这些指令在模块加载后可用。要加载模块,请使用以下语法:

$ModLoad MODULE

其中 $ModLoad 是加载指定模块的全局指令,MODULE 表示您想要加载的模块。例如,如果您要加载文本文件输入模块 (imfile),使 rsyslog 可以将任何标准文本文件转换为 syslog 消息,请在 /etc/rsyslog.conf 配置文件中指定以下行:

$ModLoad imfile

rsyslog 提供了许多模块,这些模块分为以下主要类别:

  • 输入模块 — 输入模块从各种来源收集消息。输入模块的名称总是以 im 前缀开头,例如 imfileimjournal

  • 输出模块 — 输出模块提供了一种向各种目标发出消息的工具,例如通过网络发送、存储在数据库中或加密。输出模块的名称始终以 om 前缀开头,例如 omsnmpomrelp 等。

  • 解析器模块 — 这些模块在创建自定义解析规则或解析格式错误的消息时很有用。借助一定的 C 语言编程知识,您可以创建自己的消息解析器。解析器模块的名称总是以 pm 前缀开头,例如 pmrfc5424pmrfc3164 等。

  • 消息修改模块 — 消息修改模块更改 syslog 消息的内容。这些模块的名称以“mm”前缀开头。mmanonmmnormalizemmjsonparse 等消息修改模块用于消息的匿名化或规范化。

  • 字符串生成器模块 — 字符串生成器模块根据消息内容生成字符串,并与 rsyslog 提供的模板功能紧密配合。有关模板的详细信息,请参阅:Templates。字符串生成器模块的名称总是以 sm 前缀开头,例如 smfilesmtradfile

  • 库模块 — 库模块为其他可加载模块提供功能。这些模块在需要时由 rsyslog 自动加载,用户无法配置。

在链接:https://www.rsyslog.com/doc/rsyslog_conf_modules.html 中可以找到所有可用模块的完整列表及其详细说明。

请注意,当 rsyslog 加载任何模块时,它会为它们提供对其某些功能和数据的访问权限。这构成了可能的安全威胁。为了最大限度地降低安全风险,请仅使用可信赖的模块。

导入文本文件

文本文件输入模块,缩写为 imfile,使 rsyslog 能够将任何文本文件转换为 syslog 消息流。您可以使用 imfile 从创建文本文件日志的应用程序中导入日志消息。要加载 imfile,请将以下内容添加到 /etc/rsyslog.conf 中:

$ModLoad imfile
$InputFilePollInterval int

即使在导入多个文件时,加载 imfile 一次就足够了。$InputFilePollInterval 全局指令指定 rsyslog 检查连接的文本文件更改的频率。默认间隔为 10 秒,要更改它,请将 int 替换为以秒为单位指定的时间间隔。

要识别要导入的文本文件,请在 /etc/rsyslog.conf 中使用以下语法:

# File 1
$InputFileName path_to_file
$InputFileTag tag:
$InputFileStateFile state_file_name
$InputFileSeverity severity
$InputFileFacility facility
$InputRunFileMonitor

# File 2
$InputFileName path_to_file2
...

指定输入文本文件需要四个设置:

  • path_to_file 替换为文本文件的路径。

  • 用此消息的标签名称替换 tag:

  • state_file_name 替换为 状态文件 的唯一名称。状态文件,存储在 rsyslog 工作目录中,为监视的文件保留游标,标记已处理的部分。如果你删除它们,整个文件将被再次读入。确保您指定的名称尚不存在。

  • 添加启用文件监控的 $InputRunFileMonitor 指令。如果没有此设置,文本文件将被忽略。

除了必需的指令外,还有其他几个可以应用于文本输入的设置。通过将 severity 替换为适当的关键字来设置导入消息的严重性。将 facility 替换为关键字以定义生成消息的子系统。严重性和设施的关键字与设施/基于优先级的过滤器中使用的关键字相同,请参阅:Filters

Example 13. 导入文本文件

Apache HTTP 服务器以文本格式创建日志文件。要将 rsyslog 的处理能力应用于 apache 错误消息,首先使用 imfile 模块导入消息。将以下内容添加到 /etc/rsyslog.conf

$ModLoad imfile

$InputFileName /var/log/httpd/error_log
$InputFileTag apache-error:
$InputFileStateFile state-apache-error
$InputRunFileMonitor

将消息导出到数据库

在数据库中而不是文本文件中执行日志数据的处理更快、更方便。可以根据使用的 DBMS 类型,从各种输出模块中进行选择,例如 ommysqlompgsqlomoracleommongodb。作为替代方案,可以使用依赖于 libdbi 库的通用 omlibdbi 输出模块。omlibdbi 模块支持 Firebird/Interbase、MS SQL、Sybase、SQLite、Ingres、Oracle、mSQL、MySQL 和 PostgreSQL 数据库系统。

Example 14. 将 Rsyslog 消息导出到数据库

要将 rsyslog 消息存储在 MySQL 数据库中,请将以下内容添加到 /etc/rsyslog.conf 中:

$ModLoad ommysql

$ActionOmmysqlServerPort 1234
*.* :ommysql:database-server,database-name,database-userid,database-password

首先加载输出模块,然后指定通信端口。附加信息,例如服务器和数据库的名称以及身份验证数据,在上述示例的最后一行指定。

启用加密传输

网络传输中的机密性和完整性可以由 TLSGSSAPI 加密协议提供。

传输层安全性* (TLS) 是一种加密协议,旨在通过网络提供通信安全性。使用 TLS 时,rsyslog 消息在发送前经过加密,发送方和接收方之间存在相互认证。

通用安全服务 API* (GSSAPI) 是用于程序访问安全服务的应用程序编程接口。要将它与 rsyslog 结合使用,您必须有一个正常运行的 Kerberos 环境。

使用 RELP

可靠事件记录协议 (RELP) 是一种用于在计算机网络中记录数据的网络协议。它旨在提供事件消息的可靠传递,在不能接受消息丢失的环境中非常有用。

Rsyslog 和 Journal的交互

如上所述,您系统上存在的两个日志记录应用程序 RsyslogJournal 具有几个独特的功能,使其适用于具体用例。在许多情况下,将它们的功能结合起来很有用,例如创建结构化消息并将它们存储在文件数据库中(请参阅:Structured Logging with Rsyslog)。本次合作所需的通信接口由 Rsyslog 侧的输入输出模块和 Journal的通信套接字提供。

默认情况下,rsyslogd 使用 imjournal 模块作为日志文件的默认输入模式。使用此模块,您不仅可以导入消息,还可以导入 journald 提供的结构化数据。此外,可以从 journald 导入旧数据(除非使用 $ImjournalIgnorePreviousMessages 指令禁止)。有关“imjournal”的基本配置,请参阅:从日志中导入数据

作为替代方案,将 rsyslogd 配置为从 journal 提供的套接字读取,作为基于 syslog 的应用程序的输出。套接字的路径是 /run/systemd/journal/syslog。当您想要维护纯 rsyslog 消息时使用此选项。与 imjournal 相比,套接字输入当前提供了更多功能,例如规则集绑定或过滤。要通过套接字导入 Journal 数据,请在 /etc/rsyslog.conf 中使用以下配置:

$ModLoad imuxsock
$OmitLocalLogging off

上面的语法加载了 imuxsock 模块并关闭了 $OmitLocalLogging 指令,该指令可以通过系统套接字进行导入。这个套接字的路径在 /etc/rsyslog.d/listen.conf 中单独指定如下:

$SystemLogSocketName /run/systemd/journal/syslog

您还可以使用 omjournal 模块将消息从 Rsyslog 输出到 Journal。在 /etc/rsyslog.conf 中配置输出如下:

$ModLoad omjournal

*.* :omjournal:

例如,以下配置将 tcp 端口 10514 上收到的所有消息转发到 Journal:

$ModLoad imtcp
$ModLoad omjournal

$RuleSet remote
*.* :omjournal:

$InputTCPServerBindRuleset remote
$InputTCPServerRun 10514

Rsyslog 中的结构化日志

在产生大量日志数据的系统上,可以用 结构化格式 方便地维护日志消息。使用结构化消息,可以更轻松地搜索特定信息、生成统计数据以及应对消息结构中的变化和不一致。Rsyslog 使用 JSON(JavaScript 对象表示法)格式为日志消息提供结构。

比较以下非结构化日志消息:

Oct 25 10:20:37 localhost anacron[1395]: Jobs will be executed sequentially

使用结构化的:

{"timestamp":"2013-10-25T10:20:37", "host":"localhost", "program":"anacron", "pid":"1395", "msg":"Jobs will be executed sequentially"}

使用键值对搜索结构化数据比使用正则表达式搜索文本文件更快、更精确。该结构还允许您在各种应用程序生成的消息中搜索相同的条目。此外,JSON 文件可以存储在 MongoDB 等文档数据库中,从而提供额外的性能和分析功能。另一方面,结构化的消息比非结构化的需要更多的磁盘空间。

rsyslog 中,可以使用 imjournal 模块从 Journal 中提取带有元数据的日志消息。使用 mmjsonparse 模块,您可以解析从 Journal 和其他来源导入的数据并进一步处理它们,例如作为数据库输出。为了成功解析,mmjsonparse 要求输入消息的结构由 Lumberjack 项目定义。

Lumberjack 项目旨在以向后兼容的方式将结构化日志记录添加到 rsyslog。为了识别结构化消息,Lumberjack 指定了 @cee: 字符串,该字符串位于实际 JSON 结构之前。此外,Lumberjack 定义了应该用于 JSON 字符串中的实体的标准字段名称列表。有关 Lumberjack 的更多信息,请参阅:在线文档

以下是 lumberjack 格式消息的示例:

            @cee: {"pid":17055, "uid":1000, "gid":1000, "appname":"logger", "msg":"Message text."}

要在 Rsyslog 中构建此结构,需要使用模板,参阅:过滤结构化消息。应用程序和服务器可以使用 libumberlog 库来生成符合 libumber 格式的消息。有关 libumberlog 的更多信息,请参阅:在线文档

从日记中导入数据

imjournal 模块是 Rsyslog 的输入模块,用于本地读取 journal 文件(参见:Rsyslog 和 Journal 的交互)。Journal 消息随后像其他 rsyslog 消息一样以文本格式记录。但是,通过进一步处理,可以将 Journal 提供的元数据转换为结构化消息。

要将数据从 Journal 导入 Rsyslog,请在 /etc/rsyslog.conf 中使用以下配置:

$ModLoad imjournal

$imjournalPersistStateInterval number_of_messages
$imjournalStateFile path
$imjournalRatelimitInterval seconds
$imjournalRatelimitBurst burst_number
$ImjournalIgnorePreviousMessages off/on
  • 使用_number_of_messages_,您可以指定保存日志数据的频率。每次达到指定数量的消息时都会发生这种情况。

  • path 替换为状态文件的路径。此文件跟踪最后处理的日志入口。

  • 使用 seconds,您可以设置速率限制间隔的长度。在此时间间隔内处理的消息数不能超过 burst_number 中指定的值。默认设置为每 600 秒 20,000 条消息。Rsyslog 丢弃在指定时间范围内最大突发之后出现的消息。

  • 使用 $ImjournalIgnorePreviousMessages,您可以忽略当前在 Journal 中的消息并仅导入新消息,这在没有指定状态文件时使用。默认设置为“关闭”。请注意,如果此设置关闭并且没有状态文件,则日志中的所有消息都会被处理,即使它们已经在先前的 rsyslog 会话中处理过。

您可以同时使用 imjournalimuxsock 模块,这是传统的系统日志输入。但是,为避免消息重复,您必须阻止 imuxsock 读取 Journal 的系统套接字。为此,请使用 $OmitLocalLogging 指令:

$ModLoad imuxsock
$ModLoad imjournal

$OmitLocalLogging on
$AddUnixListenSocket /run/systemd/journal/syslog

您可以将 Journal 存储的所有数据和元数据转换为结构化消息。其中一些元数据条目列在 Verbose journalctl Output 中,有关日志字段的完整列表,请参阅 systemd.journal-fields(7) 手册页。例如,可以关注 内核日志字段,这些字段由源自内核的消息使用。

过滤结构化消息

要创建 rsyslog 的解析模块所需的 lumberjack 格式的消息,请使用以下模板:

template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n")

此模板将 @cee: 字符串添加到 JSON 字符串中,例如,在使用 omfile 模块创建输出文件时可以应用此模板。要访问 JSON 字段名称,请使用 $! 前缀。例如,以下过滤条件搜索具有特定 hostnameUID 的消息:

($!hostname == "hostname" && $!UID== "UID")

解析 JSON

mmjsonparse 模块用于解析结构化消息。

这些消息可以来自 Journal 或其他输入源,并且必须按照 Lumberjack 项目定义的方式进行格式化。这些消息由 @cee: 字符串来标识。然后,mmjsonparse 检查 JSON 结构是否有效,再解析消息。

要使用 mmjsonparse 解析伐木工人格式的 JSON 消息,请在 /etc/rsyslog.conf 中使用以下配置:

$ModLoad mmjsonparse

*.* :mmjsonparse:

在本例中,` mmjsonparse` 模块在第一行加载,然后所有消息都转发给它。目前,mmjsonparse 没有可用的配置参数。

在 MongoDB 中存储消息

Rsyslog 支持通过 ommongodb 输出模块将 JSON 日志存储到 MongoDB 文档数据库中。

要将日志消息转发到 MongoDB,请在 /etc/rsyslog.conf 中使用以下语法(ommongodb 的配置参数仅在新配置格式中可用;请参阅:使用新配置格式):

$ModLoad ommongodb

*.* action(type="ommongodb" server="DB_server" serverport="port" db="DB_name" collection="collection_name" uid="UID" pwd="password")
  • DB_server 替换为 MongoDB 服务器的名称或地址。指定 port 以从 MongoDB 服务器中选择一个非标准端口。默认 port 值为 0,通常无需更改此参数。

  • 使用 DB_name,您可以确定要将输出定向到 MongoDB 服务器上的哪个数据库。将 collection_name 替换为此数据库中的集合名称。在 MongoDB 中,集合是一组文档,相当于 RDBMS 表。

  • 您可以通过替换 UIDpassword 来设置您的登录详细信息。

您可以使用模板来塑造最终数据库输出的形式。默认情况下,rsyslog 使用基于标准 lumberjack 字段名称的模板。

调试 Rsyslog

要在调试模式下运行 rsyslogd,请使用以下命令:

rsyslogd -dn

使用这个命令,rsyslogd 生成调试信息并将其打印到标准输出。-n 代表“不分叉”。您可以使用环境变量修改调试,例如,您可以将调试输出存储在日志文件中。在启动 rsyslogd 之前,在命令行输入以下内容:

export RSYSLOG_DEBUGLOG="path"
export RSYSLOG_DEBUG="Debug"

path 替换为记录调试信息的文件的位置。有关 RSYSLOG_DEBUG 变量可用选项的完整列表,请参阅 rsyslogd(8) 手册页中的相关部分。

要检查 /etc/rsyslog.conf 文件中使用的语法是否有效,请使用:

rsyslogd -N 1

其中“1”表示输出消息的详细程度。这是一个向前兼容的选项,因为目前只提供一个级别。但是,您必须添加此参数才能运行验证。

将故障排除日志记录到服务器

  • 确保在生成日志消息的系统以及任何日志服务器上正确设置时间。有关检查和设置时间的信息,请参阅:配置日期和时间。有关使用 NTP 保持系统时钟的信息,请参阅:使用 ntpd 配置 NTP使用 chrony 套件配置 NTP

  • 在日志服务器上,检查防火墙是否打开了适当的端口以允许 UDPTCP 进入,具体取决于发送系统配置使用的流量和端口。例如:

~]# firewall-cmd --zone=public --list-ports

有关在 firewalld 中打开和关闭端口的更多信息,请参阅 Red Hat Enterprise Linux 7 安全指南。检查日志服务器的配置以确保它正在侦听发送系统配置的端口,并且所有端口都设置为使用相同的协议。

  • 使用 logger 命令生成测试日志消息。例如:

~]$ logger -p authpriv.info "Test Secret"
~]$ logger -p auth.info "Test Info"

有关 logger 命令的更多信息,请参阅 logger(1) 手册页。

使用 Journal

Journal 是 systemd 的一个组件,负责查看和管理日志文件。它可以并行使用,也可以代替传统的 syslog 守护进程,例如 rsyslogd。该日志旨在解决与传统日志有关的问题。它与系统的其余部分紧密集成,支持各种日志记录技术和日志文件的访问管理。

日志数据由 Journal 的 journald 服务收集、存储和处理。它创建和维护称为 journals 的二进制文件,其基于从内核、用户进程、标准输出和系统服务的标准错误输出或原生 API 接收的日志信息。这些日志是结构化和索引的,可提供相对较快的查找。日志条目可以带有唯一标识符。journald 服务为每条日志消息收集大量元数据字段。因此无法手动编辑,日志文件是安全的。

查看日志文件

要访问日志,请使用 journalctl 工具。要查看日志类型的基本视图,用 root 用户执行:

journalctl

此命令的输出是系统上生成的所有日志文件的列表,包括系统组件和用户生成的消息。此输出的结构类似于 /var/log/messages/ 中使用的结构,但有一些改进:

  • 条目的优先级以视觉方式标记。错误优先级及更高的行以红色突出显示,而具有通知和警告优先级的行使用粗体字

  • 时间戳转换为系统的本地时区

  • 显示所有记录的数据,包括轮换日志

  • 引导的开头标有特殊行

Example 15. journalctl 的示例输出

以下是 journalctl 工具提供的示例输出。当不带参数调用时,列出的条目以时间戳开头,然后是执行操作的主机名和应用程序,最后是实际消息。此示例显示日志中的前三个条目:

# journalctl
-- Logs begin at Thu 2013-08-01 15:42:12 CEST, end at Thu 2013-08-01 15:48:48 CEST. --
Aug 01 15:42:12 localhost systemd-journal[54]: Allowing runtime journal files to grow to 49.7M.
Aug 01 15:42:12 localhost kernel: Initializing cgroup subsys cpuset
Aug 01 15:42:12 localhost kernel: Initializing cgroup subsys cpu

[...]

在许多情况下,只有日志中的最新条目是相关的。减少 journalctl 输出的最简单方法是使用 -n 选项,该选项仅列出指定数量的最新日志条目:

journalctl -n Number

Number 替换为要显示的行数。如果未指定数字,journalctl 将显示最近的十个条目。

journalctl 命令允许使用以下语法控制输出的形式:

journalctl -o form

form 替换为指定所需输出形式的关键字。有几个选项,例如 verbose 返回具有所有字段的完整结构的条目项,export 创建适合备份和网络传输的二进制流,以及 json 将条目格式化为 JSON 数据结构。有关关键字的完整列表,请参阅 journalctl(1) 手册页。

Example 16. 详细 journalctl 输出

要查看有关所有条目的完整元数据,请键入:

# journalctl -o verbose
[...]

Fri 2013-08-02 14:41:22 CEST [s=e1021ca1b81e4fc688fad6a3ea21d35b;i=55c;b=78c81449c920439da57da7bd5c56a770;m=27cc
        _BOOT_ID=78c81449c920439da57da7bd5c56a770
        PRIORITY=5
        SYSLOG_FACILITY=3
        _TRANSPORT=syslog
        _MACHINE_ID=69d27b356a94476da859461d3a3bc6fd
        _HOSTNAME=localhost.localdomain
        _PID=562
        _COMM=dbus-daemon
        _EXE=/usr/bin/dbus-daemon
        _CMDLINE=/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
        _SYSTEMD_CGROUP=/system/dbus.service
        _SYSTEMD_UNIT=dbus.service
        SYSLOG_IDENTIFIER=dbus
        SYSLOG_PID=562
        _UID=81
        _GID=81
        _SELINUX_CONTEXT=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023
        MESSAGE=[system] Successfully activated service 'net.reactivated.Fprint'
        _SOURCE_REALTIME_TIMESTAMP=1375447282839181

[...]

此示例列出了标识单个日志条目的字段。这些元数据可用于消息过滤,如 Advanced Filtering 中所示。有关所有可能字段的完整描述,请参阅 systemd.journal-fields(7) 手册页。

访问控制

默认情况下,没有 root 权限的 Journal 用户只能看到他们生成的日志文件。系统管理员可以将选定的用户添加到 adm 组,从而授予他们访问完整日志文件的权限。为此,请以 root 权限键入指令:

usermod -a -G adm username

在这里,将 username 替换为要添加到 adm 组的用户。该用户将收到与 root 用户相同的 journalctl 命令输出。请注意,访问控制仅在为 Journal 启用持久存储时才有效。

使用实时视图

当不带参数调用时,journalctl 从收集的最旧条目开始显示完整的条目列表。使用实时视图,您可以实时监控日志消息,因为新条目会在出现时连续打印。要以实时查看模式启动 journalctl,请键入:

journalctl -f

此命令返回十个最新日志行的列表。journalctl 程序保持运行并立即显示新的条目。

过滤消息

不带参数执行的 journalctl 命令的输出通常很丰富,因此您可以使用各种过滤方法来提取信息以满足您的需要。

优先级过滤

Log 消息通常用于跟踪系统上的错误行为。要仅查看具有选定或更高优先级的条目,请使用以下语法:

journalctl -p priority

在这里,将 priority 替换为以下关键字之一(或数字):debug (7), info # (6), [command]#notice (5), warning (4), err (3), crit (2), alert # (1) 和 [command]#emerg (0)。

Example 17. 优先级过滤

要仅查看具有 error 或更高优先级的条目,请使用:

journalctl -p err
时间过滤

要仅查看当前引导的日志条目,请键入:

journalctl -b

如果您只是偶尔重启系统,-b 不会显着降低 journalctl 的输出。在这种情况下,基于时间的过滤更有帮助:

journalctl --since=value --until=value

使用 --since and [option] --until,查看指定时间范围内创建的日志消息。您可以将 values 以日期或时间或两者都有的形式传递给这些选项,如以下示例所示。

Example 18. 按时间和优先级过滤

可以组合过滤选项以根据特定请求减少结果集。例如,要查看某个时间点的 warning 或更高优先级的消息,请键入:

journalctl -p warning --since="2013-3-16 23:59:59"
高级过滤

Verbose journalctl Output 列出了一组指定日志条目的字段,它们都可以用于过滤。有关 systemd 可以存储的元数据的完整描述,请参阅 systemd.journal-fields(7) 手册页。元数据为每条日志消息收集,无需用户干预。值通常是基于文本的,但可以采用二进制和大值;尽管不常见,字段可以分配多个值。

要查看指定字段中出现的唯一值列表,请使用以下语法:

journalctl -F fieldname

fieldname 替换为您感兴趣的字段的名称。

要仅显示符合特定条件的日志条目,请使用以下语法:

journalctl fieldname=value

fieldname 替换为字段名称,将 value 替换为该字段中包含的特定值。因此,其仅返回符合此条件的行。

Tab 字段名称补全

由于 systemd 存储的元数据字段数量很大,很容易忘记感兴趣字段的确切名称。如果不确定,请输入:

journalctl

并按两次 Tab 键。这会显示可用字段名称的列表。 Tab 可以基于上下文补全字段名,因此您可以键入字段名中的一组独特的字母,然后按 Tab 以自动完成名称。同样,您可以列出字段中的唯一值。键入:

journalctl fieldname=

并按 Tab 两次。这是 journalctl -F fieldname 的替代方法。

你可以为一个字段指定多个值:

journalctl fieldname=value1 fieldname=value2 ...

指定同一字段的两个匹配会形成匹配的逻辑“或”组合。以上示例匹配 value1value2 的条目。

此外,您可以指定多个字段值对以进一步减少输出集:

journalctl fieldname1=value fieldname2=value ...

如果指定了不同字段名称的两个匹配项,它们将是逻辑“与”组合。必须符合两个条件才能显示。

使用 + 符号,您可以为多个字段设置匹配的逻辑“或”组合:

journalctl fieldname1=value + fieldname2=value ...

此命令返回至少匹配一个条件的条目,而不仅仅是同时匹配这两个条件的条目。

Example 19. 高级过滤

要在 UID 70 的用户下显示由 avahi-daemon.servicecrond.service 创建的条目,请使用以下命令:

journalctl _UID=70 _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=crond.service

由于为 _SYSTEMD_UNIT 字段设置了两个值,因此将显示两个结果,但仅在匹配 _UID=70 条件时才会显示。这可以简单地表示为:(UID=70 和(avahi 或 cron))。

您也可以在实时查看模式下应用上述过滤来跟踪所选日志条目组中的最新更改:

journalctl -f fieldname=value ...

启用持久存储

默认情况下,Journal 仅将日志文件存储在内存或 /run/log/journal/ 目录中的小型环形缓冲区中。这足以使用 journalctl 显示最近的日志历史记录。此目录是易失的,日志数据不会永久保存。使用默认配置,syslog 读取journal日志并将它们存储在 /var/log/ 目录中。启用持久日志记录后,日志文件存储在 /var/log/journal 中,这意味着它们在重新启动后仍然存在。Journal 可以为某些用户替换 rsyslog(但请参阅章节介绍)。

启用持久存储具有以下优势

  • 记录更丰富的数据,以便在更长的时间内进行故障排除

  • 对于即时故障排除,重启后可获得更丰富的数据

  • 服务器控制台当前从日志中读取数据,而不是日志文件

持久存储也有一些缺点:

  • 即使使用持久存储,存储的数据量也取决于可用内存,无法保证覆盖特定时间跨度

  • 需要更多磁盘空间用于日志

要为日志启用持久存储,请手动创建日志目录,如下例所示。以 root 输入指令:

mkdir -p /var/log/journal

然后,重新启动 journald 应用更改:

systemctl restart systemd-journald

在图形环境中管理日志文件

作为上述命令行实用程序的替代方案,Red Hat Enterprise Linux 7 提供了一个可访问的 GUI 来管理日志消息。

查看日志文件

大多数日志文件都以纯文本格式存储。您可以使用任何文本编辑器查看它们,例如 ViEmacs。系统上的所有用户都可以读取一些日志文件;但是,读取大多数日志文件需要 root 权限。 要在交互式实时应用程序中查看系统日志文件,请使用 System Log

安装 gnome-system-log 包

为了使用 System Log,首先用 root 运行以下指令确保 gnome-system-log 包安装在您的系统上:

~]# dnf install gnome-system-log

有关使用 DNF 安装软件包的更多信息,请参阅 安装包

安装 gnome-system-log 包后,通过单击菜单打开 System Log:Applications[System Tools > System Log],或在 shell 提示符下键入以下命令:

~]$ gnome-system-log

应用程序只显示存在的日志文件;因此,该列表可能与 System Log 中显示的列表不同。

系统日志
Figure 2. 系统日志

System Log 应用程序允许您过滤任何现有的日志文件。点击带有齿轮符号的按钮查看菜单,选择 menu:[Filters > > Manage Filters]定义或编辑所需筛选。

系统日志 - 过滤器
Figure 3. 系统日志 - 过滤器

添加或编辑过滤器可以让您如 System Log -定义过滤器 定义其参数。

系统日志 - 定义过滤器
Figure 4. 系统日志 - 定义过滤器

定义过滤器时,可以编辑以下参数:

  • Name — 指定过滤器的名称。

  • Regular Expression — 指定应用于日志文件的正则表达式,并将尝试匹配其中任何可能的文本字符串。

  • Effect

    • Highlight - 如果选中,找到的结果将以所选颜色突出显示。您可以选择是否突出显示文本的背景或前景。

    • Hide - 如果选中,找到的结果将从您正在查看的日志文件中隐藏。

当您定义了至少一个过滤器时,可以从“过滤器”菜单中选择它,它会自动搜索您在过滤器中定义的字符串,并突出显示或隐藏您当前正在查看的日志文件中的每个匹配项。

系统日志 - 启用过滤器
Figure 5. 系统日志 - 启用过滤器

当你选择 Show matches only 选项时,只有匹配的字符串将显示在您当前正在查看的日志文件中。

添加日志文件

要在列表中添加要查看的日志文件,请选择 File    Open。这将显示“打开日志”窗口,您可以在其中选择要查看的日志文件的目录和文件名。系统日志 - 添加日志文件 介绍了“打开日志”窗口。

系统日志 - 添加日志文件
Figure 6. 系统日志 - 添加日志文件

点击 Open 按钮打开文件。该文件会立即添加到查看列表中,您可以在其中选择它并查看其内容。

阅读压缩日志文件

System Log 还允许您打开以 .gz 格式压缩的日志文件。

监控日志文件

System Log 默认监控所有打开的日志。如果向受监控的日志文件添加新行,则日志名称在日志列表中以粗体显示。如果选择或显示日志文件,则新行以粗体显示在日志文件的底部。System Log - new log alert 介绍了 cron 日志文件和 messages 日志文件中的新告警。单击“消息”日志文件会显示文件中的日志,新行以粗体显示。

系统日志 - 新日志警报
Figure 7. 系统日志 - 新日志警报

其他资源

有关如何配置 rsyslog 守护进程以及如何定位、查看和监控日志文件的更多信息,请参阅下面列出的资源。

安装的文档
  • rsyslogd(8) — rsyslogd 守护进程的手册页记录了它的用法。

  • rsyslog.conf(5) — rsyslog.conf 的手册页记录了可用的配置选项。

  • logrotate(8) — logrotate 程序的手册页更详细地解释了如何配置和使用它。

  • journalctl(1) — journalctl 守护进程的手册页记录了它的用法。

  • journald.conf(5) — 本手册页记录了可用的配置选项。

  • systemd.journal-fields(7) — 本手册页列出了特殊的 Journal 字段。

在线文档