逆向工程日志分析工具需求:指定内容自定义着色
日志文本高亮实现方案
一、Python脚本实现(轻量易定制)
避开复杂的RTF格式,改用终端ANSI颜色输出或HTML生成两种简单方案,同时支持多规则文件和冲突检测。
1. 终端实时高亮输出
直接在命令行显示带颜色的日志,适合快速查看:
import sys from collections import defaultdict # 自定义ANSI颜色码,可按需修改 COLORS = { 'red': '\033[91m', 'blue': '\033[94m', 'green': '\033[92m', 'reset': '\033[0m' } def load_patterns(pattern_files): pattern_map = defaultdict(list) color_keys = list(COLORS.keys())[:-1] # 排除重置色 for idx, file_path in enumerate(pattern_files): color = color_keys[idx % len(color_keys)] with open(file_path, 'r') as f: for line in f: line = line.strip() if line: pattern_map[line].append(color) return pattern_map def highlight_log(log_path, pattern_map): with open(log_path, 'r') as f: for line in f: line = line.rstrip('\n') matched_colors = set() for pattern, colors in pattern_map.items(): if pattern in line: matched_colors.update(colors) if len(matched_colors) > 1: print(f'[冲突提示] 该行匹配多个规则: {line}') color = next(iter(matched_colors)) print(f'{COLORS[color]}{line}{COLORS["reset"]}') elif matched_colors: color = next(iter(matched_colors)) print(f'{COLORS[color]}{line}{COLORS["reset"]}') else: print(line) if __name__ == '__main__': if len(sys.argv) < 3: print(f'用法: {sys.argv[0]} <日志文件> <规则文件1> [规则文件2...]') sys.exit(1) log_file = sys.argv[1] pattern_files = sys.argv[2:] pattern_map = load_patterns(pattern_files) highlight_log(log_file, pattern_map)
用法:在终端执行 python highlight.py log.txt file_1.txt file_2.txt,匹配行将按规则文件顺序显示对应颜色,冲突行会给出提示。
2. 生成HTML高亮文件(适合保存分享)
生成带样式的HTML文件,用浏览器打开即可查看清晰的高亮效果:
import sys from collections import defaultdict def load_patterns(pattern_files): pattern_map = defaultdict(list) color_classes = ['color-red', 'color-blue', 'color-green'] for idx, file_path in enumerate(pattern_files): cls = color_classes[idx % len(color_classes)] with open(file_path, 'r') as f: for line in f: line = line.strip() if line: pattern_map[line].append(cls) return pattern_map def generate_html(log_path, pattern_map, output_path='highlighted_log.html'): css = """ <style> .color-red { color: #e74c3c; } .color-blue { color: #3498db; } .color-green { color: #2ecc71; } .conflict { background-color: #f1c40f; } pre { white-space: pre-wrap; font-family: monospace; font-size: 14px; } </style> """ with open(log_path, 'r') as f: lines = f.readlines() content = [] for line in lines: line = line.rstrip('\n') matched_classes = set() for pattern, classes in pattern_map.items(): if pattern in line: matched_classes.update(classes) if len(matched_classes) > 1: content.append(f'<span class="conflict {' '.join(matched_classes)}">{line}</span>') elif matched_classes: content.append(f'<span class="{' '.join(matched_classes)}">{line}</span>') else: content.append(line) html_content = f""" <html> <head>{css}</head> <body> <pre>{'<br>'.join(content)}</pre> </body> </html> """ with open(output_path, 'w') as f: f.write(html_content) print(f'已生成高亮日志文件: {output_path}') if __name__ == '__main__': if len(sys.argv) < 3: print(f'用法: {sys.argv[0]} <日志文件> <规则文件1> [规则文件2...]') sys.exit(1) log_file = sys.argv[1] pattern_files = sys.argv[2:] pattern_map = load_patterns(pattern_files) generate_html(log_file, pattern_map)
用法:执行脚本后会在当前目录生成highlighted_log.html,冲突行将显示黄色背景。
二、Vim配置实现(无需额外脚本)
利用Vim内置的语法高亮功能,实现日志行的自定义高亮:
1. 临时会话高亮
打开日志文件后,执行以下步骤:
- 加载规则文件内容到缓冲区:
:r file_1.txt - 选中规则内容并复制到寄存器:
"ayG(选中后按y复制,再执行G到末尾) - 删除缓冲区中临时插入的规则行:
ggddG - 执行高亮命令(以红色为例):
for line in split(@a, '\n') if line != '' call matchadd('ErrorMsg', '\V' . escape(line, '\')) endif endfor
如需不同颜色,先自定义高亮组:hi MyBlue ctermfg=blue guifg=blue,再将上述命令中的ErrorMsg替换为MyBlue。
2. 永久配置(写入.vimrc)
在~/.vimrc中添加以下内容:
function! HighlightFromFile(file, group) let f = readfile(a:file) for line in f if line != '' call matchadd(a:group, '\V' . escape(line, '\')) endif endfor endfunction # 自定义高亮组 hi Rule1 ctermfg=red guifg=red hi Rule2 ctermfg=blue guifg=blue
打开日志文件后,执行:call HighlightFromFile('file_1.txt', 'Rule1')即可加载对应规则的高亮。
三、Shell命令快速实现
用grep组合命令快速临时高亮,适合简单场景:
# 为不同规则文件指定颜色 GREP_COLORS='mt=01;31' grep --color=always -f file_1.txt log.txt | GREP_COLORS='mt=01;34' grep --color=always -f file_2.txt -A 0 -B 0
01;31代表红色,01;34代表蓝色,可根据需要修改颜色码。
内容的提问来源于stack exchange,提问作者anoop1942
相关产品推荐
相关产品推荐

