如何禁用或重新路由 ALSA lib 日志记录

Posted

技术标签:

【中文标题】如何禁用或重新路由 ALSA lib 日志记录【英文标题】:How to disable or re-route ALSA lib logging 【发布时间】:2014-09-06 21:01:38 【问题描述】:

我有一个使用 libespeak 以及扩展的 ALSA 的 C++ 应用程序。

此应用程序第一次生成音频时,stderr 上会生成以下输出:

ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:961:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

我有自己的日志记录,想禁用这些错误,或者通过我自己的日志记录框架重新路由它们以进行额外的处理和报告。

【问题讨论】:

只有部分消息来自 ALSA。这是PortAudio bug。 【参考方案1】:

可以使用 freopen 重定向 stderr 的输出。(Is it possible to disable stderr in C++?)在我的情况下,这些错误是在调用 Pa_Initialize(); 时生成的,所以我在调用它之前将 stderr 重定向到 /dev/null 并重定向它之后回来。

freopen("/dev/null","w",stderr);
PaError err= Pa_Initialize();
freopen("/dev/tty","w",stderr);

【讨论】:

不错的方法。谢谢,我会试一试。 从几年前的评论来看 [app.assembla.com/spaces/arhHGeUuSr4k70eJe4gwI3/tickets/163/… 关于 CL 链接的错误,这似乎不是 PortAudio 的优先事项。在 freopen 的性能不会成为问题的情况下,这样的解决方案可能是最好的。【参考方案2】:

您可能希望查看snd_lib_error_set_handler 函数来注册任意错误处理回调。

http://www.alsa-project.org/alsa-doc/alsa-lib/group___error.html#ga6ba1f0aa6c6bc5d335ab297d6019cb03

【讨论】:

【参考方案3】:

这对我有用

#include <fcntl.h>

int main()

    int saved_stderr = dup(STDERR_FILENO);
    int devnull = open("/dev/null", O_RDWR);
    dup2(devnull, STDERR_FILENO);  // Replace standard out
    Pa_Initialize();
    dup2(saved_stderr, STDERR_FILENO);

【讨论】:

以上是关于如何禁用或重新路由 ALSA lib 日志记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在根级别禁用导入的模块日志记录

如何禁用某个列的 ActiveRecord 日志记录?

如何禁用 PyTorch-Lightning 记录器的日志记录?

从 Maven 禁用休眠日志记录

在日志记录中禁用函数调用或禁用代码行 C++

我可以在 javascript 中扩展控制台对象(用于重新路由日志记录)吗?