You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逆向工程日志分析工具需求:指定内容自定义着色

日志文本高亮实现方案

一、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. 临时会话高亮

打开日志文件后,执行以下步骤:

  1. 加载规则文件内容到缓冲区::r file_1.txt
  2. 选中规则内容并复制到寄存器:"ayG(选中后按y复制,再执行G到末尾)
  3. 删除缓冲区中临时插入的规则行:ggddG
  4. 执行高亮命令(以红色为例):
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:11:07