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

时间:2013-02-23 21:30:50

标签: bash shell logging

在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,但它是空的。

任何人都能看到我错过的东西吗?

5 个答案:

答案 0 :(得分:34)

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

这将指示logger将消息打印到STDERR(除了将其记录到syslog之外),因此您可以将STDERR重定向到文件。但是,它完全没有意义,因为消息已经通过syslog记录(默认优先级为user.notice)。

答案 1 :(得分:30)

@chepner强调logger专门用于记录消息。

我确实需要提一下@Thomas Haratyk只是询问为什么我不能简单地使用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/可能不是我的自定义日志文件的最佳位置。 (只是说)

答案 2 :(得分:6)

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

示例日志: enter image description here

答案 3 :(得分:4)

如果您看到记录器的手册页:

$ man logger
  

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

     

NAME logger - syslog(3)系统日志的shell命令接口   模块

     

SYNOPSIS logger [-isd] [-f file] [-p pri] [-t tag] [-u socket]   [消息...]

     

说明Logger在系统日志中输入条目。它提供了一个   shell命令接口到syslog(3)系统日志模块。

显然它会记录到系统日志。如果您要登录文件,可以使用“>>”重定向到日志文件。

答案 4 :(得分:0)

我通过使用过滤器做到了。如今,大多数Linux系统都使用rsyslog。配置文件位于/etc/rsyslog.conf/etc/rsyslog.d

每当我运行命令logger -t SRI 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]#