上周末我想写一个小工具:把线上 log 转成更易读的格式,然后随手导成 CSV。 这篇文章主要分享一下我在这个过程中和 Trae Solo 的配合方式,看看它到底能帮开发者做到什么程度。
🖥️ 第一步:用 Trae Solo 构建目录骨架
我对 Trae Solo 的第一句话是这样的:
objectivec
帮我创建一个 python CLI,用于解析日志文件,
输出为表格和 CSV,项目结构要清晰一些。
它给出的目录结构非常干净:
c
cli_tool/
main.py
parser.py
formatter.py
exporter.py
sample.log
而且会顺手解释每个文件的职责------不是那种"模板式说明",而是偏开发者风格的那种讲法,比如:
parser 负责把一行 log 拆解成 dict,避免逻辑掺到 main.py 里。
这个第一步的体验就很"对味",完全不像 AI 工具在"形式化输出"。
📄 第二步:让 Trae Solo 完成日志 Parser
我的日志格式大概是:
ini
2025-02-14 12:10:33 INFO task finished duration=1.22
2025-02-14 12:12:01 WARN retry attempt=2
我只给了它两行,它直接写出了一个通用性不错的解析器。
python
# parser.py
import re
LOG_PATTERN = re.compile(
r'(?P<ts>[\d-: ]+) (?P<level>[A-Z]+) (?P<msg>.+)'
)
def parse_line(line: str):
match = LOG_PATTERN.match(line)
if not match:
return None
return match.groupdict()
重点是,它会自己检查边界情况,例如:
- 行为空怎么办?
- level 不在常规范围怎么办?
- message 里如果有 key=value 应不应该拆?
Trae Solo 会主动提示你这些情况,但不会擅自加"复杂逻辑",完全尊重你的项目风格。
📊 第三步:表格输出(我本来没要求,它主动优化了体验)
原本我只要求:
打印成"看得懂"的格式
Trae Solo 给我的输出效果大概是这样:
ini
TIMESTAMP LEVEL MESSAGE
2025-02-14 12:10:33 INFO task finished duration=1.22
2025-02-14 12:12:01 WARN retry attempt=2
生成代码如下:
scss
# formatter.py
def print_table(rows):
if not rows:
return
headers = rows[0].keys()
widths = {h: max(len(h), max(len(r[h]) for r in rows)) for h in headers}
line = " ".join(h.ljust(widths[h]) for h in headers)
print(line)
for r in rows:
print(" ".join(r[h].ljust(widths[h]) for h in headers))
这种输出方式很朴素,但确实够实用,终端查看效果很舒服。
📝 第四步:导出 CSV(一步到位)
我问它:
sql
给我实现一个将 rows 导出到 CSV 的函数。
代码如下:
python
# exporter.py
import csv
def to_csv(rows, path="output.csv"):
if not rows:
return
with open(path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
它还顺手补了一句提示:
如果未来字段会变,可以把 fieldnames 抽成参数,这样更灵活。
像极了一个团队里比较稳、比较专业的同事在提醒你写代码的方式。
🚀 最后:Trae Solo 帮我自动 glue 项目逻辑
当所有模块写完后,我对它说:
arduino
把所有 module glue 到 main.py,并写一个 CLI。
它把整个工具组合成下面这样:
css
# main.py
import argparse
from parser import parse_line
from formatter import print_table
from exporter import to_csv
def main():
parser = argparse.ArgumentParser()
parser.add_argument("file")
parser.add_argument("--csv", action="store_true")
args = parser.parse_args()
rows = []
with open(args.file) as f:
for line in f:
item = parse_line(line.strip())
if item:
rows.append(item)
print_table(rows)
if args.csv:
to_csv(rows)
print("CSV exported.")
if __name__ == "__main__":
main()
整体风格简洁干净,真的是"下班前随手做的小工具"的那种感觉。
🎯 真实总结
这次实战让我发现 Trae Solo 很适合:
- 写脚手架
- 写工具类项目
- 写小型 CLI/SDK
- 重构模块
- 做代码解释/设计讨论
- 编写 UT
- 辅助 debug
它的风格就是:
你说方向,它把事情干得稳稳当当。
不会乱写、不偷懒、不作妖。
整个过程没有卡壳,也没有"上下文乱掉",更没有过度工程化的情况,对短平快的开发特别友好。