如何将每个“set -x”日志捕获到 syslog?

Posted

技术标签:

【中文标题】如何将每个“set -x”日志捕获到 syslog?【英文标题】:how can i capture every "set -x" log to syslog? 【发布时间】:2012-08-23 03:05:05 【问题描述】:

情况是这样的

我有一个 shell 脚本,它运行一些具有不同参数和选项的复杂命令。

这些参数和选项是由第三方应用程序传递的,所以我可能不知道每次向 shell 脚本传递的参数和选项是什么

所以为了知道这一点,我在 shell 脚本的开头使用 set -x 来查看该命令到底在运行什么。我想使用记录器将那些调试器消息从 set -x 移动到 syslog。

我用trap来做

trap "logger $(BASH_COMMAND)" DEBUG

但是 syslog 的输出并没有它正在运行的确切命令,而是那样......

apple=1
orange=2
command $apple $orange

..................

但我希望日志的输出应该是

command 1 2 

我该如何实现?

【问题讨论】:

DEBUG 显示命令 before 执行和解析。顺便说一句,$apple=1 是无效的(除非您使用 Perl 进行编码)。 【参考方案1】:

这是一种方法:

#!/bin/bash

apple=1
orange=2
set -x

exec 2> >(logger)
echo $apple $orange

我们正在将 stderr(设置 -x 路由到 stderr,文件描述符 2)重定向到记录器程序。

在我的 /var/log/messages 我得到:

Aug 23 08:16:07 yogi logger: + echo 1 2

【讨论】:

这是一个很好的答案!你能详细描述一下 exec2> >(logger) 是做什么的吗? 是的,set -x 输出到标准错误。 exec 2> >(logger) 将文件描述符 2 (stderr) 重定向到 logger 程序的标准输入。它被称为进程替换(参见man bash)。 嘿,还有一个后续问题,+号是什么意思? 想一想,在这里设置PS4='$0'(脚本的名称)可能有用。

以上是关于如何将每个“set -x”日志捕获到 syslog?的主要内容,如果未能解决你的问题,请参考以下文章

指定 IP 地址时 syslog NG 未启动,但可作为全部捕获并写入文件设置

Docker-如何使用 syslog 在主机上记录日志?

如何在 python 中将日志发送到 syslog?

将 LEVEL 包含到 SysLog 日志文件中

如何将日志从 docker 容器转发到主机 journald/syslog 服务?

如何 syslog-ng 到远程设施