如何编写日志高亮展示脚本

wen 实用脚本 27

本文目录导读:

如何编写日志高亮展示脚本

  1. 基础Python版本
  2. 增强版 - 支持搜索和过滤
  3. Shell脚本版本
  4. 使用示例
  5. 高级功能版本
  6. 安装和使用建议

我来教你编写一个日志高亮展示脚本,包含多个实用版本:

基础Python版本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""日志高亮展示脚本 - 基础版"""
import re
import sys
from datetime import datetime
# 颜色定义
class Colors:
    RESET = '\033[0m'
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    BLUE = '\033[94m'
    MAGENTA = '\033[95m'
    CYAN = '\033[96m'
    WHITE = '\033[97m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'
def highlight_log_line(line):
    """高亮单行日志"""
    # 定义日志级别及其颜色
    level_colors = {
        'ERROR': Colors.RED,
        'WARN': Colors.YELLOW,
        'WARNING': Colors.YELLOW,
        'INFO': Colors.GREEN,
        'DEBUG': Colors.CYAN,
        'TRACE': Colors.BLUE,
        'FATAL': Colors.MAGENTA + Colors.BOLD,
    }
    # 检查日志级别
    for level, color in level_colors.items():
        if level in line.upper():
            line = line.replace(level, f"{color}{level}{Colors.RESET}")
            break
    # 高亮IP地址
    ip_pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
    line = re.sub(ip_pattern, lambda m: f"{Colors.CYAN}{m.group()}{Colors.RESET}", line)
    # 高亮时间戳
    if re.match(r'\d{4}-\d{2}-\d{2}', line):
        line = f"{Colors.BLUE}{line}{Colors.RESET}"
    # 高亮URL
    url_pattern = r'https?://[^\s]+'
    line = re.sub(url_pattern, lambda m: f"{Colors.UNDERLINE}{Colors.GREEN}{m.group()}{Colors.RESET}", line)
    return line
def main():
    """主函数"""
    # 从文件读取或标准输入
    if len(sys.argv) > 1:
        try:
            with open(sys.argv[1], 'r') as f:
                for line in f:
                    print(highlight_log_line(line.rstrip()))
        except FileNotFoundError:
            print(f"错误: 文件 '{sys.argv[1]}' 不存在")
            sys.exit(1)
    else:
        # 从标准输入读取
        try:
            for line in sys.stdin:
                print(highlight_log_line(line.rstrip()))
        except KeyboardInterrupt:
            sys.exit(0)
if __name__ == "__main__":
    main()

增强版 - 支持搜索和过滤

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""日志高亮展示脚本 - 增强版"""
import argparse
import re
import sys
from datetime import datetime
class LogHighlighter:
    """日志高亮器"""
    COLORS = {
        'RED': '\033[91m',
        'GREEN': '\033[92m',
        'YELLOW': '\033[93m',
        'BLUE': '\033[94m',
        'MAGENTA': '\033[95m',
        'CYAN': '\033[96m',
        'WHITE': '\033[97m',
        'BOLD': '\033[1m',
        'UNDERLINE': '\033[4m',
        'RESET': '\033[0m'
    }
    def __init__(self, search_term=None, show_errors=False, tail=False):
        self.search_term = search_term
        self.show_errors = show_errors
        self.tail = tail
    def highlight(self, line):
        """高亮日志行"""
        if not line.strip():
            return line
        # 搜索过滤
        if self.search_term and self.search_term not in line:
            return None
        # 错误过滤
        if not self.show_errors:
            if 'ERROR' in line.upper() and self.search_term is None:
                return None
        # 应用高亮
        highlighted = self._apply_highlights(line)
        return highlighted
    def _apply_highlights(self, line):
        """应用各种高亮规则"""
        # 级别高亮
        level_highlights = {
            'ERROR': 'RED',
            'WARNING': 'YELLOW',
            'INFO': 'GREEN', 
            'DEBUG': 'CYAN',
            'FATAL': 'MAGENTA',
            'CRITICAL': 'RED'
        }
        for level, color in level_highlights.items():
            if level in line.upper():
                line = line.replace(
                    level, 
                    f"{self.COLORS[color]}{self.COLORS['BOLD']}{level}{self.COLORS['RESET']}"
                )
        # IP地址高亮
        ip_pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
        line = re.sub(
            ip_pattern,
            lambda m: f"{self.COLORS['CYAN']}{m.group()}{self.COLORS['RESET']}",
            line
        )
        # URL高亮
        url_pattern = r'https?://[^\s]+'
        line = re.sub(
            url_pattern,
            lambda m: f"{self.COLORS['UNDERLINE']}{self.COLORS['GREEN']}{m.group()}{self.COLORS['RESET']}",
            line
        )
        return line
def main():
    parser = argparse.ArgumentParser(description='日志高亮展示工具')
    parser.add_argument('file', nargs='?', help='日志文件路径')
    parser.add_argument('-s', '--search', help='搜索关键词')
    parser.add_argument('-e', '--errors', action='store_true', help='只显示错误日志')
    parser.add_argument('-t', '--tail', action='store_true', help='持续监控模式')
    args = parser.parse_args()
    highlighter = LogHighlighter(
        search_term=args.search,
        show_errors=args.errors,
        tail=args.tail
    )
    # 处理输入
    try:
        if args.file:
            with open(args.file, 'r') as f:
                content = f.readlines()
        else:
            content = sys.stdin.readlines()
        for line in content:
            result = highlighter.highlight(line.rstrip())
            if result is not None:
                print(result)
    except KeyboardInterrupt:
        sys.exit(0)
    except FileNotFoundError:
        print(f"错误: 文件 '{args.file}' 不存在")
        sys.exit(1)
if __name__ == "__main__":
    main()

Shell脚本版本

#!/bin/bash
# 日志高亮展示脚本 - Shell版
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
highlight_log() {
    while IFS= read -r line; do
        # 高亮日志级别
        if echo "$line" | grep -qi "ERROR\|FATAL"; then
            line=$(echo "$line" | sed "s/ERROR\|FATAL/${BOLD}${RED}&${NC}/gI")
        elif echo "$line" | grep -qi "WARN\|WARNING"; then
            line=$(echo "$line" | sed "s/WARN\|WARNING/${YELLOW}&${NC}/gI")
        elif echo "$line" | grep -qi "INFO"; then
            line=$(echo "$line" | sed "s/INFO/${GREEN}&${NC}/gI")
        elif echo "$line" | grep -qi "DEBUG"; then
            line=$(echo "$line" | sed "s/DEBUG/${CYAN}&${NC}/gI")
        fi
        # 高亮IP地址
        line=$(echo "$line" | sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/'${CYAN}'&'${NC}'/g')
        # 高亮时间戳
        line=$(echo "$line" | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2}/'${BLUE}'&'${NC}'/g')
        echo -e "$line"
    done
}
# 使用示例
if [ -n "$1" ]; then
    if [ -f "$1" ]; then
        cat "$1" | highlight_log
    else
        echo "文件不存在: $1"
        exit 1
    fi
else
    # 从标准输入读取
    highlight_log
fi

使用示例

# 1. 使用Python脚本
python log_highlighter.py app.log
python log_highlighter.py app.log -s "error" -e  # 只搜索错误
cat app.log | python log_highlighter.py -t       # 持续监控
# 2. 使用Shell脚本
chmod +x log_highlighter.sh
./log_highlighter.sh app.log
tail -f app.log | ./log_highlighter.sh
# 3. 直接管道使用
tail -f /var/log/syslog | python log_highlighter.py

高级功能版本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""高级日志高亮工具 - 支持配置文件"""
import json
import re
import sys
from pathlib import Path
class AdvancedLogHighlighter:
    def __init__(self, config_file=None):
        self.config = self.load_config(config_file)
        self.colors = self.config.get('colors', {})
    def load_config(self, config_file):
        """加载配置文件"""
        default_config = {
            "colors": {
                "ERROR": {"color": "red", "bold": True},
                "WARNING": {"color": "yellow", "bold": False},
                "INFO": {"color": "green", "bold": False},
                "DEBUG": {"color": "gray", "bold": False}
            },
            "patterns": [
                {"pattern": r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', "color": "cyan"},
                {"pattern": r'https?://[^\s]+', "color": "blue", "underline": True},
                {"pattern": r'\[.*?\]', "color": "magenta"}
            ]
        }
        if config_file and Path(config_file).exists():
            with open(config_file, 'r') as f:
                user_config = json.load(f)
                # 合并配置
                default_config.update(user_config)
        return default_config
# 使用示例的配置文件 log_highlighter_config.json
"""
{
    "colors": {
        "CUSTOM": {"color": "purple", "bold": true}
    },
    "patterns": [
        {"pattern": "transaction_id=[0-9]+", "color": "yellow"},
        {"pattern": "user_[a-z]+", "color": "green", "bold": true}
    ]
}
"""

安装和使用建议

  1. 保存脚本:将脚本保存为 log_highlighter.pylog_highlighter.sh

  2. 添加执行权限

    chmod +x log_highlighter.py
  3. 创建别名(在 ~/.bashrc 中添加):

    alias logh='python /path/to/log_highlighter.py'
    alias loght='tail -f /var/log/syslog | python /path/to/log_highlighter.py'
  4. 日常使用

    logh app.log
    tail -f app.log | logh
    logh app.log -s "ERROR" -e  # 只显示错误日志

这些脚本提供了从简单到复杂的多种选择,你可以根据实际需求选择或定制使用。

抱歉,评论功能暂时关闭!