使用变量 - 结合日志的实际应用¶
简介¶
在第二课“Bash - 使用变量”中,您已经看到了一些使用变量的方法,并了解了变量的许多用途。这只是在 bash 脚本中使用变量的一个实际示例。
信息¶
当系统管理员需要处理日志文件时,有时会遇到不同的格式。假设您想从 dnf.log
(/var/log/dnf.log
) 中获取一些信息。让我们通过 tail /var/log/dnf.log
快速看一下该日志文件的样子。
2022-05-04T09:02:18-0400 DEBUG extras: using metadata from Thu 28 Apr 2022 04:25:35 PM EDT.
2022-05-04T09:02:18-0400 DEBUG repo: using cache for: powertools
2022-05-04T09:02:18-0400 DEBUG powertools: using metadata from Thu 28 Apr 2022 04:25:36 PM EDT.
2022-05-04T09:02:18-0400 DEBUG repo: using cache for: epel
2022-05-04T09:02:18-0400 DEBUG epel: using metadata from Tue 03 May 2022 11:55:16 AM EDT.
2022-05-04T09:02:18-0400 DEBUG repo: using cache for: epel-modular
2022-05-04T09:02:18-0400 DEBUG epel-modular: using metadata from Sun 17 Apr 2022 07:09:16 PM EDT.
2022-05-04T09:02:18-0400 INFO Last metadata expiration check: 3:07:06 ago on Wed 04 May 2022 05:55:12 AM EDT.
2022-05-04T09:02:18-0400 DDEBUG timer: sack setup: 512 ms
2022-05-04T09:02:18-0400 DDEBUG Cleaning up.
现在,让我们看一下 messages
日志文件 tail /var/log/messages
。
May 4 08:47:19 localhost systemd[1]: Starting dnf makecache...
May 4 08:47:19 localhost dnf[108937]: Metadata cache refreshed recently.
May 4 08:47:19 localhost systemd[1]: dnf-makecache.service: Succeeded.
May 4 08:47:19 localhost systemd[1]: Started dnf makecache.
May 4 08:51:59 localhost NetworkManager[981]: <info> [1651668719.5310] dhcp4 (eno1): state changed extended -> extended, address=192.168.1.141
May 4 08:51:59 localhost dbus-daemon[843]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.10' (uid=0 pid=981 comm="/usr/sbin/NetworkManager --no-daemon " label="system_u:system_r:NetworkManager_t:s0")
May 4 08:51:59 localhost systemd[1]: Starting Network Manager Script Dispatcher Service...
May 4 08:51:59 localhost dbus-daemon[843]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
May 4 08:51:59 localhost systemd[1]: Started Network Manager Script Dispatcher Service.
May 4 08:52:09 localhost systemd[1]: NetworkManager-dispatcher.service: Succeeded.
最后,让我们看一下 date
命令的输出。
Wed May 4 09:47:00 EDT 2022
发现和目标¶
我们可以看到,dnf.log
和 messages
这两个日志文件显示日期的方式完全不同。如果我们要使用 date
在 bash 脚本中获取 messages
日志中的信息,这并不难。但是,要从 dnf.log
中获取相同的信息则需要一些技巧。假设作为一名系统管理员,您需要每天检查 dnf.log
,以确保系统中没有引入您不知道的或可能引起问题的任何内容。您希望此信息能按日期从 dnf.log
文件中提取,然后每天通过电子邮件发送给您。您将使用 cron
作业来自动化此过程,但首先我们需要一个能完成我们想要任务的脚本。
脚本¶
为了实现我们的目标,我们将在脚本中使用一个名为“today”的变量,该变量将根据 dnf.log
中显示的日期格式化日期。为了获得正确的 date
格式,我们使用 +%F
,这将获得我们想要的 yyyy-mm-dd 格式。由于我们只关心日期,而不是时间或其他信息,所以这就是我们从 dnf.log
中获取正确信息所需的全部。尝试仅使用这部分脚本:
#!/usr/bin/env bash
# script to grab dnf.log data and send it to administrator daily
today=`date +%F`
echo $today
在这里,我们使用 echo
命令来查看日期格式化是否成功。运行脚本时,您应该会看到类似这样的输出,其中包含今天的日期。
2022-05-04
如果成功,那么太好了,我们可以删除“debug”行并继续。让我们添加另一个名为“logfile”的变量,将其设置为 /var/log/dnf.log
,然后尝试使用我们的“today”变量 grep
它。目前,我们只让它输出到标准输出。
!/usr/bin/env bash
# script to grab dnf.log data and send it to administrator daily
today=`date +%F`
logfile=/var/log/dnf.log
/bin/grep $today $logfile
dnf.log
每天都有大量信息,因此我们在此处不显示屏幕上的内容,但您应该看到仅包含今天数据的输出。尝试运行脚本,如果它正常工作,我们就可以继续下一步。检查输出后,下一步是进行管道重定向,将信息发送到电子邮件。
技巧
您需要安装 mailx
和邮件守护进程(如 postfix
)才能完成下一步。您可能还需要进行一些配置才能从您的服务器接收电子邮件到您公司的电子邮件地址。目前不必担心这些步骤,因为您可以检查 maillog
以查看是否已尝试发送邮件,然后从那里着手处理从服务器发送电子邮件到您电子邮件地址的问题。本文档不会讨论这些内容。现在,执行以下操作:
dnf install mailx postfix
systemctl enable --now postfix
#!/usr/bin/env bash
# script to grab dnf.log data and send it to administrator daily
today=`date +%F`
logfile=/var/log/dnf.log
/bin/grep $today $logfile | /bin/mail -s "DNF logfile data for $today" systemadministrator@domain.ext
让我们看看脚本中的这些添加项。我们添加了一个管道 |
来将输出重定向到 /bin/mail
,使用双引号中的内容设置邮件主题(-s
),并将收件人设置为“systemadministrator@domain.ext”。将最后一部分替换为您自己的电子邮件地址,然后再次尝试运行脚本。
如前所述,您可能需要对 Postfix 邮件设置进行一些更改才能收到邮件,但您应该会在 /var/log/maillog
中看到尝试发送的记录。
后续步骤¶
接下来,您需要让您的服务器能够发送电子邮件。您可以参考 Postfix for Reporting 入门。我们还需要自动化此脚本以使其每天运行,为此我们将使用 cron
。这里有多个参考:cron、anacron 和 cronie。有关日期格式化的更多信息,请查看 man date
或 此链接。
作者:Steven Spencer
贡献者:Antoine Le Morvan, Ganna Zhyrnova