系統日誌管理那點事

来源:http://www.cnblogs.com/joylee/archive/2017/09/08/7493292.html
-Advertisement-
Play Games

說起日誌,大家都是耳熟能詳的,一大堆日誌插件映入眼帘,日誌收集的方式也歷歷在目,但是,今天我們的重點不僅僅是收集日誌了,今天我們主要說說怎麼管理日誌 收集日誌 日誌管理的第一件事,就是日誌的收集。日誌收集是開發者必備的技巧,不管是哪個開發語言,哪個開發平臺,日誌收集的插件都是有很多選擇的。例如: . ...


說起日誌,大家都是耳熟能詳的,一大堆日誌插件映入眼帘,日誌收集的方式也歷歷在目,但是,今天我們的重點不僅僅是收集日誌了,今天我們主要說說怎麼管理日誌

收集日誌

日誌管理的第一件事,就是日誌的收集。日誌收集是開發者必備的技巧,不管是哪個開發語言,哪個開發平臺,日誌收集的插件都是有很多選擇的。例如:

.net 平臺大家鐘愛的log4net,支持多種存儲方式(文件、資料庫),多種格式,多種日誌拆分方式。

java 平臺主流的log4j、slf4j、logback,多種選擇。

日誌收集的組件這裡就不一一說明瞭,使用都是很簡單的,這裡重點說明一下,日誌我們收集應該註意的地方:

1. 日誌等級一定要規範
等級 說明
debug 調試信息
info 用來收集關註的信息
warn 警告信息
error 錯誤信息

好多開發工程師記錄日誌總是喜歡用info級別來記錄日誌,一般的組件預設級別都是info,所有info預設都是會被記錄的,而debug信息發佈後,是不會被記錄的。這是一種偷懶的做法,但這也是很普遍的做法。正確的方式應該根據日誌本身的特性去設置日誌的級別,其實規範的日誌級別是非常重要的:

  • 正確的級別便於運維。便於統一調整系統日誌級別,如特殊情況可以只記錄error錯誤
  • 沒有正確的級別,對後期日誌分析和處理是留下很大的隱患。error是需要去關註,並且處理掉的問題。info是普通日誌的記錄,大部分時候是無需關註的。

    2. error日誌內容一定要詳實 ,info日誌要簡潔易懂
    運營過大型系統的人都知道,除了資料庫存儲外,日誌、圖片、附件是存儲的三大債主,他們是會占用非常非常大的空間,所有記錄info的日誌,要簡潔易懂,避免空間浪費。
    而對於error級別的錯誤,記錄一定要詳實,因為error的所有問題,是後期都要去解決的。
  • 請求的地址
  • 請求的參數
  • 請求的ip
  • 請求的用戶
  • error具體信息
  • 輸出的內容
  • ......

為了能很好的反饋當時error產生場景,以上的這些內容都應該被記錄,而且越詳細越好。

3. error日誌一定是全局統一收集的

前文說過,error的日誌,不僅是我們需要關註的,還是我需要解決掉的問題,所有error日誌非常重要。錯誤日誌的收集,必須是全局統一收集的,AOP是你最好的伙伴,如果你發現你的errorr日誌收集是在每個類中,到處是

try
{
......
}
catch()
{
    log.error("......")
}

這個一定要避免,不管你用那種語言,錯誤的處理,都是可以通過全局進行統一的處理,錯誤日誌也要通過全局統一收集。

管理日誌

每個開發人員對日誌的收集,都是非常熟悉的,基本都是將日誌按照日期的方式進行保存,日常使用日誌的時候,也是有一些要求:

1. 單個文件的大小要控制

因為大家都是通過日期方式保存的,但是因為有的人不重視日誌,經常會看到有的系統單個日誌文件上百M,有的甚至是幾G,而實際大家處理問題關註的都是最近的日誌,所以控制單個日誌文件的大小,對日誌的性能以及後期的運維都是非常便利的。

2. 日誌要便於瀏覽

日誌文件小才便於瀏覽,日誌最好能通過網址直接訪問到,而不需要一波三折登錄伺服器,花10分鐘下載下來,再來分析。

3. 日誌的安全性要得到保障

日誌內容有時會包含敏感信息,特別是error日誌,直接把系統的具體錯誤拋出來,所以日誌除了查看方便,還需要確保日誌文件的安全。如果是日誌文件是html或者txt,請一定記得把你的日誌文件許可權修改下,特定用戶才能訪問,不要隨便開放,所有人都能訪問。

4. 日誌要定期清理

日誌是非常占用存儲的空間,日誌太大對存儲的性能也有一定的影響,所有日誌要定期進行清理。

  • 空間充足可以保留半年
  • 空間不足最少也要保留3個月

當然,這個也不是一定的,根據每個系統的情況去制定清理計劃就可以了。

如果大家是小型網站,一個系統一臺伺服器,日誌管理就簡單了。如果系統是做了高可用,後端用了均衡負載,那麼,日誌存在當前伺服器是不太明智的做法,日誌一定要統一存儲,因為均衡負載隨時都可能會切換伺服器,當出現故障,你需要去找日誌究竟存在哪個伺服器,也是件很浪費時間的事情。日誌文件也可以通過:

  • 共用虛擬目錄來存儲
  • 定時進行文件同步來存儲
    日誌存儲也是對性能有一定影響的,文件同步雖然看起來麻煩一定,但是比共用虛擬目錄的方式來說,性能會好,推薦使用這種方式。

說到日誌的同步,就不得不提Logstash這個日誌組件。Logstash是現在應用最廣的日誌收集組件,基於java平臺。其實很多java平臺的組件,是不用去瞭解java開發的,只要簡單的配置就能使用。

Logstash支持文件同步,也可以結合rsyslog進行文件同步,當然,也支持通過tcp協議,與第三方對接,好伙伴當然是Elasticsearch。Elasticsearch下文也會做簡單的介紹。

Logstash中文手冊:點擊這裡

分析日誌

日誌的分析也是一個很大的概念,可能對於運維和安全人員關註的是系統的所有日誌,包括訪問日誌、系統監測的日誌等,但是開發人員對於日誌更多的是:

  • 監控系統運行錯誤,並獲取錯誤時的相關數據包
  • 記錄重要的信息,某些時候便於後期檢查

所以,開發人員對日誌的需求相對而言簡單一點,但是處理不當也會面臨挑戰。如果要根據某些關鍵字找日誌,沒有一個靠譜的系統處理,那麼大家只能一直在ctrl+f 或者 find 命令中來回查找自己需要的信息,使用過的人都知道,這絕對不是一個很好的體驗。那麼是否有很好的工具來處理呢?有,這裡就介紹另外的兩個工具:

  • Elasticsearch——一個基於lucene的搜索引擎工具,解決日誌的搜索問題。當然,也能解決系統的搜索問題,而且是分散式的哦。
  • Kibana——一個可視化的日誌操作引擎,結合Elasticsearch可以達到更好的效果。

Kibana 界面預覽
Kibana 界面預覽

Elasticsearch+Logstash+Kibana 就是傳說中的ELK了,應該是現在最流行的日誌處理平臺。

Elasticsearch中文文檔:點擊這裡
ELK中文文檔:點擊這裡

尾聲

前文介紹日誌收集、日誌管理註意的事項,推薦了日誌分析中兩個比較簡單常用的工具,這裡簡單說明一下,自己心目中的日誌管理系統。
整體流程如圖:

推薦的幾個工具雖然是java平臺的工具,但是日誌處理的思路不管是哪個平臺都是一樣的。ELK如果只是作為日誌管理的工具,也可以應用到.net平臺,無需再進行二次開發就可以很好的使用。ELK的使用是有一定的學習成本的,如有時間可以另起一文探討,但是,這個學習成本是可以忽略語言之間的差異。
當然,如果大家願意使用腳本同步或者rsyn文件同步進行日誌處理也是可以的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • thrift初識 c++服務端和python客戶端 thrift作為一個跨語言的服務部署框架,目前的應用非常廣泛。 這裡通過thrift實現一個簡單的echo服務來加深對其的理解和印象。入門學習thrift強烈推薦官方文檔 "thrift study" 整個echo服務分為兩個很簡單的部分,服務端和 ...
  • .常用Git命令清單 一、新建代碼庫 #在當前目錄創建一個Git代碼庫 $ git init #新建一個目錄,將其初始化為Git代碼庫 $ git init [project name] #下載一個項目和它的整個代碼歷史 $ git clone [url] 二、配置 Git的設置未見為.gitcon ...
  • media 靜態文件配置 static 靜態文件多用於存放用於渲染前端頁面的相關數據,media用於存放客戶上傳或其他的文件 setting.py 中加入路徑 urls.py 中加入路由分配: 這樣上傳在django的文件都可以在前端調用: 全局變數: 將全局變數存入setting.py,如 FUN ...
  • 之前,調用第3方服務,每個方法都差不多“長”這樣, 寫起來啰嗦, 改起來麻煩, 還容易改漏。 我經過學習和提取封裝, 將try ... catch ... catch .. 提取為公用, 得到這2個方法: 現在用起來是如此簡潔。像這種無返回值的: 還有這種有返回值的: 這是我的第一篇Java文章。學 ...
  • Azure 提供了豐富的 Python SDK 來對 Azure 進行開發管理,包括使用 Azure 的開源框架在 Azure 上創建 web 應用程式,對 Azure 的虛擬機,存儲等進行管理,本系列會簡單介紹如何在 ASM 和 ARM 模式下對 Azure 進行管理。 1. 首先我們需要配置基本 ...
  • Azure 作為微軟的公有雲平臺,提供了非常豐富的 SDK 和 API 讓開發人員可以非常方便的調用的各項服務,目前除了自家的 .NET、Java、Python、 nodeJS、Ruby,PHP 等語言都提供支持,詳細的文檔說明請參考: https://azure.microsoft.com/en- ...
  • Visual Stdio 下編譯 C 文件時出現的: warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字元。請將該文件保存為 Unicode 格式以防止數據丟失 解決方案: 打開【文件】->【高級保存選項】,設置合適的編碼,我這裡選擇了“Unicode (UTF-8 帶簽名 ...
  • if條件判斷語句: 1: if後面的是條件(註:這裡跟java不一樣,條件不需要加()) 如果條件成立,會返回一個(True),就會執行下麵的語句。 條件不成立,執行else裡面的語句。(註:代碼縮進) 迴圈語句: 2:while 判斷條件可以是任何表達式,任何非零,非空的值均為True.判斷條件F ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...