infoalloggi-monorepo/apps/db/log_parser.sh
2025-08-04 17:45:44 +02:00

61 lines
No EOL
2.5 KiB
Bash

#!/bin/bash
# Define the directory where PostgreSQL logs are stored
LOG_DIR="/c/Program Files/PostgreSQL/16/data/log"
# Define the output file for extracted SQL commands
OUTPUT_FILE="migration.sql"
# Define the AWK script file path
AWK_SCRIPT_FILE="filter_sql.awk" # Make sure this file is in the same directory as your bash script
# Clear the output file if it exists, or create a new one
> "$OUTPUT_FILE"
echo "Starting SQL command extraction from logs in: $LOG_DIR"
echo "Extracted commands will be saved to: $OUTPUT_FILE"
echo "----------------------------------------------------"
# --- NEW PART: GET LAST GIT COMMIT DATE ---
GIT_LAST_COMMIT_DATE_MS="" # This will store the Git commit date in YYYY-MM-DD HH:MM:SS.000 format
# Check if we are inside a Git repository
if git rev-parse --is-inside-work-tree &>/dev/null; then
# Get the last commit date in ISO 8601 strict format (e.g., 2025-07-31T16:21:44+02:00)
GIT_LAST_COMMIT_ISO=$(git log -1 --format=%cd --date=iso-strict)
if [ -n "$GIT_LAST_COMMIT_ISO" ]; then
# Convert to YYYY-MM-DD HH:MM:SS.000 for comparison with log timestamps
# cut -d'.' -f1 gets "YYYY-MM-DDTHH:MM:SS"
# tr 'T' ' ' changes 'T' to space
# "\.000" appends milliseconds for consistent string comparison
GIT_LAST_COMMIT_DATE_MS=$(echo "$GIT_LAST_COMMIT_ISO" | cut -d'.' -f1 | tr 'T' ' ')"\.000"
echo "Git last commit date detected (for log cutoff): $GIT_LAST_COMMIT_DATE_MS"
else
echo "Warning: Could not get last Git commit date. Processing all log entries."
fi
else
echo "Not inside a Git repository. Processing all log entries."
fi
# Regex to detect the start of a new log entry (used by awk)
NEW_LOG_ENTRY_REGEX="^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}"
# --- Check if the AWK script file exists ---
if [ ! -f "$AWK_SCRIPT_FILE" ]; then
echo "ERROR: AWK script file '$AWK_SCRIPT_FILE' not found!"
echo "Please create '$AWK_SCRIPT_FILE' with the AWK code from Step 1."
exit 1
fi
# Find all .log files in the specified directory and process them
find "$LOG_DIR" -type f -name "*.log" | while read -r logfile; do
echo "Processing log file: $logfile"
LC_ALL=C awk -v new_log_regex="$NEW_LOG_ENTRY_REGEX" \
-v git_cutoff_date_str="$GIT_LAST_COMMIT_DATE_MS" \
-f "$AWK_SCRIPT_FILE" "$logfile" >> "$OUTPUT_FILE"
done
echo "SQL extraction complete"
echo "----------------------------------------------------"
echo "Final SQL output is in: '$OUTPUT_FILE'."