【发布时间】:2011-02-07 23:32:23
【问题描述】:
我在 Unix 上开发一个向 syslog 发送消息的 C++ 程序。
当前代码使用类似于 printf 的 syslog 系统调用。
现在我更愿意为此目的使用流,通常是内置的 std::clog。但是 clog 只是将输出重定向到 stderr,而不是 syslog,这对我来说毫无用处,因为我还将 stderr 和 stdout 用于其他目的。
我在another answer 中看到,使用 rdbuf() 将其重定向到文件很容易,但我认为无法应用该方法来调用 syslog,因为 openlog 不返回我可以用来绑定的文件处理程序上面有一条流。
还有其他方法吗? (对于unix编程来说看起来很基础)?
编辑:我正在寻找不使用外部库的解决方案。 @Chris 提出的建议可能是一个好的开始,但要成为公认的答案仍然有点模糊。
编辑:使用 Boost.IOStreams 没问题,因为我的项目已经在使用 Boost。
与外部库链接是可能的,但也是一个问题,因为它是 GPL 代码。依赖关系也是一种负担,因为它们可能与其他组件发生冲突,在我的 Linux 发行版上不可用,引入第三方错误等。如果这是唯一的解决方案,我可能会考虑完全避免流......(可惜)。
【问题讨论】:
-
syslog 需要的不仅仅是消息字符串;它还需要
error level等等。我不确定这是否可以使用流。也许有机械手(就像std::hex)? -
查看可用的日志库。许多人将允许您编写自己的后端,将您的消息写入您想要写入的任何位置。许多还带有内置过滤和其他不错的功能。只有很少的重量轻的行李很少,但如果你愿意,你可以找到它们。我正在使用这个:templog.org 它只是一些源文件,几乎都在头文件中,并且擅长在编译时(对于时间关键代码)以及运行时进行过滤。但你可能会喜欢其他的。只是不要重新发明轮子。
-
如果不能使用内置 clog 完成,另一个用户定义的专用流几乎一样好,如果使用操纵器或成员函数设置级别,我不太在意。
-
@kriss:您几乎从不想专门化 stream 类,但几乎总是编写自己的流 buffer。
-
@sbi:我正在寻找真正轻量级的东西。看起来很奇怪,20 行 C++ 无法完成如此简单的事情。感谢您指出 templog.org 它看起来不错,但似乎正在做 syslog 已经做的事情(如日志过滤)。我不想为我的操作系统添加第二个轮子,或者用其他轮子替换现有的 syslog 轮子。实际上感觉就像内置的 C++ 轮子 (std::clog) 是方形的......