Shell Script to Read Oracle Database Alert Log and Report ORA Errors
In this post, I will share shell script to check and read my alert log file based in timestamp and provide me ORA errors from last check timestamp. The script will capture data after last checked timestamp.
Assumption:
You need to know your alertlog file path
Script:
#!/bin/bash#set -x# Oracle environment variables (adjust as necessary)#export ORACLE_SID=your_sid#export ORACLE_HOME=/path/to/oracle_home#export PATH=$ORACLE_HOME/bin:$PATH. ~/.bash_profile# Paths to alert log and timestamp fileALERT_LOG="/u01/db/TRAIN/12.1.0/admin/TRAIN_ebstraining/diag/rdbms/train/TRAIN/trace/alert_TRAIN.log"TIMESTAMP_FILE="/tmp/last_checked_timestamp.txt"REPORT_FILE="health_check_report.html"# Function to validate the database alert log and identify ORA error codescheck_alert_log_for_errors() {echo "<h3>Database Alert Log Errors</h3>" >> $REPORT_FILEecho "<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">" >> $REPORT_FILEecho "<tr><th>Timestamp</th><th>Error Message</th></tr>" >> $REPORT_FILE# Get the last checked timestampif [ -f "$TIMESTAMP_FILE" ]; thenlast_checked=$(cat "$TIMESTAMP_FILE")elselast_checked="Sat May 11 00:00:00 2024"fi# Update the timestamp file with the current timecurrent_time=$(date '+%a %b %d %H:%M:%S %Y')echo "$current_time" > "$TIMESTAMP_FILE"# Convert last checked timestamp to seconds since epoch for comparisonlast_checked_epoch=$(date -d "$last_checked" '+%s')# Initialize a variable to keep track of the current log timestampcurrent_log_timestamp=""# Search for ORA errors in the alert log since the last checked timewhile IFS= read -r line; do# Check if the line contains a timestampif [[ $line =~ ^[A-Za-z]{3}\ [A-Za-z]{3}\ [0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}\ [0-9]{4}$ ]]; thencurrent_log_timestamp=$linecurrent_log_epoch=$(date -d "$current_log_timestamp" '+%s')fi# If the current log entry is after the last checked timestamp, check for ORA errorsif [[ -n $current_log_timestamp && $current_log_epoch -ge $last_checked_epoch ]]; thenif [[ $line =~ ORA-[0-9]{5} ]]; thenerror_message=$lineecho "<tr><td>$current_log_timestamp</td><td>$error_message</td></tr>" >> $REPORT_FILEfifidone < "$ALERT_LOG"echo "</table>" >> $REPORT_FILE}# Main script executionecho "<html><body>" > $REPORT_FILEcheck_alert_log_for_errorsecho "</body></html>" >> $REPORT_FILE
Output Format
It will generate an HTML report.
Execution of Script:
sh alert_log_check.sh
Post a Comment
Post a Comment