syslog:日志文件中的错误程序名(#001)

时间:2013-10-14 14:32:10

标签: linux rsyslog

我使用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);

1 个答案:

答案 0 :(得分:1)

粗略猜测,ident是一个范围有限的C ++字符串对象 - 即它很可能是一个局部变量,而c_str()充其量只是一个暂时有效的指针。

此指针必须对应用程序的整个运行保持有效; openlog在手册中明确了这一点:

  

openlog()调用中的参数ident可能按原样存储。因此,如果它指向的字符串被更改,syslog()可能会开始在更改的字符串前面添加,如果它指向的字符串不再存在,则结果是未定义的。最便携的是使用字符串常量。

gnu.org联机帮助页提到:

  

请注意,字符串指针标识将由Syslog例程在内部保留。你不能释放ident指向的内存。传递对自动变量的引用也是危险的,因为保留范围意味着结束变量的生命周期。如果要更改标识字符串,则必须再次调用openlog;覆盖ident指向的字符串不是线程安全的。

所以最可能的事情是字符串变量超出范围,你最终得到一个指向一些随机字符串的指针,在你的情况下恰好是#001

解决方案很多,但它们都涉及确保c_str()指向的数据在应用程序运行期间不会发生变化。