我使用rsyslog并希望从我的应用程序中记录一些操作。日志记录工作正常,日志文件将正确创建。
我格式化了输出,因为我希望看到programname
:
rsyslog.conf:
$template usermsg,"%TIMESTAMP% %HOSTNAME% %programname% \n"
$ActionFileDefaultTemplate usermsg
输出:
Oct 14 16:28:25 box #001
我总是将#001 作为programname
,尽管它应该是“计算器”。有没有人知道如何解决这个问题?
我在我的应用:
中创建了一个记录器实例// ident =“calculator”
// facility = LOG_USER / *(1<<< 3)随机用户级消息* /
openlog(ident.c_str(),0,facility);
答案 0 :(得分:1)
粗略猜测,ident
是一个范围有限的C ++字符串对象 - 即它很可能是一个局部变量,而c_str()
充其量只是一个暂时有效的指针。
此指针必须对应用程序的整个运行保持有效; openlog在手册中明确了这一点:
openlog()调用中的参数ident可能按原样存储。因此,如果它指向的字符串被更改,syslog()可能会开始在更改的字符串前面添加,如果它指向的字符串不再存在,则结果是未定义的。最便携的是使用字符串常量。
gnu.org联机帮助页提到:
请注意,字符串指针标识将由Syslog例程在内部保留。你不能释放ident指向的内存。传递对自动变量的引用也是危险的,因为保留范围意味着结束变量的生命周期。如果要更改标识字符串,则必须再次调用openlog;覆盖ident指向的字符串不是线程安全的。
所以最可能的事情是字符串变量超出范围,你最终得到一个指向一些随机字符串的指针,在你的情况下恰好是#001
。
解决方案很多,但它们都涉及确保c_str()
指向的数据在应用程序运行期间不会发生变化。