問題:
公司的一個程序運行一天的日志(單文件)是G級,壓縮后是K級,存在大量的冗余信息。本文介紹一種針對該日志庫的優化方法——根據變化頻率分類記錄。
場景:
公司的日志庫為單應用程序使用的動態庫,將日志信息以字符串形式輸出至文件。一條日志為一行,形式如下:
時間 | 級別 | 模塊 | 函數名 | 文件名 | 行號 | 詳細信息 |
2014-09-12 12:12:45.345 | INFO | Module | Func1 | d:\xxx\xxx.cpp | 1230 | 函數返回,返回值2 |
2014-09-12 12:12:45.560 | INFO | Module | Func2 | d:\xxx\xxx.cpp | 134 | 采用默認參數 |
2014-09-12 12:12:46.145 | INFO | Module | Func1 | d:\xxx\xxx.cpp | 1230 | 函數返回,返回值3 |
2014-09-12 12:12:47.121 | INFO | Module | Func2 | d:\xxx\xxx.cpp | 134 | 采用默認參數 |
…… | … | … | … | …… | … | …… |
分析:
根據日志各屬性的變化頻率不同可分成三類:“時間”、“級別、模塊、函數名、文件名和行號”和“詳細信息”。該分類與日志在代碼的位置有關。第一類屬性不受位置影響,第二類則是位置相同則內容相同,第三類是位置相同內容可能相同。根據日志在代碼的位置對其分類,類型信息單獨記錄,日志項只記錄類型編號。
日志類型表:
編號 | 級別 | 模塊 | 函數名 | 文件名 | 行號 |
1 | INFO | Module | Func1 | d:\xxx\xxx.cpp | 1230 |
2 | INFO | Module | Func2 | d:\xxx\xxx.cpp | 134 |
日志項表:
時間 | 編號 | 詳細信息 |
2014-09-12 12:12:45.345 | 1 | 函數返回,返回值2 |
2014-09-12 12:12:45.560 | 2 | 采用默認參數 |
2014-09-12 12:12:46.145 | 1 | 函數返回,返回值3 |
2014-09-12 12:12:47.121 | 2 | 采用默認參數 |
此外“時間”項是定長,連續的兩項之間只有尾部不同,因此只需要記錄尾部變動的信息。“詳細信息”項在類型相同的日志中變化小,因此只需記錄變動的內容。
經過處理的日志項表:
時間 | 編號 | 詳細信息 |
2014-09-12 12:12:45.345 | 1 | 函數返回,返回值2 |
560 | 2 | 采用默認參數 |
6.145 | 1 | 函數返回,返回值3 |
7.121 | 2 | |
缺點
該方法增加了運行時的內存占有率,并且日志需要借助工具還原。