从Bash脚本中写入自定义日志文件

48
在Linux中,我知道如何在我创建的简单shell脚本中向/var/log/messages文件写入简单消息。
#!/bin/bash
logger "have fun!"

我希望停止将消息投入默认的/var/log/messages文件,并创建自己的日志文件。
我尝试了以下方法:
#!/bin/bash
logger "have more fun" > /var/log/mycustomlog

它仍然记录到/var/log/messages。它确实创建了/var/log/mycustomlog,但是它是空的。
有人看到我漏掉了什么吗?

6
你能否简单地用echo替换logger吗? - jazzytomato
我认为你不能这样做:https://dev59.com/sWYr5IYBdhLWcg3wvsvR - squiguy
重定向标准输出无法生效,因为“logger”不会写入标准输出,而是写入由“syslog(3)”配置的文件以接收日志消息。 - chepner
现在这更有意义了。我会发布我所做的内容... - coffeemonitor
5个回答

47

logger记录到syslog设施。如果您希望消息发送到特定文件,您需要相应地修改syslog配置。您可以添加类似以下的一行:

local7.*   -/var/log/mycustomlog

重新启动syslog。然后你可以像这样记录日志:
logger -p local7.info "information message"
logger -p local7.err "error message"

消息将以所需的日志级别出现在指定的日志文件中。

如果不更改syslog配置,您可以像这样使用logger

logger -s "foo bar" 2>> /var/log/mycustomlog

指定-s--stderr会告诉logger将消息打印到STDERR(除了记录到syslog中),因此您可以将STDERR重定向到文件。然而,这是完全没有意义的,因为消息已经通过syslog记录了(使用默认优先级user.notice)。请注意,我们在这里使用2>>将标准错误附加到指定的文件中。

3
对于那些对上一个例子中字符串后面使用数字2感到困惑的人,1用于重定向标准输出,2用于重定向标准错误输出。更多信息请参考这里:http://www.tldp.org/LDP/abs/html/io-redirection.html - David Metcalfe
对于那些不知道如何编辑syslog配置的人,这里是Ubuntu上的方法:https://askubuntu.com/questions/42152/where-is-syslog-conf - Jörg Brenninkmeyer
在文件路径前面的“-”表示什么?我尝试过在谷歌上搜索,但找不到任何相关信息。这是必需的吗? - Wimateeka
1
@Wimateeka 它明确禁用了该特定日志文件的同步。请参阅 rsyslog.conf 手册 - desseim

39

@chepner 提出了一个好观点,即 logger 专门用于记录消息。

我需要提到 @Thomas Haratyk 简单询问为什么我不直接使用 echo

当时,我不知道 echo,因为我正在学习 shell-scripting,但他是对的。

我的简单解决方案现在是这样的:

#!/bin/bash
echo "This logs to where I want, but using echo" > /var/log/mycustomlog

上面的示例会在“>”后覆盖文件。
因此,我可以使用以下内容追加到该文件:
#!/bin/bash
echo "I will just append to my custom log file" >> /var/log/customlog

谢谢大家!

  • 顺便说一下,把个人日志放在/var/log/中只是我的个人偏好,但我相信还有其他好的想法。由于我没有创建守护程序,所以/var/log/可能不是我的自定义日志文件的最佳位置。(仅供参考)

5
/var/log 是几乎任何类型日志最佳的存储位置。 - Ansgar Wiechers
2
我认为这是一个不错的方法,但日志文件会不断增长,没有存档或删除旧日志的机制。如果您经常记录日志,那么这可能需要相当大量的存储空间。 - Milan Maharjan

7

关于通过shell的全局变量记录shell脚本日志的细节有很多,我们可以在shell脚本中模拟类似的日志记录: http://www.cubicrace.com/2016/03/efficient-logging-mechnism-in-shell.html 该文章详细介绍了引入诸如INFO、DEBUG、ERROR等日志级别的细节。跟踪细节如脚本输入、脚本退出、函数输入、函数退出。

示例日志: enter image description here


2
我使用过滤器实现了这一点。大多数Linux系统现在使用rsyslog。配置文件位于/etc/rsyslog.conf/etc/rsyslog.d
每当我运行命令logger -t SRI some message时,我希望"some message"只出现在/var/log/sri.log中。
为此,我添加了文件/etc/rsyslog.d/00-sri.conf并添加了以下内容。
# Filter all messages whose tag starts with SRI
# Note that 'isequal, "SRI:"' or 'isequal "SRI"' will not work.
#
:syslogtag, startswith, "SRI" /var/log/sri.log

# The stop command prevents this message from getting processed any further.
# Thus the message will not show up in /var/log/messages.
#
& stop

然后重新启动rsyslogd服务:

systemctl restart rsyslog.service

这是一个展示结果的shell会话:

最初的回答:

[root@rpm-server html]# logger -t SRI Hello World!
[root@rpm-server html]# cat /var/log/sri.log
Jun  5 10:33:01 rpm-server SRI[11785]: Hello World!
[root@rpm-server html]#
[root@rpm-server html]# # see that nothing shows up in /var/log/messages
[root@rpm-server html]# tail -10 /var/log/messages | grep SRI
[root@rpm-server html]#

不要使用“:syslogtag, startswith”,请考虑使用“:programname, isequal”。参考https://www.rsyslog.com/doc/v8-stable/configuration/properties.html - TonyG

2
如果您查看logger的man页面:
$ man logger

LOGGER(1) BSD通用命令手册 LOGGER(1)

名称 logger —— syslog(3)系统日志模块的shell命令接口

概要 logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...]

描述 Logger在系统日志中记录条目。它提供了syslog(3)系统日志模块的shell命令接口。

明确表示它将记录到系统日志。如果您想记录到文件,可以使用“>>”重定向到日志文件。


3
这是对man手册的错误解释。logger使用syslog或(在大多数Linux系统中)rsyslog,可以配置将日志消息放置在任何您喜欢的位置。 - shrewmouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接