捕获错误消息并创建日记条目

时间:2017-04-06 17:42:35

标签: linux bash syslog

以下代码我放在我正在使用的许多脚本之上......

#!/bin/bash

# redirect all error messages to the protocol,
# then print the same message to stdout
exec 1> >(logger -i -s -t $0 -p 4) 2>&1

这行代码将在运行脚本时发生错误的协议条目。 但是,当通过stdinstdout进行通信时,此代码无法正常工作。我只想记录错误消息。

说实话,我不知道我是如何设法让这一系列编码工作的。

尽管如此,我正在搜索代码,将execlogger 的组合替换为放入function的{​​{1}}。但是我不知道如何以这种方式捕获/接收错误消息。

我的目标是仅创建所有错误消息的协议条目。

要明确的是,我不想在每段代码之后使用trap "createErrorMessage" ERR而我不想用$?抓住每一段代码。

这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

loggersyslog发送输出时,systemd-cat会为systemd执行相同类型的功能。例如见:

echo "hello" | systemd-cat
journalctl | tail -10

如果您将脚本作为systemd服务单元运行,则无需使用systemd-cat:默认情况下systemd将发送它控制日志的服务的STDOUT和STDERR。

有关该工具的详情,请参阅man systemd-cat

答案 1 :(得分:1)

也许不明白你想要什么,但是让我们说这个脚本mytest.sh

date > jj
cat jj - jjj    # jj + stdin + (nonexistenxt) jjj #e.g. error too
mkdir jj        #error

所以,当你将它用作带有重定向的脚本时,

echo "Hello world" | bash mytest.sh > output

你会得到:

文件output

中的

1。)

Thu Apr  6 21:21:13 CEST 2017
Hello world

并在屏幕上显示错误

cat: jjj: No such file or directory
mkdir: jj: File exists

现在,也改变上面的脚本

((

date > jj
cat jj - jjj    # jj + stdin + (nonexistext jjj)
mkdir jj    #error

) 3>&1 1>&2 2>&3 | tee >(logger -i -t $0 -p 4)) 3>&1 1>&2 2>&3

注意,从记录器args中删除了-s

现在再次使用它

echo "Hello world" | bash mytest.sh > output
    输出中的
  • 将是您预期的stdout
  • stderr会做屏幕(你可以再次重定向)
  • 并且记录器将记录所有错误。

如您所知,它有效

  • 交换stdout和stderr
  • 将stdout(现在是stderr)传递给记录器进程
  • 将stdout / stderr交换回来

它可能更简单,因为使用-s的记录器可以将消息复制到stderr本身,但这可以普遍使用。不幸的是,它使用2个以上的叉子是低效的。请注意((

使用:

somefunc() { some actions...; }
trap 'somefunc' ERR

不会像你期望的那样帮助你。在somefunc中进行一些花哨的重定向为时已晚,因为错误发生后somefunc触发了 ,例如错误消息已打印到stderr