一窍帝、什么是日志
在計算機領域狈涮,日志是一個記錄了發(fā)生在運行中的操作系統(tǒng)或其他軟件中的事件授帕,或者記錄了在網(wǎng)絡聊天軟件的用戶之間發(fā)送的消息。在任何系統(tǒng)中晶丘,日志都是非常重要的組成部分黍氮,它是反映系統(tǒng)運行情況的重要依據(jù),也是排查問題時的必要線索浅浮。
二沫浆、日志的用處
好的日志可以幫助我們
- 了解線上系統(tǒng)的運行狀態(tài)
- 快速準確定位線上問題
- 發(fā)現(xiàn)系統(tǒng)瓶頸
- 預警系統(tǒng)潛在風險
挖掘產(chǎn)品最大價值
……
三、日志的類型
- 訪問日志
訪問日志一般是記錄了所有對web服務器的訪問請求滚秩,這樣網(wǎng)絡管理員就可以分析用戶的瀏覽行為件缸,找到熱點,找到待優(yōu)化的地方叔遂。
- 行為日志
行為日志是用來記錄記錄和統(tǒng)計用戶觸發(fā)的各種行為他炊。
是網(wǎng)站運營人員統(tǒng)計、分析用戶的重要依據(jù)
- 應用日志
應用日志包含應用程序編寫的各種錯誤消息已艰、警告或其他事件痊末。這些消息可以提供連接到特定用例的邏輯、高級信息哩掺。這些消息可以幫助我們了解應用程序的行為凿叠。常見的一些應用日志內(nèi)容為:
- 調(diào)用依賴的外部第三方系統(tǒng)的消息提示
- 業(yè)務異常的堆棧跟蹤。
- 重要的狀態(tài)變化嚼吞。
- 系統(tǒng)日志
系統(tǒng)日志是記錄系統(tǒng)中硬件盒件、軟件和系統(tǒng)問題的信息,同時還可以監(jiān)視系統(tǒng)中發(fā)生的事件舱禽。用戶可以通過它來檢查錯誤發(fā)生的原因炒刁,或者尋找受到攻擊時攻擊者留下的痕跡。
日志格式
每種類型的日志都有一些自己的日志格式誊稚,這里我們推薦一個行業(yè)標準的日志格式:
Common Log Format(access log)
它又稱The NCSA Common Log,是web服務器產(chǎn)生訪問日志的標準格式
下列是一個日志示例以及各字段的說明:
125.125.125.125 - dsmith [10/Oct/1999:21:15:05 +0500] "GET /index.html HTTP/1.0" 200 1043
下列是對這個例子中的字段解釋:
字段 | 說明 |
---|---|
host (125.125.125.125 in the example) | 發(fā)出這次HTTP請求的客戶端主機的IP地址 |
rfc931 ("-" in the example) | 用于標識發(fā)出HTTP請求的客戶端的標識符翔始。如果不存在值罗心,則替換“ - ” |
username (dsmith in the example) | 用戶名/用戶ID,主要用于客戶端的認證城瞎。如果不存在值渤闷,則替換“ - ” |
date:time timezone ([10/Oct/1999:21:15:05 +0500] in the example) | 這次HTTP請求的日期以及時間戳 |
request ("GET /index.html HTTP/1.0" in the example) | HTTP請求。請求字段包含三條信息脖镀。主要部分是請求的資源(index.html)飒箭。請求字段還包含HTTP方法(GET)和HTTP協(xié)議版本(1.0) |
statuscode (200 in the example) | 狀態(tài)碼,標識此次請求是失敗還是成功 |
bytes (1043 in the example) | 一次Http請求中蜒灰,所傳輸?shù)臄?shù)據(jù)大小补憾,不包括Http頭 |
日期/時間字段里的具體格式是:
[dd/MMM/yyyy:hh:mm:ss +-hhmm]
字段 | 說明 |
---|---|
dd | 是當月所在的日子 |
MMM | 月份 |
yyy | 年 |
:hh | 小時 |
:mm | 分鐘 |
:ss | 秒 |
+-hhmm | 時區(qū) |
實際上,即使是一位數(shù)天卷员,這一天通常也會以兩位數(shù)格式記錄盈匾。例如,該月的第二天將表示為02毕骡。但是削饵,某些HTTP服務器會將單個數(shù)字日記錄為單個數(shù)字,所以在看日志的時候未巫,要知道這兩種日期格式的存在窿撬。
日志等級
DEBUG:該級別日志的主要作用是對系統(tǒng)每一步的運行狀態(tài)進行精確的記錄⌒鸱玻可以將各類詳細信息記錄到DEBUG里劈伴,起到調(diào)試的作用,包括參數(shù)信息握爷、調(diào)試細節(jié)信息跛璧、返回值信息等。
INFO:該種日志記錄系統(tǒng)的正常運行狀態(tài)新啼,通過查看INFO級別的日志追城,可以很快地對系統(tǒng)中出現(xiàn)的 WARN,ERROR,FATAL錯誤進行定位≡镒玻可以將初始化系統(tǒng)配置座柱、業(yè)務狀態(tài)變化信息,或者用戶業(yè)務流程中的核心處理記錄到INFO日志中物舒,方便日常運維工作以及錯誤回溯時上下文場景復現(xiàn)色洞。
WARN:該日志表示系統(tǒng)可能出現(xiàn)問題,也可能沒有冠胯。
ERROR:該級別的錯誤也需要馬上被處理火诸,但是緊急程度要低于FATAL級別。ERROR應該盡量詳細記錄涵叮。
FATAL:需要立即被處理的系統(tǒng)級錯誤惭蹂。系統(tǒng)需要將錯誤相關痕跡以及錯誤細節(jié)記錄FATAL日志中,方便后續(xù)人工回溯解決割粮。
日志系統(tǒng)
在Unix系統(tǒng)上盾碗,有兩類常用的日志系統(tǒng),很多日志系統(tǒng)都是基于他們做了具體的實現(xiàn):
1.syslog
Syslog常被稱為系統(tǒng)日志或系統(tǒng)記錄舀瓢,是一種用來在互聯(lián)網(wǎng)協(xié)議(TCP/IP)的網(wǎng)上中傳遞記錄檔消息的標準廷雅。這個詞匯常用來指涉實際的syslog協(xié)議,或者那些提交syslog消息的應用程序或數(shù)據(jù)庫京髓。常見的應用場景是網(wǎng)絡管理工具航缀、安全管理系統(tǒng)、日志審計系統(tǒng)堰怨。
完整的syslog日志中包含產(chǎn)生日志的程序模塊(Facility)芥玉、嚴重性(Severity或 Level)、時間备图、主機名或IP灿巧、進程名、進程ID和正文揽涮。在Unix類操作系統(tǒng)上抠藕,能夠按Facility和Severity的組合來決定什么樣的日志消息是否需要記錄,記錄到什么地方蒋困,是否需要發(fā)送到一個接收syslog的服務器等盾似。
下面是一個syslog消息:
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分雪标,“auditd[1787]: The audit daemon is exiting.”是MSG部分零院。
具體syslog的格式可參考 RFC3164:https://www.ietf.org/rfc/rfc3164.txt
2.journald
與傳統(tǒng)日志系統(tǒng)syslog相對應的,是二進制日志格式的journalctl村刨。
關于jornalctl是什么门粪,可以看看鳥哥寫的這篇簡介:systemd-journald.service 簡介
為什么出現(xiàn)journalctl?
以往烹困,日志往往被分散在整套系統(tǒng)當中玄妈,由不同的守護進程及進程負責處理,這就讓我們很難跨越多種應用程序?qū)ζ鋬?nèi)容進行解讀髓梅。而從Centos7開始拟蜻,
systemd嘗試提供一套集中化管理方案,從而統(tǒng)一打理全部內(nèi)核及用戶級進程的日志信息枯饿。這套系統(tǒng)能夠收集并管理日志內(nèi)容酝锅,而這也就是我們所熟知的journal。
Journal的實現(xiàn)歸功于journald守護進程奢方,其負責處理由內(nèi)核搔扁、initrd以及服務等產(chǎn)生的信息爸舒。你可以看下這篇文章,看看如何使用journalctl來查看日志:https://www.linode.com/docs/quick-answers/linux/how-to-use-journalctl/
作為一個二進制格式的日志稿蹲,網(wǎng)上對此有很多爭議和討論扭勉,Douglas DeMaio在文章syslog-ng vs. systemd’s journald中認為syslog比journalctl的更好,他認為syslog在多機器下性能表現(xiàn)更好苛聘,并且可以支持更多的輸入/輸出源涂炎;但也有人認為journatl 更好,因為它可以讓開發(fā)者更容易檢索到他們要查看的應用日志设哗,而且這些日志是結構化的唱捣。 比如這篇Why journal?就描述了另一種觀點网梢。
分布式系統(tǒng)日志:zipkin調(diào)用鏈服務日志
分布式系統(tǒng)日志統(tǒng)一的手段有很多震缭,比如常見的ELK,但這些日志都是文本战虏,不太容易做分析蛀序。我們遇到問題時,更多的想查看從上至下的的關鍵點的入?yún)⒒罾印⒊鰠⑿炻恪惓#P鍵節(jié)點的響應時間等等啸盏,將分散的請求串聯(lián)在一起重贺,查看整個調(diào)用鏈數(shù)據(jù)。在這里常用的工具便是zipkin了回懦。
Zipkin是一款開源的分布式實時數(shù)據(jù)追蹤系統(tǒng)(Distributed Tracking System)气笙,基于 Google Dapper的論文設計而來,由 Twitter 公司開發(fā)貢獻怯晕。其主要功能是聚集來自各個異構系統(tǒng)的實時監(jiān)控數(shù)據(jù)潜圃。了解zipkin之前,你可以先了解下Google Dapper舟茶,這是它的論文:https://ai.google/research/pubs/pub36356
對于zipkin谭期,你需要了解以下概念:
-
Brave:
提供了面向 Standard Servlet、Spring MVC吧凉、HTTP Client隧出、JAX RS、Jersey阀捅、Resteasy 和 MySQL等接口的裝備能力胀瞪,可以通過編寫簡單的配置和代碼,讓基于這些框架構建的應用可以向 Zipkin 報告數(shù)據(jù)饲鄙。同時 Brave 也提供了非常簡單且標準化的接口凄诞,在以上封裝無法滿足要求的時候可以方便擴展與定制圆雁。
- traceId: 一次請求全局只有一個traceId。用來在海量的請求中找到同一鏈路的幾次請求帆谍。 - spanId: 每個請求都有一個獨立的spanId,例如一次RPC伪朽,一次SQL均會產(chǎn)生
- cs: 客戶端發(fā)起請求的時間
- cr: 客戶端收到處理完請求的時間
- ss: 服務端處理完邏輯的時間
- sr: 服務端接受請求的時間
日志的歸檔
日志在運行過程中,增長會越來越快既忆,服務器會很快消耗磁盤空間驱负。Linux下有個logrotate工具嗦玖,可以幫助我們進行日志的滾動歸檔等日志操作患雇。logrotate是個十分有用的工具,它可以自動對日志進行截斷(或輪循)宇挫、壓縮以及刪除舊的日志文件苛吱。我們只需要在/etc/logrotate.conf這個目錄下配置logrotate的配置文件即可。
logrotate的使用
一般會定時運行 logrotate器瘪,通常是每天一次翠储;當然也可以定時任務contrab配合使用,直接運行 /etc/cron.daily/logrotate 腳本橡疼。詳細的使用辦法可以去官網(wǎng)上查看
日志的最佳實踐
對于如何更好地打log這件事援所,網(wǎng)上有不少最佳實踐,這里你可以看看這幾篇文章:
- Logging best pratices
- Java Best Practices for Smarter Application Logging & Exception Handling
- 阿里巴巴開發(fā)手冊
Reference: