Rsyslog 端口
Rsyslog 在端口 514 上使用 TCP。
由于@@ 符号,它的TCP。
我们可以使用 netstat 命令确保 rsyslog 端口:
$ netstat -tnlp | grep rsyslog
在 SQL 数据库中记录 syslog-ng 消息
Syslog-ng 支持许多数据库作为后端。
我们将在以下示例中使用 MySQL。
destination my_dest { sql(type(mysql) host("localhost") username("onitroad") password("onitroad") database("dblogs") table("logs") columns("datetime", "host", "program", "pid", "logmessage") values("$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC", "${HOST}", "${PROGRAM}", "${PID}", " $MSG") indexes("datetime", "host", "program", "pid", "logmessage")); };
此示例将日志消息发送到在本地主机上运行的 MySQL 数据库。
syslog-ng 会自动创建必要的表和列。
然后你可以在任何你想要的日志语句上使用这个目标。
日志服务
大多数 Linux 发行版都预装了 Rsyslog(syslog 的后继版本)以及 systemd 的日志记录组件 systemdjournald(journald)。
不管是什么软件,它们都是一样的;不同之处在于某些功能。
系统日志
syslog 的另一个继承者是 syslog-ng。
这个工具更好,更安全。
此外,syslog-ng 允许进行更高级的消息过滤、操作和交互。
有些人更喜欢 syslog-ng,因为它的语法比 Rsyslog 更简洁。
配置文件是
/etc/syslog-ng/syslog-ng.conf
文件。
该文件包含以下块:
options{} | 全局选项。 |
source{} | 定义消息的源。 |
destination{} | 定义消息的目的地。 |
filter{} | 定义过滤器以过滤消息。 |
log{} | 将日志从源写入从上面语句指定的目标。 |
syslog ng中的思想是编写 source{}、destination{}和filter{},然后在log{}语句中使用它们。我们将看到如何编写它们中的每一个,以及如何编写最终的日志语句。
Syslog-ng 源语句source
我们可以像这样编写源语句:
source my_udp { udp(ip(1.2.3.4) ;};
此行指定消息的来源,即 IP 地址 1.2.3.4.
我们还可以指定一个文件作为日志记录源:
source my_file { file("/proc/kmsg"); };
此外,我们可以指定命名管道作为源:
source my_pipe { pipe("/var/mypipe"); };
Syslog-ng 目标语句destination
我们可以像这样编写目标语句:
destination my_dest { file("/var/log/mylogs" owner(onitroad) group(onitroad) perm(0644)); };
我们指定文件名及其所有权。
这里我们将使用命名管道作为源:
destination my_dest { pipe("/var/mypipe"); };
我们可以使用现成的文件扩展宏,如下所示:
destination my_dest { file("/var/log/hosts/$HOST/$FACILITY$YEAR$MONTH$DAY"); };
目的地可以是这样的登录用户:
destination my_dest { usertty("root"); };
Syslog-ng 过滤语句filter
我们可以通过指定要选择的设施和优先级来定义过滤器,如下所示:
filter my_filter { facility(kern); priority(notice .. crit) };
上面的过滤器语句从内核中选择所有消息,优先级从通知到暴击。
优先级范围由两个点 (..)
我们可以按主机过滤:
filter my_filter { host(onitroad); };
或者按特定程序:
filter my_filter { program("telnet.*") };
或者甚至使用正则表达式来过滤消息:
filter my_filter { match("YOUR REGEX"); };
甚至否定正则表达式:
filter my_filter { not match("YOUR REGEX"); };
Syslog-ng 日志语句
现在我们有了源、目标和过滤器语句。
我们应该编写将执行实际日志记录的日志语句。
与其他语句不同,我们不需要命名日志语句,因为它们不会在其他地方使用。
log { source(my_src); destination(my_dest); };
此行将消息从 my_src 发送到 my_dest。
结合多个来源:
log { source(my_src); source(my_kern); filter(my_filter); destination(my_dest); };
日志文件位置
我们可能需要查看的默认日志文件位置:
/var/log/messages | 包含常规系统消息。 |
/var/log/kern.log | 内核日志。 |
/var/log/cron | Cron守护程序消息。 |
/var/log/btmp | 包含失败的登录尝试。 |
/var/log/mail.log | 包含邮件服务器的日志。 |
/var/log/wtmp | 包含所有登录和注销尝试。 |
/var/log/dmesg | 包含内核消息。 |
/var/log/secure | 包含安全相关的消息。 |
/var/log/mariadb | MariaDB日志目录。 |
/var/log/mysql | mysql日志目录。 |
/var/log/httpd/ | Apache Web服务器日志目录。 |
对于 CPanel apache 日志位于以下位置:
/usr/local/apache/logs/ | Apache服务器日志。 |
/usr/local/apache/domlogs/ | 域特定日志。 |
/var/log/exim/ | exim邮件服务器日志。 |
/var/log/yum.log | yum包管理器日志。 |
/var/log/boot.log | 包含有关系统boot子时的信息。 |
Rsyslog 过滤器
我们可以使用选择器进行过滤,但是如果我们想过滤消息怎么办?
我们可以使用基于属性的过滤器来过滤消息,如下所示:
:property, compare-operation, "value"
以下示例显示如何过滤包含错误的消息:
:msg, contains, "error"
比较操作是:
包含、等于、开始、正则表达式、ereregex。
:msg, regex, "login .* failed"
此过滤器表示捕获任何包含“登录”和“失败”字样以及它们之间的任何文本的消息。
Rsyslog 守护进程
我们可以使用 rsyslog 实用程序来创建和存储可读的事件通知消息,以便系统管理员可以管理他们的系统。
我们可以检查服务是否正在运行:
$ systemctl status rsyslog
Rsyslog 可以将其输出发送到各种目的地,例如:
- 文本文件作为 /var/log/* 文件
- SQL数据库
- 不同的主机
支持的数据库有 MySQL、PostgreSQL、Oracle、SQLite、Microsoft SQL、Sybase、Firebird 和 mSQL。
每个日志条目都包含日期、时间、主机名、进程名称、PID 和日志消息。
系统日志服务
Systemd-Journald 是 systemd 的一个组件,它作为服务运行以收集日志数据,就像 Rsyslog 一样。
它将日志数据存储在索引日志中,这使其比其他工具更快。
许多 Linux 发行版都带有与 Rsyslog 集成的 systemd-journald。
我们可以在同一系统上同时运行它们,甚至可以将数据从一个系统传送到另一个系统。
与日志文件交互的主要工具是 journalctl 。
我们可以使用journalctl 查询和查看systemd-journald 服务收集的日志数据的内容。
$ journalctl
如果要浏览消息,可以使用键盘,完成后按 q 退出。
我们可能会注意到一些带有颜色的行,而其他行则是粗体。
crit [2]、alert [1] 和emerg [0] 优先级的红色。
warn [4]、crit [2]、alert [1] 和emerg [0] 优先级的红色和粗体。
优先级 debug (7) 和更高的 info [6] 行正常显示。
journalctl 命令的最大优点是我们可以使用一些灵活的选项过滤消息。
我们可以像这样显示特定数量的行:
$ journalctl -n 3
我们可以显示像这样生成的实时消息:
$ journalctl -f
此外,我们可以显示几天后的消息:
$ journalctl --since="3 days ago"
或者我们可以像这样显示日期之间的消息:
$ journalctl --since="5 days ago" --until="2 days ago"
此外,我们可以指定所需的日期:
$ journalctl --since="2017-03-14"
也许我们想在特定时间:
$ journalctl --since="2017-03-14 15:00" --until="2017-03-14 15:30"
我们可以指定所需的优先级:
$ journalctl --since="2017-03-14 15:00" --until="2017-03-14 15:30" -p warning
我们可以像这样显示与特定用户关联的消息:
$ journalctl _UID=1001
我们可以查看由 /sbin/init 之类的程序生成的消息:
$ journalctl /sbin/init
此外,我们可以检查磁盘上的消息:
$ journalctl /dev/sda1
配置 rsyslog
Rsyslog 守护程序配置文件是 /etc/rsyslog.conf。
一些 Linux 发行版,如 Ubuntu 或者 Linux Mint,你会在
/etc/rsyslog.d/default.conf
每行包含一个选择器和一个操作。
kern.* /var/log/messages
内核是设施,优先级是星号(*),因此内核会将所有消息发送到 /var/log/messages 。
我们需要知道我们的系统上有什么样的设施以及其他优先事项是什么。
组合 Rsyslog 选择器
设施和优先级共同构成了选择器。
我们可以在 rsyslog.conf 文件中组合选择器,如下所示:
mail,kern.emerg /var/log/log
在这里,我们将所有邮件和所有具有紧急或者更高优先级的 kern 消息发送到 /var/log/log 文件。
Rsyslog 操作
Linux syslog 服务器收到的每个事件通知都转到指定的操作,我们在前面的示例中看到日志转到文件,但我们可以执行更多操作。
Rsyslog 可以执行以下操作:
- 记录到文件。
- 记录到设备文件。
- 发送到用户屏幕。
- 发送到命名管道。
- 发送到远程主机。
查看以下示例以了解它们之间的区别:
auth.err | /var/log/messages |
daemon.* | /dev/lpr2 |
auth-priv | root,onitroad |
kern.crit | |
@@onitroad.local | |
auth.* | dbhost,dbname,dbuser,dbpassword;dbtemplate |
在第一行发送记录到 /var/log/messages 文件的所有 err 优先级的身份验证消息。
第 2 行将所有优先级的所有守护进程消息发送到本地打印机 lpr2.
如果 root 和 onitroad 已登录,第 3 行将向用户发送私有身份验证消息。
第 4 行将所有具有 crit 优先级的内核消息发送到命名管道 /var/log/mypipe。
我们可以使用 mkfifo 命令创建命名管道。
第 5 行将所有邮件消息发送到 TCP 端口 514 上的主机 onitroad.local。
这需要 Rsyslog 守护进程以 -r 选项启动;否则,端口将不会打开。
你应该使用双@符号@@onitroad.local,这意味着Rsyslog将使用TCP协议来传输日志。
第六行将所有身份验证消息发送到具有指定参数的数据库表,dbtemplate 字段是可选的。
请记住,在系统上打开端口 514 是危险的,攻击者可以用消息淹没系统。
如果我们想要远程日志记录,我们应该使用 syslog-NG,我们将在本文稍后讨论。
我们可能会注意到如下一行
/etc/rsyslog.conf
mail.* -/var/log/maillog
这告诉 Rsyslog 在写入日志后取消文件同步,但如果写入过程未成功完成,我们可能会丢失数据。
Rsyslog 级别(优先级)
Linux syslog 服务器 优先级是重要性的规模。
我们有 notice、debug、info、warning、err、crit、alert 和 emerg。
我们可以对所有优先级 (*) 使用星号,对没有优先级使用 none。
此外,我们可以使用等号 (=) 和感叹号 (!)。
例如,
kern.=crit
这里我们选择关键的内核消息。
kern.!crit
在这里,我们选择除关键优先级之外的所有内核消息。
Rsyslog 设施
我们将 Rsyslog 消息的来源称为工具。
有一些 Linux 函数、守护进程和其他应用程序添加了工具。
以下列表是 Linux 中的 rsyslog 工具:
auth | 与安全相关的消息。 |
auth-priv | 私有身份验证消息。 |
cron | Cron子系统生成的消息。 |
daemon | 服务消息。 |
kern | 内核消息。 |
邮件。 | |
syslog | syslog消息。 |
我们还有两个另外的特殊设施,星号 (*) 表示所有设施,以及 (none),表示根本没有设施。
查看以下示例以了解这些特殊设施。
*.emerg /var/log/emerg
此行表示将紧急优先级的所有消息发送到 /var/log/emerg 文件。
mail.none /var/log/maillog
这将告诉 rsyslog 不要将任何邮件消息记录到文件 /var/log/maillog。
使用 Logrotate (日志轮换)
将日志文件保持在可管理的大小非常重要,这样我们就可以控制它。
如果我们需要长期存储日志消息,我们应该使用我们看到的数据库。
我们可以使用 logrotate 工具进行日志轮换,从而将日志文件保持在可管理的大小。
logrotate 配置在 /etc/logrotate.conf 文件中。
weekly rotate 4 create
此配置每周轮换日志,轮换四次后,删除日志文件,然后创建新的日志文件。
我们可以按照自己的方式修改日志轮换过程。
此外,我们可以包含日志文件。
考虑在 logrotate.conf 文件中使用以下任何选项:
daily | 每日轮换。 |
weekly | 每周轮换。 |
monthly | 每月轮换。 |
compress | 压缩旧的轮换日志。 |
include | 包含更多的conf文件。 |
我们可以在 /etc/cron.daily/logrotate 中检查每天运行的轮换日志。