问题:
公司的一个程序运行一天的日志(单文件)是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 | |
缺点
该方法增加了运行时的内存占有率,并且日志需要借助工具还原。