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

寻找可格式化日志中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:05:58