寻找可格式化日志中Java序列化对象的命令行工具
Java单行对象日志格式化命令行工具推荐
需求描述
需要查看大量来自不同来源的Java日志,其中的Java对象以单行形式输出,希望通过命令行工具将其格式化为更易读的结构,类似JSON格式化工具的效果,且无法控制日志的生成过程。
示例输入
[sampleObject{objId=c1, request=sampleRequest(bean=bean1, method=method1), env=job(pattern=*), step=1, state=SUCCESS}, sampleObject{objId=c2, request=sampleRequest(bean=bean1, method=method1), env=job(pattern=*), step=1, state=SUCCESS}, sampleObject{objId=c2, request=sampleRequest(bean=bean1, method=method2), env=job(pattern=*), step=2, state=SUCCESS}, sampleObject{objId=c3, request=sampleRequest(bean=bean1, method=method1), env=job(pattern=*), step=1, state=SUCCESS}, sampleObject{objId=c3, request=sampleRequest(bean=bean1, method=method2), env=job(pattern=*), step=2, state=SUCCESS}]
期望输出示例
[ sampleObject{ objId=c1, request=sampleRequest( bean=bean1, method=method1 ), env=job( pattern=* ), step=1, state=SUCCESS }, sampleObject{ objId=c2, request=sampleRequest( bean=bean1, method=method2 ), env=job( pattern=test ), step=2, state=SUCCESS }, ]
可行的命令行工具方案
1. jq + sed 组合处理
利用sed将Java对象格式转换为近似JSON的结构,再用jq进行格式化。虽然不是完美适配,但能快速实现基本的排版需求。
示例命令:
cat your_log_file.txt | sed -e 's/\([a-zA-Z0-9_]*\)=/\1": "/g' \ -e 's/{/{ "/g' \ -e 's/, /", "/g' \ -e 's/)/"}/g' \ -e 's/\([a-zA-Z0-9_]*\)"/"\1"/g' | jq .
注:如果日志中有特殊字符(如空格、引号),可能需要调整sed的正则规则来适配。
2. 自定义Python脚本
编写简单的Python脚本处理缩进和换行,更灵活适配Java对象的格式:
创建format_java_obj.py脚本:
import sys import re def format_java_object(input_text): indent_level = 0 indent_size = 2 output = [] # 拆分括号、逗号为单独行 processed = re.sub(r'([{}()])', r'\n\1', input_text) processed = re.sub(r',', r',\n', processed) for line in processed.split('\n'): line = line.strip() if not line: continue # 处理闭合括号,先减少缩进 if line in ['}', ')']: indent_level -= 1 output.append(' ' * (indent_level * indent_size) + line) # 处理打开括号,后增加缩进 if line in ['{', '(']: indent_level += 1 return '\n'.join(output) if __name__ == '__main__': print(format_java_object(sys.stdin.read()))
使用方式:
cat your_log_file.txt | python format_java_obj.py
可以根据需求修改indent_size调整缩进宽度,或扩展正则规则处理特殊场景。
3. Groovy脚本
Groovy语法与Java接近,处理Java对象格式更顺手:
创建format_java.groovy脚本:
def input = System.in.text def indent = 0 def result = new StringBuilder() def indentStr = ' ' input.eachMatch(/([^{}(),]+)|([{}()])|(,)/) { match -> def segment = match[0].trim() switch(segment) { case '{': case '(': result.append('\n').append(indentStr * indent).append(segment) indent++ result.append('\n').append(indentStr * indent) break case '}': case ')': indent-- result.append('\n').append(indentStr * indent).append(segment) break case ',': result.append(segment).append('\n').append(indentStr * indent) break default: result.append(segment) break } } println(result.toString())
使用方式:
cat your_log_file.txt | groovy format_java.groovy
内容的提问来源于stack exchange,提问作者Brad Parks
相关产品推荐
相关产品推荐

