【问题标题】:Redirect shell script stderr to syslog将 shell 脚本 stderr 重定向到 syslog
【发布时间】:2021-01-13 07:41:39
【问题描述】:

我经常看到 stdout 和 stderr 都通过管道传输到 syslog。但是,在 syslog 中不再可能区分它是否是错误。消息严重性始终是信息(或者我使用单个记录器命令的 -p 选项设置的)。如何解决这个问题呢?具体来说,它是关于我的备份脚本发送错误echo "Error occurred...!" >&2

脚本通过以下语句作为 cron 作业运行:

/root/bin/backup 2>&1 | /usr/bin/logger -t backup -i

【问题讨论】:

  • 您可以根据需要将 stderr 和 stdout 记录到不同的位置。目前尚不完全清楚您的确切问题是什么。
  • 不,相同的位置(系统日志),但启用过滤和监控的严重性不同(请参阅rsyslog.com/doc/v8-stable/configuration/…)
  • 我不了解 rsyslog,但我了解您希望在将 stderr 中的消息写入同一个文件之前对其进行预处理,对吗?
  • @Amit Singh 每个日志条目都有一个严重性。通常它是“信息”(代码 6)。默认情况下,严重性不显示在 /var/log/syslog 中。但是使用 Lggr 之类的监控工具,可以按严重程度进行过滤并执行一些进一步的操作,例如对关键消息发出警报。

标签: linux shell stderr io-redirection syslog


【解决方案1】:

您可以轻松地将 stdout 和 stderr 分别通过管道传输到不同的命令:

{ some_command 2>&3 | logger -t OUTPUT -i; } 3>&1 | logger -t ERROR -i

选项:

  • -i

    用每一行记录 logger 进程的 PID。 ref

  • -p, --priority 优先级

    以指定的优先级将消息输入到日志中。优先级可以用数字或设施.级别对指定。例如,-p local3.info 将消息作为信息记录在 local3 工具中。默认为 user.notice。 ref

(tim在下面的评论中使用-p user.error的例子)ref

  • -t, --tag 标签

    用指定的标签标记要记录的每一行。默认标签为终端登录用户名(或基于有效用户ID的用户名)。 ref

(TAG 是 ABNF 字母数字字符串,不得超过 32 个字符。)ref

例子:

# { ls -d /etc /etx 2>&3 | logger -t OUTPUT -i; } 3>&1 | logger -t ERROR -i
# tail -n2 /var/log/messages
Sep 27 16:30:12 xxxx ERROR[4138]: ls: cannot access '/etx': No such file or directory
Sep 27 16:30:12 xxxx OUTPUT[4140]: /etc
( some_command 2>&3 | logger -t SOMECOMMAND -i; ) 3>&1 | logger -t SOMECOMMAND -i -p user.error

【讨论】:

  • 添加选项 -p user.error 后,错误消息也会获得所需的消息严重性:3,1,Sep 28 20:33:58,v2201911106801100891,ERROR[25406]:, ls: cannot访问“/etx”:没有这样的文件或目录
猜你喜欢
  • 2017-07-09
  • 2021-09-08
  • 1970-01-01
  • 2021-01-28
  • 2014-07-22
  • 2012-10-08
  • 2011-03-02
  • 2021-08-19
  • 1970-01-01
相关资源
最近更新 更多