2013-10-14 157 views
0

我使用rsyslog現在,想記錄從我的應用程序的一些行動。日誌記錄工作正常,日誌文件將被正確創建。系統日誌:在日誌文件中錯誤PROGRAMNAME(#001)

我格式化輸出,因爲我想看到的programname

rsyslog.conf:

$template usermsg,"%TIMESTAMP% %HOSTNAME% %programname% \n" 
$ActionFileDefaultTemplate usermsg 

輸出:

Oct 14 16:28:25 box #001 

我總是# 001 as programname,雖然它應該是「計算器」。有誰知道如何解決這個問題?

我在創建記錄器的一個實例我的申請

// IDENT = 「計算器」

//設施= LOG_USER/*(1 < < 3)隨機用戶級消息*/

openlog(ident.c_str(),0,設施);

+0

它適合於[北京]更好。 – fedorqui

回答

1

在野生猜測,ident是一個C++範圍有限的字符串對象 - 即,它是最有可能的一個局部變量和c_str()是,充其量一個暫時有效指針。

這個指針一直停留有效期爲你的應用程序的運行的全部; openlog了這一點手冊中:

在openlog的調用的參數的ident()可能是原樣保存。因此,如果它指向的字符串發生更改,syslog()可能會開始預先添加已更改的字符串,並且如果它指向的字符串不再存在,則結果是未定義的。大多數可移植的是使用一個字符串常量。

的gnu.org手冊頁提到:

請注意,字符串指針的ident將通過系統日誌程序內部保留。你不能釋放ident指向的內存。將引用傳遞給自動變量也是很危險的,因爲離開該範圍意味着結束變量的生命週期。如果要更改標識字符串,則必須再次調用openlog;覆蓋由ident指向的字符串不是線程安全的。

所以最有可能的是,該字符串變量是走出去的範圍,你結束了一個指向一些隨機字符串,而你的情況正好是#001

解決方案有很多,但它們都涉及確保所指向的c_str()不要你的應用程序的運行過程中改變數據。