[实验] Linux 日志的远程集中管理和分文件存储 (通过 Rsyslog 实现)

步骤一:规划拓扑

1.1 服务器列表

rsyslog 服务端 IP 地址:192.168.0.11
rsyslog 客户端 IP 地址:192.168.0.12

1.2 服务器列表简介

rsyslog 客户端将日志发送给 rsyslog 服务端,并实现分文件存储

步骤二:系统环境要求

1) 所有服务器的系统都需要是 CentOS 8 版本
2) 所有服务器都要关闭防火墙
3) 所有服务器都要关闭 SELinux
4) 需要按照拓扑图给对应的服务器配置好 IP 地址和主机名
5) 所有服务器都要可以相互 ping 通自己和对方的 IP 地址和主机名

步骤三:配置 rsyslog 服务端

3.1 修改 rsyslog 配置文件的案例

3.1.1 案例一

(只在 rsyslog 服务端执行以下步骤)

# vim /etc/rsyslog.conf

添加以下内容:

......
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")


补充:
1) 使用 UDP 的 514 端口接收日志
2) 使用 TCP 的 514 端口接收日志
3) 此配置会将所有 rsyslog 客户端的日志存储在 rsyslog 服务端的 /var/log/message 里

3.1.2 案例二

(只在 rsyslog 服务端执行以下步骤)

# vim /etc/rsyslog.conf

添加以下内容:

......
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

$template DynFile,"/var/log/%HOSTNAME%.log"
*.* -?DynFile
& ~


补充:
1) 使用 UDP 的 514 端口接收日志
2) 使用 TCP 的 514 端口接收日志
3) 此配置会将每个 rsyslog 客户端的日志单独存储在 /var/log/ 下的一个文件里,此文件会以其所属系统名命名

3.1.3 案例三

(只在 rsyslog 服务端执行以下步骤)

# vim /etc/rsyslog.conf

添加以下内容:

......
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

$template DynFile,"/var/log/remotelog/%HOSTNAME%-%$YEAR%-%$MONTH%-%$DAY%-messages.log"
*.* -?DynFile
& ~


补充:
1) 使用 UDP 的 514 端口接收日志
2) 使用 TCP 的 514 端口接收日志
3) 此配置会将每个 rsyslog 客户端的日志单独存储在 /var/log/remotelog 下的一个文件里,此文件会以其创建时间和其所属系统名命名

3.1.4 案例四

(只在 rsyslog 服务端执行以下步骤)

# vim /etc/rsyslog.conf

添加以下内容:

......
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

$template DynFile,"/var/log/remotelog/%HOSTNAME%-%$YEAR%-%$MONTH%-%$DAY%-messages.log"
:fromhost-ip,!isequal,"127.0.0.1" -?DynFile
& ~


补充:
1) 使用 UDP 的 514 端口接收日志
2) 使用 TCP 的 514 端口接收日志
3) 此配置会将每个 rsyslog 客户端的日志单独存储在 /var/log/ 下的一个文件里,此文件会以其创建时间和其所属系统名命名
4) 此配置不会单独存储 rsyslog 服务端的日志

3.1.5 案例五

(只在 rsyslog 服务端执行以下步骤)

# vim /etc/rsyslog.conf

添加以下内容:

......
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

$template DynFile,"/var/log/syslog/system-%HOSTNAME%/messages.log"
*.* -?DynFile
& ~


补充:
1) 使用 UDP 的 514 端口接收日志
2) 使用 TCP 的 514 端口接收日志
3) 此配置会将每个 rsyslog 客户端的日志单独存储在 /var/log/ 下某个目录的 messages 文件里,此目录会以其所属系统名命名

3.2 重启 rsyslog 服务

(只在 rsyslog 服务端执行以下步骤)

# systemctl restart rsyslog


补充:
1) 使用 UDP 的 514 端口接收日志
2) 使用 TCP 的 514 端口接收日志
3) 需要在 3.1 修改 rsyslog 配置文件的案例中任选其一完成后在执行此步骤

步骤四:配置 rsyslog 客户端

4.1 修改 rsyslog 客户端的案例

(只在 rsyslog 客户端执行以下步骤)

# vim /etc/rsyslog.conf

添加以下内容:

......
*.emerg;*.alert;*.crit;*.err;*.warning;*.notice;*.info  @192.168.0.11

或者:

......
*.emerg;*.alert;*.crit;*.err;*.warning;*.notice;*.info  @@192.168.0.11


补充:
1) 这里的 192.168.0.11 是指 rsyslog 服务端的 IP 地址
2) IP 地址前一个 “@” 符后是指使用 UDP 端口 514 传输日志
3) IP 地址前两个 “@” 符后是指使用 TCP 端口 514 传输日志

4.2 重启 rsyslog 服务

(只在 rsyslog 客户端执行以下步骤)

# systemctl restart rsyslog

步骤五:测试 rsyslog 服务

5.1 在 rsyslog 客户端上发送日志

(只在 rsyslog 客户端执行以下步骤)

# logger "This is our test log"

(补充:这里以发送 This is our test log 信息为例)

5.2 在 rsyslog 服务端上显示日志

(只在 rsyslog 服务端执行以下步骤)

# cat /var/log/* | grep test

[步骤] Linux Kdump 的开启 (用于收集内核崩溃时的信息) (openSUSE 版)

步骤一:确保 kdump 软件包已安装

# rpm -qa | grep kdump || zypper install kdump

(注意:此方法只有 openSUSE & SLES 可以使用)

步骤二:给 Kdump 预留内存

2.1 给 Kdump 预留内存

2.1.1 方法一:通过在 /etc/default/grub 配置文件里修改 crashkernel 参数

2.1.1.1 在 /etc/default/grub 配置文件里修改 crashkernel 参数
# vim /etc/default/grub

在这一行里:

.....
GRUB_CMDLINE_LINUX_DEFAULT="......"
.....

确保有:

.....
GRUB_CMDLINE_LINUX="crashkernel=128M,high......"
.....

并确保此文件其他地方没有和 crashkernel= 相关的参数


补充:这里的 crashkernel=128M,high 代表给 Kdmup 预留的内存大小是 128M,这里也可以指定其他值,例如:crashkernel=128M,high、crashkernel=256M,high 等等。这里其实还有1 个 crashkernel=<value>,low ,这个值通常可以不用设置,其默认值是 72M。当给 crashkernel=<value>,high 设置固定值时建议:
1) 1 GB 到 4 GB 内存设置成 160 M,例如:crashkernel=160M,high
2) 4 GB 到 64 GB 内存设置成 192 M,例如:crashkernel=192M,high
3) 64 GB 到 1 TB 内存设置成 256 M,例如:crashkernel=256M,high
4) 大于 1 TB 内存设置成 512 M,例如:crashkernel=512M,high

2.1.1.2 让刚刚修改的内核参数生效
2.1.1.2.1 生成新的 /boot/grub2/grub.cfg 文件
# grub2-mkconfig -o /boot/grub2/grub.cfg
2.1.1.2.2 重启系统
# reboot

2.1.2 方法二:通过 yast 工具修改 crashkernel 参数

2.1.2.1 方法二:通过 yast 工具修改 crashkernel 参数
# yast kdump

之后将 –Start-Up 中的 Kdump Low Memory [MiB] (72 – 3069) 修改为 256,将 –Start-Up 中的 Kdump High Memory [MiB] (0 – 7168) 修改为 512,之后再选择 [ OK ]

(补充:当 Kdump Low Memory 设置为 256,Kdump High Memory 设置为 512 时更易触发 Kdump)

(注意:此方法只有 openSUSE & SLES 可以使用)

2.1.2.2 让刚刚修改的内核参数生效
# reboot

2.2 显示给 Kdump 预留内存的大小

# makedumpfile --mem-usage /proc/kcore

步骤三:让 Kdump 加载刚刚设置的预留的内存大小

# systemctl enable kdump.service ; systemctl restart kdump.service

步骤四:测试 Kdump

4.1 造成系统内核崩溃

# echo 1 > /proc/sys/kernel/sysrq ; echo c > /proc/sysrq-trigger

(注意:此时系统会自动崩溃并重启)

4.2 显示 Kdump 生成内核崩溃信息

# ls /var/crash/<date>/vmcore

(补充:这里的内核崩溃信息存放目录 /var/crash/,是刚刚在 /etc/kdump.conf 文件里指定的)

(注意:如果 Kdump 没有生成的话,可以适当增加 crashkernel=,high 的值,之后再执行相印的步骤,之后再测试)

[模板] Linux 日志轮转保存的配置模板 ( 以 messages 日志的 /etc/logrotate.d/ 目录里的配置模板为例)

正文:

步骤一:将 messages 日志的 logrotate 配置文件分离出来

# vim /etc/logrotate.d/syslog

删除以下内容:

......
/var/log/messages
......

步骤二:创建 messages 日志的 logrotate 配置文件

2.1 案例一

# vim /etc/logrotate.d/messages

创建以下内容:

/var/log/messages
/var/log/secure
/var/log/maillog
{
    delaycompress
    dateext
    rotate 5
    missingok
    notifempty
    weekly
    create 755 root root
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}


补充:这里以:
1) 影响的日志文件有 /var/log/messages、/var/log/secure 和 /var/log/maillog (/var/log/messages /var/log/secure /var/log/maillog)
2) 备份的日志文件以日期的形式结尾 (dateext)
3) 对备份的日志文件进行压缩 (delaycompress,默认使用 gz 格式进行压缩)
4) 备份的日志文件保留 5 份 (rotate 5)
5) 如果现有日志文件丢失,则不报错直接生成新的日志文件 (missingok)
6) 如果现有日志文件是空文件,则不再对日志文件进行备份 (notifempty)
7) 每周将现在的日志文件进行备份并生成新的日志文件 (weekly)
8) 日志文件权限是 0755 所属主是 root 所属组是 root (create 755 root root)
9) 在所有的现在的日志文件都备份并生成新的日志文件以后再统一执行脚本(sharedscripts,如果没有这个参数则每个日志文件在完成了这一动作后会各自单独执行脚本)
为例

2.2 案例二

# vim /etc/logrotate.d/messages

创建以下内容:

/var/log/messages
/var/log/secure
/var/log/maillog
{
    dateext
    compress
    rotate 4
    missingok
    notifempty
    daily
    create
    olddir /var/log/message/old
    copytruncate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}


补充:这里以:
1) 影响的日志文件有 /var/log/messages、/var/log/secure 和 /var/log/maillog (/var/log/messages /var/log/secure /var/log/maillog)
2) 备份的日志文件以日期的形式结尾 (dateext)
3) 对备份的日志文件进行压缩 (compress,默认使用 gz 格式进行压缩)
4) 备份的日志文件保留 4 份 (rotate 5)
5) 如果现有日志文件丢失,则不报错直接生成新的日志文件 (missingok)
6) 如果现有日志文件是空文件,则不再对日志文件进行备份 (notifempty)
7) 每日将现在的日志文件进行备份并生成新的日志文件 (daily)
8) 日志文件的权限是默认权限 (create)
9) 将轮转钱的旧日志转移到目录 /var/log/message/old 中
10) 轮转时不关闭原日志,而是创建 1 个要被轮转的备份,轮转它,然后再将原日志清空 (copytruncate)
为例

步骤二:让创建的 messages 日志的 logrotate 配置文件生效

# systemctl restart rsyslog

参考文献:

https://www.redhat.com/en/blog/setting-logrotate