2011年11月14日 星期一

FreeBSD : syslogd 儲存的 UTF-8 編碼記錄變亂碼

最近這幾年不用管系統,  FreeBSD 好久沒碰,Samba 更不用講。前些日子,東勢國小的游志峰老師問了我一個關於 Samba 在 FreeBSD UTF-8 環境中遇到的中文亂碼問題,為了模擬相同的測試環境,我去下載了 FreeBSD 8.2 Release 的 ISO 檔,將系統架起來,再把 Samba 3.5.6 裝起來。server 架設完畢之後,參考游老師提到,在 SSORC.tw 中的這篇有關可以讓 Samba 記錄使用者對檔案做了什麼動作的文章


把 Samba 的 vfs_full_audit (VFS 的 module) (詳見 man vfs_full_audit) 在 smb.conf 中設定啟用,並搭配設定 /etc/syslogd.conf 及產生預設的系統記錄檔以後,利用 Windows 去將檔案名稱改為中文名稱以後,果然在記錄檔中看到了一堆帶有 M 或 ^ 開頭的亂碼,很明顯是需要多字元的中文字被拆開來了才打回「原形」。由於對 vfs_full_audit 的機置不了解,剛開始,我一直在 smb.conf 的設定上打轉,找不出原因,後來看到 extd_audit 和 vfs_full_audit 的比較,才知道,關鍵在 syslogd 上。

利用 extd_audit 一樣也可以留下使用者的操作紀錄,除了可以記錄的項目有異外,有另一個很大的不同點,利用 extd_audit 基本上是記錄在 Samba log 目錄下以機器為單位,寫在不同的 log 檔案裡,而 vfs_full_audit 則是透過 syslogd 將所有的紀錄都寫在指定的一個 log 檔裡。而經過測試,如果用 extd_audit 不透過 syslogd 來寫紀錄時,Unicode 的中文字都正常;但是用 vfs_full_audit 時,透過 syslogd 來寫紀錄時, Unicode 編碼的中文就會變成亂碼。
找到問題的源頭,當然就「 man syslogd」看一下 syslogd 的手冊。看到了底下這一段有關「-8」這個參數的說明 ,問題可獲解決了:


     -8      Tells syslogd not to interfere with 8-bit data.  Normally syslogd
             will replace C1 control characters (ISO 8859 and Unicode
             characters) with their ``M-x'' equivalent.  Note, this option
             does not change the way syslogd alters control characters (see
             iscntrl(3)).  They will always be replaced with their ``^x''
             equivalent.

原來 FreeBSD 預設啟動 syslogd 的參數並沒有 -8 ,也就是它預設會把一些字元重新編碼過,這個動作對中文來說就會出問題了。所以,我們只要動手改一下 syslogd 的啟動參數,並重新啟動 syslogd 即可解決中文字的問題。

  • 修改 /etc/rc.conf :找找看,這個檔案裡面有沒有 syslogd_flags 的設定,如果有就在引號中加入 -8 的參數。如果完全沒有 syslogd_flags 的設定,就加入底下這一行並儲存檔案:

    syslogd_flags="-s -8"

  • 重新啟動 syslogd:執行底下的這行指令就可以

    /etc/rc.d/syslogd restart

上面兩個動作完成以後,就可以讓 syslogd 完整的去記錄所有字元,不再讓中文變成亂碼了。


參考資料

1 則留言:

  1. 感謝這篇!終於讓我解決SYSLOG中文亂碼的問題!

    回覆刪除

 
© 2009. Design by Pocket