57 lines
1.5 KiB
Bash
Executable File
57 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env zsh
|
|
# ===============================================================
|
|
# log_parser.zsh — Pretty-print call_file JSON logs (aligned + exit codes)
|
|
# ===============================================================
|
|
|
|
LOGFILE="${1:-$HOME/zshrc-log.json}"
|
|
|
|
if [[ ! -r "$LOGFILE" ]]; then
|
|
echo "❌ Log file not found: $LOGFILE"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Parsed call_file log:"
|
|
|
|
# Arrays to hold parsed data
|
|
labels=()
|
|
durations=()
|
|
exit_codes=()
|
|
files=()
|
|
|
|
# Parse the JSON lines
|
|
while IFS= read -r line; do
|
|
label=$(echo "$line" | jq -r '.label // empty' 2>/dev/null)
|
|
duration=$(echo "$line" | jq -r '.duration_ms // empty' 2>/dev/null)
|
|
exit_code=$(echo "$line" | jq -r '.exit_code // empty' 2>/dev/null)
|
|
file=$(echo "$line" | jq -r '.file // empty' 2>/dev/null)
|
|
|
|
[[ -z "$label" || -z "$file" ]] && continue
|
|
|
|
labels+=("$label")
|
|
durations+=("${duration:-0}")
|
|
exit_codes+=("${exit_code:-0}")
|
|
files+=("$file")
|
|
done < <(grep -E '"label"' "$LOGFILE")
|
|
|
|
# Determine max column widths for alignment
|
|
max_label=0
|
|
max_duration=0
|
|
max_exit=0
|
|
for label in "${labels[@]}"; do
|
|
(( ${#label} > max_label )) && max_label=${#label}
|
|
done
|
|
for dur in "${durations[@]}"; do
|
|
(( ${#dur} > max_duration )) && max_duration=${#dur}
|
|
done
|
|
for code in "${exit_codes[@]}"; do
|
|
(( ${#code} > max_exit )) && max_exit=${#code}
|
|
done
|
|
|
|
# Build sorted, aligned output
|
|
{
|
|
for i in {1..${#labels[@]}}; do
|
|
printf "%-${max_label}s %${max_duration}sms %${max_exit}s %s\n" \
|
|
"${labels[i-1]}" "${durations[i-1]}" "${exit_codes[i-1]}" "${files[i-1]}"
|
|
done
|
|
} | sort -k2,2n
|