GVKun编程网logo

如何将INFO和DEBUG日志记录消息发送到stdout,将更高级别的消息发送到stderr

10

如果您想了解如何将INFO和DEBUG日志记录消息发送到stdout,将更高级别的消息发送到stderr的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于bash–如何将STDERR重定向到

如果您想了解如何将INFO和DEBUG日志记录消息发送到stdout,将更高级别的消息发送到stderr的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于bash – 如何将STDERR重定向到STDOUT,但忽略原来的STDOUT?、bash – 如何将stderr重定向到stdout,反之亦然、bash – 如何将错误输出重定向到stdout和stderr?、bash – 将STDERR发送到记录器的有价值的信息。

本文目录一览:

如何将INFO和DEBUG日志记录消息发送到stdout,将更高级别的消息发送到stderr

如何将INFO和DEBUG日志记录消息发送到stdout,将更高级别的消息发送到stderr

python的日志记录模块是否有一种简单的方法可以将具有DEBUG或INFO级别的消息以及具有更高级别的消息发送到不同的流?

反正这是个好主意吗?

答案1

小编典典

不一定是一个好主意(将信息和调试消息混入正常输出中可能会造成混淆!),但可行,因为您可以有多个处理程序对象和每个对象的自定义过滤器,以便选择日志记录每个处理程序要处理的内容。

bash – 如何将STDERR重定向到STDOUT,但忽略原来的STDOUT?

bash – 如何将STDERR重定向到STDOUT,但忽略原来的STDOUT?

参见英文答案 > How to pipe stderr,and not stdout?9个答案我有一个程序,其STDERR输出我想检查和运行grep等。

所以我可以重定向到STDOUT和使用grep,但问题是,我不想原来的STDOUT内容。

所以,这一个不会做

cmd 2>&1 | grep pattern

因为它会混合原STDOUT和STDERR。

和这一个不工作,因为grep不读取STDERR输出:

cmd 1>/dev/null | grep pattern

但也是,这一个不会工作:

cmd 1>/dev/null 2>&1 | grep pattern

因为输出将完全为空,因为一切都写入/ dev / null。

但是必须有一个简单的方法吗?

什么不工作:

你最后一个命令的原因:

cmd 1>/dev/null 2>&1 | grep pattern

不工作,源自重定向工作顺序的混乱。您希望最后引用的重定向应用于每个输出上的前一个,以便输出原始标准输出文件描述符(1)将转到/ dev / null,并输出到标准错误文件描述符(2)转到原始标准输出。

但是,这不是shell重定向如何工作。每个重定向通过关闭“源”并将“目标”复制到其中来重新映射文​​件描述符(参见dup(2)和close(2)的手册页)。这意味着在命令中,标准输出首先被/ dev / null替换,然后标准错误替换为标准输出,即/ dev / null。

什么工作:

因此,要获得所需的效果,您只需要逆转重定向。然后,您将有标准错误转到标准输出,原始标准输出转到/ dev / null:

cmd 2>&1 >/dev/null | grep pattern

(注意,1 before>是不必要的 – 对于输出重定向,标准输出是默认值)

附录:Charlie提到重定向到& – 关闭文件描述符。如果使用支持该扩展的交互式shell(bash和一些其他实现但不是全部,它是not standard),你也可以这样做:

cmd 2>&1 >&- | grep pattern

这可能更好 – 它可以节省一些时间,因为当命令尝试写入标准输出时,对写入的调用可能立即失败,而无需等待上下文切换到内核和驱动程序处理/ dev / null(取决于系统调用实现 – 一些可能在libc函数中捕获,一些也可能有/ dev / null的特殊处理)。如果有很多输出可以值得,并且它的输入更快。

这将主要工作,因为大多数程序不关心如果他们不能写入标准输出(谁真正检查printf的返回值),并不介意标准输出关闭。但是一些程序如果写入失败,可以使用失败代码释放 – 通常阻塞处理器,程序使用一些小心的I / O库或记录到stdandard输出。所以如果它不工作记住这是一个可能的原因,并尝试/ dev / null。

bash – 如何将stderr重定向到stdout,反之亦然

bash – 如何将stderr重定向到stdout,反之亦然

我从bash脚本调用第三方二进制可执行文件,但由于某些奇怪的原因,可执行文件将其信息消息写入stderr并将其错误消息写入stdout. (我想这是一个错误…)

如何在调用可执行文件时反转此行为?

我试过了

callExecutable  1>&2 2>&1

但这似乎将所有输出重定向到stderr而没有重定向到stdout.
我可能需要一个中间步骤?

解决方法

您可以使用另一个文件描述符交换stderr和stdout:

callExecutable 3>&1 1>&2 2>&3

可以把它想象成使用temp变量在编程中交换其他两个变量:

temp = x
x = y
y = temp

这是一个非常有用的网站,详细描述了一些bash one-liners.

bash – 如何将错误输出重定向到stdout和stderr?

bash – 如何将错误输出重定向到stdout和stderr?

我正在组建一个复杂的管道,我想在程序输出中包含stderr以便记录,但我也希望错误保留在stderr上,这样我就能发现问题.

我发现this question询问如何将stdout stderr指向一个文件并仍在终端上获得stderr;它很接近,但我不想将stdout重定向到一个文件:程序的输出将被其他脚本使用,所以我希望它保留在stdout上(对于stderr也是如此).所以,总结一下:

>脚本在fd 1中生成输出,在fd 2中生成错误.
>我希望调用程序重新排列事物,以便输出错误出现在fd 1中,错误出现在fd 2中.
>此外,错误应与输出交错(尽可能与自己的缓冲允许),最后不保存和添加.

尽职调查:使用2>& 1捕获stderr非常容易.通过T形管道保存和查看标准输出很容易.我也知道如何将stdout转移到文件并通过管道直接stderr:命令2>& 1 1> fileA |发球文件B.但是我如何复制stderr并将stdout放回fd 1?

作为生成stdout和stderr的测试,让我们使用以下内容:
{ echo out; echo err >&2; }

以下代码演示了如何将stdout和stderr发送到管道中的下一步,同时还将stderr发送到终端:

${ echo out; echo err >&2; } 2> >(tee /dev/stderr) | cat >f
err
$cat f
out
err

这个怎么运作

> 2>

这会将stderr重定向到后面的(伪)文件.
>>(tee / dev / stderr)

这是进程替换,它充当从stderr接收输入的伪文件.它接收的任何输入都被发送到tee命令,该命令将它发送到stderr和stdout.

bash – 将STDERR发送到记录器

bash – 将STDERR发送到记录器

我正在编写一个bash脚本来执行异地备份,使用SSH上的rsync.我可以将STDOUT发送到记录器,用于记录日志
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ me@offisite:backup | logger -i

但是我想要发送STDERR,所以如果出现问题,例如异地不可用,则应将该输出发送到记录器并记录.

如果你想要stderr而不是stdout(而不是stderr和stdout),你可以执行以下操作:

>打开另一个文件描述符(9)
>将stdout(1)重定向到新文件描述符(9)
>将stderr(2)重定向到stdout(1)

看起来像这样:

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ me@offisite:backup 9> /dev/null 1>&9 2>&1 | logger -i

或者,您可以使用流程替换:

logger -i <( rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ me@offisite:backup > /dev/null )

今天关于如何将INFO和DEBUG日志记录消息发送到stdout,将更高级别的消息发送到stderr的讲解已经结束,谢谢您的阅读,如果想了解更多关于bash – 如何将STDERR重定向到STDOUT,但忽略原来的STDOUT?、bash – 如何将stderr重定向到stdout,反之亦然、bash – 如何将错误输出重定向到stdout和stderr?、bash – 将STDERR发送到记录器的相关知识,请在本站搜索。

本文标签: