日志基礎(chǔ)
首先我們要明確的是所謂的服務(wù)器日志系統(tǒng)到底是幫助我們做什么的
其實這也沒有什么好說的, 你會告訴我日志無非就是幫助我們快速定位服務(wù)器發(fā)生的錯誤或者問題, 當(dāng)然這也是日志眾多目的中最重要的一種
簡單來說 就是我們到底應(yīng)該如何寫出 干凈有用的日志
一些應(yīng)該記錄日志的地方
- 調(diào)用外部接口前后
- 系統(tǒng)狀態(tài)發(fā)生變化的時候
- 發(fā)生不正常錯誤的時候/業(yè)務(wù)異常
- 系統(tǒng)的入口與出口
- 非預(yù)期執(zhí)行
- 很少出現(xiàn)的 else
一些原則
- 輸出Log時避免自己出錯
- 過多的日志會拖慢系統(tǒng)
- 日志至少應(yīng)該包含描述和數(shù)據(jù)
- 重要的日志應(yīng)該添加特殊的可搜索字符
- 不要輸出密碼打毛、個人信息、信用卡信息等敏感數(shù)據(jù)
- 輸出重要方法的參數(shù)和返回值
- 輸出重要方法的開始和結(jié)束(異常時是否輸出結(jié)束日志籽前?)
- 如果和外部系統(tǒng)鏈接裙顽,需要輸出INPUT和OUTPUT
- 合理輸出異常信息(不要主動輸出異常付燥,合理通過框架、共通代碼輸出愈犹;避免異常被輸出多次)
- 考慮數(shù)據(jù)的輸出格式键科,最好輸出多種格式利用人看或者工具分析
- 合理輸出二進(jìn)制文件信息(name、size)
- 不要在循環(huán)中記錄日志
日志格式
一般分為 鍵值對 和 json 兩種 當(dāng)然因項目而異
apache 引用
192.168.56.6 - - [24/Sep/2012:11:11:11 +0900] "GET /info.php HTTP/1.0" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.7) Gecko/20120829 Firefox/10.0.7"
ngnix 引用
192.168.21.198 - - [06/Mar/2015:18:19:06 +0900] "GET /index.php HTTP/1.1" 200 87243 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"
日志級別
日志級別根據(jù)不同的日志系統(tǒng),級別也不同,大體上分為5種
借用其他博客看到的總結(jié) 每種不同級別的錯誤大概可以這么來說明
- ERROR:系統(tǒng)發(fā)生了嚴(yán)重的錯誤, 必須馬上進(jìn)行處理, 否則系統(tǒng)將無法繼續(xù)運行. 比如, NPE, 數(shù)據(jù)庫不可用等.
- WARN:系統(tǒng)能繼續(xù)運行, 但是必須引起關(guān)注. 對于存在的問題一般可以分為兩類: 一種系統(tǒng)存在明顯的問題(比如, 數(shù)據(jù)不可用), 另一種就是系統(tǒng)存在潛在的問題, 需要引起注意或者給出一些建議(比如, 系統(tǒng)運行在安全模式或者訪問當(dāng)前系統(tǒng)的賬號存在安全隱患). 總之就是系統(tǒng)仍然可用, 但是最好進(jìn)行檢查和調(diào)整.
- INFO:重要的業(yè)務(wù)邏輯處理完成. 在理想情況下, INFO的日志信息要能讓高級用戶和系統(tǒng)管理員理解, 并從日志信息中能知道系統(tǒng)當(dāng)前的運行狀態(tài). 比如對于一個機(jī)票預(yù)訂系統(tǒng)來說, 當(dāng)一個用戶完成一個機(jī)票預(yù)訂操作之后, 提醒應(yīng)該給出"誰預(yù)訂了從A到B的機(jī)票". 另一個需要輸出INFO信息的地方就是一個系統(tǒng)操作引起系統(tǒng)的狀態(tài)發(fā)生了重大變化(比如數(shù)據(jù)庫更新, 過多的系統(tǒng)請求).
- DEBUG:主要給開發(fā)人員看, 下面會進(jìn)一步談到.
- TRACE: 系統(tǒng)詳細(xì)信息, 主要給開發(fā)人員用, 一般來說, 如果是線上系統(tǒng)的話, 可以認(rèn)為是臨時輸出, 而且隨時可以通過開關(guān)將其關(guān)閉. 有時候我們很難將DEBUG和TRACE區(qū)分開, 一般情況下, 如果是一個已經(jīng)開發(fā)測試完成的系統(tǒng), 再往系統(tǒng)中添加日志輸出, 那么應(yīng)該設(shè)為TRACE級別.
日志系統(tǒng)
好的日志系統(tǒng)有很多 有很多現(xiàn)成的解決方案
一個好的日志系統(tǒng) 不僅包括日志系統(tǒng)的基礎(chǔ)功能(快速的記錄收集日志,按不同級別輸出日志,性能高) 還應(yīng)該能夠快速的分析日志(分析/模式匹配/關(guān)聯(lián)分析) 以及最后的監(jiān)控和報警功能
日志系統(tǒng)大概分三類:集中日志系統(tǒng)/分布式日志系統(tǒng)/開源日志系統(tǒng)
分布式日志系統(tǒng)
開源日志
Scribe
facebook 的開源日志系統(tǒng),可以存分布式文件系統(tǒng),也可以存數(shù)據(jù)庫
比較大的優(yōu)勢是容錯性好,數(shù)據(jù)庫掛了可以存儲在本地
是一個thrift client 簡介 初窺
ChukWa
Yahoo 開發(fā)的 Hadoop 的日志分析系統(tǒng)
Flume
日志收集系統(tǒng)
Kafka
Linkin 的開源消息系統(tǒng)
kids:知乎日志系統(tǒng)
kids 想做出什么樣的東西
- 分布式收集
- 集中存儲
- 實時訂閱
- 不丟(或者盡量不丟)
- 對應(yīng)用性能影響盡量小