Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Linux中将linux syslog映射到printf大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在桌面上运行了一个 linux应用程序,我想将syslog()调用重定向到printf()调用. 注意:我不想替换呼叫,只是重定向 所以我写了一些代码来做到这一点: #ifndef EMBED #define syslog(level, stuff) printf("SYSLOG: %s\n", stuff) #endif 在我使用它的一个文件中工作得很好.我将其移动到一个新文件并收到错误: e
我在桌面上运行了一个 linux应用程序,我想将syslog()调用重定向到printf()调用.

注意:我不想替换呼叫,只是重定向

所以我写了一些代码来做到这一点:

#ifndef EMBED
#define syslog(level,stuff) printf("SYSLOG: %s\n",stuff)
#endif

在我使用它的一个文件中工作得很好.我将其移动到一个文件并收到错误

error: macro "syslog" passed 3 arguments,but takes just 2

我知道错误是因为新文件中的调用是混合的,有些是使用2个参数连接到syslog,有些是使用3.我也知道我需要以某种方式通过变量参数列表重定向,但我该怎么做?我还没有工作呢……

据我了解,syslog()和printf()应该是:

void syslog(int priority,const char *format,...)
int printf(const char *format,...)

所以我尝试过:

#define ERR 3
#ifndef EMBED         // This is not defined in my env,btw
#define syslog(pri,fmt,...) printf(fmt,...)
#endif
...
void main() {
...
syslog(ERR,"test");

但是这给出了错误

error: expected expression before ‘...’ token

关于如何使用这个宏的建议?

@H_419_46@解决方法
GCC在这方面有一个扩展,但最便携的处理方式是:

#define syslog(priority,...)    printf(__VA_ARGS__)

优先级是强制性的,但宏扩展会忽略.其余参数(强制格式加上可选的后续参数)位于printf()的参数列表中使用的__VA_ARGS__中.无论格式字符串是常量(文字)还是变量,都可以.

如果你想将输出标记为syslog()的代理,我会调用printf()以外的函数来完成这项工作:

#define syslog(priority,...) syslog_print(__VA_ARGS__)

甚至

#define syslog(priority,...) syslog_print(__FILE__,__LINE__,__func__,__VA_ARGS__)

这些将被声明为:

extern void syslog_printf(const char *fmt,...);

要么:

extern void syslog_printf(const char *file,int line,const char *func,const char *fmt,...);

实现是在< stdarg.h>中直接应用宏.加上v * printf()函数

void syslog_printf(const char *file,...)
{
    va_list args;
    printf("SYSLOG:%s:%d:%s: ",file,line,func);
    va_start(args,fmt);
    vprintf(fmt,args);
    va_end(args);
}

您可以添加时间戳以及您喜欢的任何其他内容;你也可以很容易地安排输出转到文件而不是标准输出;您也可以安排在功能内打开或关闭它.因此,平均而言,我会将syslog()替换为允许您调整代码使用设施的代理.

实际上,既然你已经发现了改变日志记录行为的要求,我建议你不要直接在你的代码中使用syslog(),而应该使用自己的函数(例如,syslog_printf(),但可能在代码中的不同名称,并且可以使用该功能的各种实现.这样做的唯一缺点是调用真正的syslog()现在更难 – 没有vsyslog()AFAIK.因此,对syslog()的基本调用通过使用vsnprintf()(或vasprintf()格式化syslog_printf()中的字符串来完成,如果您可以使用它并且内存耗尽不是可能的问题),然后调用syslog( )使用预格式化的字符串(syslog(优先级,“%s”,缓冲区);).当然,您还希望将优先级传递给代理函数以进行中继到syslog().

大佬总结

以上是大佬教程为你收集整理的如何在Linux中将linux syslog映射到printf全部内容,希望文章能够帮你解决如何在Linux中将linux syslog映射到printf所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。