Shell 脚本:将消息写入系统日志/日志文件
Syslog ( rsyslogd ) 是将消息发送到位于/var/log目录的Linux 系统日志文件的协议和应用程序。Sysklogd 提供两个系统实用程序,支持系统日志记录和内核消息捕获。通常,大多数程序和应用程序使用 C 或 Syslog 应用程序/库来发送 Syslog 消息。但是如何从 shell 提示符或 shell 脚本发送消息?本页介绍如何从命令行写入 syslog。
我的 Linux 和 Unix 服务器上运行着许多小脚本。我还希望这些脚本将特定信息记录到 Syslog 文件中。因此,让我们使用 logger 命令将消息写入 Linux、macOS、*BSD 或 Unix 下名为 Rsyslogd 的 Syslog 守护进程的日志文件中。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | Linux shell 脚本 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 5 分钟 |
向 logger 命令问好
使用 logger 命令,这是 Syslog 系统日志模块的 shell 命令接口。它在 Linux 或类 Unix 系统下从命令行在系统日志文件中创建或写入一行条目。
从 Linux 或 Unix shell 脚本记录到 syslog
将消息写入 Syslog 文件的语法
从脚本或 Linux、macOS 或 Unix 命令向 syslog 发送消息。语法如下:
$ logger "message"
$ logger [options] "message"
日志消息系统因硬盘升级而重新启动
例如:
$ logger "System rebooted for hard disk upgrade"
您可以在 /var/log/message 文件中看到消息
$ sudo tail -f /var/log/message
或
$ sudo tail -f /var/log/syslog
输出:
Jan 26 20:53:31 dell6400 logger: System rebooted for hard disk upgrade
日志文件的名称可能因您的 Unix 或 Linux 发行版而异。有关更多信息,请参阅Linux 日志文件位置和如何在 Linux 上查看日志文件?常见问题解答。当然,如果需要,您可以使用grep 命令或egrep 命令过滤日志或搜索。通常我会这样做:
此外,确保在出现问题时不会因大量日志记录而耗尽磁盘空间。在您的命令中添加一些限制。通常我使用df 命令和 du 命令来监视我的磁盘空间使用情况。操作方法如下:
$ grep 'app-name' /var/log/syslog
$ grep 'error-code-here' /var/log/syslog
$ df -hT
$ du -csh /var/log
将消息写入系统日志的 Shell 脚本
您可以从 shell 脚本中使用 logger 命令。请考虑以下示例:
#!/bin/bash # Simple backup script by Vivek Gite - www.example.com # --------------------------------------------------------- HDBS="db1 db2 db3 db4" # MySQL db names BAK="/sout/email" # storage [ ! -d "$BAK" ] && mkdir -p "$BAK" /bin/rm "$BAK"/* NOW="$(date +'%d-%m-%Y')" ATTCH="/sout/backup.$NOW.tgz" [ -f "$ATTCH" ] && /bin/rm "$ATTCH" MTO="you@example.com" for db in $HDBS do FILE="$BAK/$db.$NOW-$(date +"%T").gz" mysqldump -u admin -p'password' "$db" | gzip -9 > "$FILE" done tar -jcvf "$ATTCH" "$BAK" mutt -s "DB $NOW" -a "$ATTCH" "$MTO" <<EOF My MySQL databases backup [ $(date) @ $HOSTNAME ] EOF # is email failed? log the message [ "$?" != "0" ] && logger "$0 - MySQL Backup failed"
如果备份未能通过电子邮件发送,最后一行将在 /var/log/message 文件中记录一条消息。
其他用途
要记录 /var/log/myapp.log 文件中包含的消息,请使用:
$ sudo logger -f /var/log/myapp.log
将消息记录到标准错误(屏幕)以及系统日志:
$ sudo logger -s "Hard disk full"
使用选项声明优先级-p,并在选项的帮助下用指定的标签标记行-t。例如,以下是如何将 Linux 机器上的消息记录到 Syslog:
$ logger -p {priority} -t {tag} "message ..."
$ logger -p local0.notice -t "Backup script" "The database backups successfully to FreeBSD NAS server."
如何向远程系统日志服务器发送消息?
使用 netcat 或 nc 命令。echo 命令或 nc 命令的组合语法如下:
echo "myapp.sh: This is a test message" | nc -w1 -u lan1.example.com 514 echo "myapp.sh: This is a test message" | nc -w1 -u 192.168.2.100 514
其中 nc 命令选项为:
- -w1:从网络接收到 recvlimit 个数据包后终止。此例中为 1。
- -u:使用 UDP 代替 TCP。换句话说,使用 UDP 在端口 514 发送消息
- lan1.example.com或192.168.2.100 :您的远程系统日志服务器 IP 或 FQDN。
- 514:远程系统日志主机的 UDP 端口 514。
使用 bash 从命令行发送系统日志消息
如果您使用的是bash 的更新版本,请尝试以下语法:
echo "myapp.sh: This is test" \ > /dev/udp/lan1.example.com/514 ## OR use the IP ## echo "myapp.sh: This is test message from BASH " \ > /dev/udp/192.168.2.100/514
可以使用bash for 循环向多个 Unix 或 Linux 服务器发送消息:
for s in 192.168.1.100 192.168.1.101 do echo "$0: RAID hardware failure detected on ${HOSTNAME} @ $(date). Please change RAID card." > "/dev/udp/${s}/514" done
总结
这个快速提示解释了在使用 Linux 或 Unix 机器时如何从命令行或定制的 shell 脚本将条目写入 /var/log/syslog。
参见
使用 man 命令或 help 命令输出,请参阅手册页以获取更多选项
:$ man logger
$ man syslogd
$ man rsyslogd
$ logger --help
Usage: logger [options] [<message>] Enter messages into the system log. Options: -i log the logger command's PID --id[=<id>] log the given <id>, or otherwise the PID -f, --file <file> log the contents of this file -e, --skip-empty do not log empty lines when processing files --no-act do everything except the write the log -p, --priority <prio> mark given message with this priority --octet-count use rfc6587 octet counting --prio-prefix look for a prefix on every line read from stdin -s, --stderr output message to standard error as well -S, --size <size> maximum size for a single message -t, --tag <tag> mark every line with this tag -n, --server <name> write to this remote syslog server -P, --port <port> use this port for UDP or TCP connection -T, --tcp use TCP only -d, --udp use UDP only --rfc3164 use the obsolete BSD syslog protocol --rfc5424[=<snip>] use the syslog protocol (the default for remote); <snip> can be notime, or notq, and/or nohost --sd-id <id> rfc5424 structured data ID --sd-param <data> rfc5424 structured data name=value --msgid <msgid> set rfc5424 message id field -u, --socket <socket> write to this Unix socket --socket-errors[=<on|off|auto>] print connection errors when using Unix sockets --journald[=<file>] write journald entry -h, --help display this help -V, --version display version