【问题标题】:Redirect stderr to logger and then to file将 stderr 重定向到记录器,然后重定向到文件
【发布时间】:2013-06-28 19:25:11
【问题描述】:

我正在尝试从命令中获取stderr 并将其重定向到logger -s 命令(它将其输入写入syslog 并且-s 选项将输入的副本发送到logger' s 标准错误),然后最后到一个像这样的文件:

#!/bin/bash

ping foobar 2> logger -s 2>> ~/mylog.log

不幸的是,这会创建一个logger 文件和一个mylog.log 文件。所以我假设最初的2> 创建了一个logger 文件,然后2>> 创建了一个新的mylog.log 文件。

有没有办法将stderr 重定向到logger 命令?

编辑

我试图避免使用|,因为我也想在if 测试中使用重定向。

我也试过这种方式:

ping foobar 2> $(logger -s 2>> ~/mylog.log)

那也没用。

【问题讨论】:

  • 您能否解释一下如果您尝试进行的测试不适用于管道?
  • logger 是进程还是文件?如所写,代码创建了一个空文件logger 以供标准错误转到,然后改变主意并发送标准错误,以便将其附加到mylog.log。您是否希望将标准错误发送到两个文件,一个处于附加模式,一个处于普通写入模式?
  • @JonathanLeffler logger 是我正在尝试使用的 unix 程序。我无意中使用重定向创建了一个记录器文件,而我想将 stderr 传递给记录器 unix 程序并将其重定向到一个文件。

标签: linux bash logging stderr


【解决方案1】:

鉴于logger 的手册页,您正在寻找bashprocess substitution 并且:

ping foobar 2> >(logger -s 2>> ~/mylog.log)

这运行ping foobar,标准错误通过进程替换进入进程logger -slogger 进程将信息写入sysloglogger 的主要用途)并将输出写入标准错误(-s 选项)。第二个 I/O 重定向将标准错误从 logger 附加到文件 ~/mylog.log

命令的返回状态是来自ping的返回状态。这样可以避免管道,因此您可以使用if 测试等中编写的命令。

【讨论】:

  • 太棒了!非常感谢!
  • 但是当我这样做时: ls 2> >(logger "adsad") 即使没有 ls 错误,我的系统日志也包含“adsad”字符串。
  • @meso_2600:我想你会发现logger 应该这样做。如果你要求它写点什么,它会写给syslog。您可以决定logger 是否不知道它是否是一个错误并简单地假设它是,或者logger 是否知道它是一个错误,因为它被要求编写它——最终结果是相同的。当被要求写信时,logger 写信。
  • 好的,有什么办法可以让 stderr 上的单行代码告诉 logger 写一些东西?
  • 我的意思是在系统日志中我只想拥有标准错误
【解决方案2】:

如果你只想要标准错误...

ping foobar  3>&1 1>&2 2>&3 | logger >> ~/mylog.log

这应该交换 sderr 和 stdout。

【讨论】:

    【解决方案3】:

    您通常不能重定向到多个文件。这就是tee 的用途。此外,如果您要使用 tee,您需要使用管道。

    ping foobar 2>&1 >/dev/null | tee -a ~/mylog.log | logger
    

    这会将 stderr 重定向到 stdout,然后将 stdout 重定向到 /dev/null。 tee 将其输入附加到文件 ~/mylog.log-a 用于附加)并将其复制到输出,然后通过管道传输到 logger

    如果您想在 if 测试中使用任何生成的复杂命令,您可以将命令放入函数中。您可以使用 bash 的 $PIPESTATUS 检查管道中的每个退出状态(并从函数中返回):

    function bla {
        ping | successful_cmd   # ... or whatever
        [ 0 -eq ${PIPESTATUS[0]} ]   # return 0 (true) if the exit status of ping was 0 (true)
    }
    

    函数的返回状态将是最后执行的命令的返回状态。你可以这样使用函数:

    if bla; then echo true; else echo false; fi
    # or
    bla && echo success
    

    【讨论】:

    • 如果您尝试测试 ping 是否成功,那么在使用管道的 if 测试中如何工作?
    • 最初认为logger 是您想要将输出保存到的文件:D 我编辑了答案。还添加了有关 $PIPESTATUS 的信息。
    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 2014-07-22
    • 1970-01-01
    • 2021-06-29
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多