本文目录导读:

我来教你编写一个日志高亮展示脚本,包含多个实用版本:
基础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}
]
}
"""
安装和使用建议
-
保存脚本:将脚本保存为
log_highlighter.py或log_highlighter.sh -
添加执行权限:
chmod +x log_highlighter.py
-
创建别名(在 ~/.bashrc 中添加):
alias logh='python /path/to/log_highlighter.py' alias loght='tail -f /var/log/syslog | python /path/to/log_highlighter.py'
-
日常使用:
logh app.log tail -f app.log | logh logh app.log -s "ERROR" -e # 只显示错误日志
这些脚本提供了从简单到复杂的多种选择,你可以根据实际需求选择或定制使用。