2011年1月2日 星期日

log記錄器怎麼架

作者: letoh ( ) 看板: P_letoh.talk
標題: Re: [問題] log記錄器怎麼架比較通用又簡單方便?
時間: Sat Nov  8 19:38:46 2008

※ 引述《NDark (*代客拼圖*)》之銘言:
> 專門用來紀錄系統exception的紀錄器.程式結束或是定期會存一個文字檔.
> 不知道其他專案是什麼做的?
> 之前是隨手寫個 "在只會有單一物件的某class中寫一個string的vector"
> 不管main loop或是class中有什麼exception就全丟字串進去記起來.
> class object要釋放之前再寫檔.

buffered output 機制只是實作手法而已  先不討論

> 不過後來想想這種東西應該獨立出來比較能讓整個系統都能記log.
> 這樣的話就會變成一個很底層的函式或是類別.

java 有個類似的東西叫 logger
un*x 也有個很像的機制叫做 syslogd
只要程式呼叫 syslog 這個 system call 就會把資料寫進某個檔案

> 不過這樣每個類別都要引用這個東西,(變成祖國不可分離的一部分XD)
> 好像會不會反而造成困擾?

作為系統的基礎建設  本來就會跟大家產生相依關係
但其實我覺得還好  換個方向想  因為都相依於同一個 logger
不需要的時候只要把實作的 .so 或 .dll 換空函式實作就可以關掉了

> 不知道尻手知不知道有沒有什麼比較通用簡單方便的機制?
> 我用的目的是為了自己比較好debug,出了什麼問題就先去看這個log.

其實我們用的也是一個 singleton logger
手法的變化大概不大  我用過好幾個都差不多  主要是方便性與彈性
之前用的 logger 有分 class (module)/level
輸出 log 時可以透過一些參數來過濾  對除錯很有幫助

> 比較常用這樣寫法:
> if( false == 檢查靜坐女學生健康() )
> {
>     SYSTEMLOG( "警告!! 某函式裡面 :: 檢查失敗" );
>     return false ;
> }
> 其他人的code我看過的只有windows程式裡面用這種方式的.
> try
> {
>     消防檢查
> }
> catch()
> {
>     MeesageBox "失火啦" // 反正在windows機制裡面應該都可以用?
>                         // 所以也不用特地引用什麼.
>                         // 但是如果是在某個工具類別裡面就不能這樣用了.
>                         // 我認為工具內應該不需要讓windows的結構滲透進去.
> }

AOP 需要額外支援  傳統程式語言大概不太容易做到
少了語言機制的話  就只能用這種彆扭的方式來寫啦
有 exception 的話當然很方便  至少運算邏輯乾淨多了
不會混一堆錯誤檢查 (但也要保證底層一定會丟出 exception)
c 的話只能靠 setjmp 幫忙...

另外也可以考慮做在 assertion macro 裡 (參考 assert.h)
雖然語意上會有點差異  但概念上是類似的  可以借來用
(assertion 一般是用來檢查百分之百會發生的狀況  而不是例外狀況)



[m
--
[1;32m※ Origin: [33mVisionBBS @ CSIE.NCKU [37m [m
[1;32m※ From  : [36mvision.csie.ncku.edu.tw [m
※ X-Info: NDark -> ndark@vision.csie.ncku.edu.tw
※ X-Sign: 14HB88II./PZWxMArdik (08/11/08 22:24:18 )

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.