使用变量 - 使用日志的实际应用¶
介绍¶
在第二课“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
如果是这样的话,那就太好了,我们可以删除我们的“调试”行并继续。让我们添加另一个名为“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,以帮助您开始使用它。我们还需要将此脚本自动化以每天运行,为此我们将使用 cron
。这里有多个参考资料:cron、anacron 和 cronie。有关日期格式的更多信息,请查看 man date
或 此链接。
作者:Steven Spencer
贡献者:Antoine Le Morvan,Ganna Zhyrnova