In this project, you will create a Bash script to analyze log files. This is a common task for system administrators and developers to monitor system health, track errors, and gather usage statistics. By the end of this project, you will have a script that can parse log files, extract useful information, and present it in a readable format.

Objectives

  • Understand the structure of log files.
  • Use text processing commands to extract and manipulate data.
  • Implement conditional statements and loops to process log entries.
  • Generate a summary report from the log data.

Step-by-Step Guide

  1. Understanding Log Files

Log files are records of events that happen within a system or application. They typically contain information such as timestamps, event types, and messages.

Example Log File (sample.log):

2023-10-01 10:00:00 INFO User login successful: user1
2023-10-01 10:05:00 ERROR Failed to connect to database
2023-10-01 10:10:00 INFO User logout: user1
2023-10-01 10:15:00 WARN Disk space low
2023-10-01 10:20:00 INFO User login successful: user2

  1. Setting Up the Script

Create a new Bash script file named log_analyzer.sh.

#!/bin/bash

# Log file to analyze
LOG_FILE="sample.log"

# Check if the log file exists
if [[ ! -f "$LOG_FILE" ]]; then
    echo "Log file not found!"
    exit 1
fi

# Initialize counters
info_count=0
error_count=0
warn_count=0

# Process each line in the log file
while IFS= read -r line; do
    # Extract the log level (INFO, ERROR, WARN)
    log_level=$(echo "$line" | awk '{print $3}')
    
    # Increment the corresponding counter
    case "$log_level" in
        INFO)
            ((info_count++))
            ;;
        ERROR)
            ((error_count++))
            ;;
        WARN)
            ((warn_count++))
            ;;
    esac
done < "$LOG_FILE"

# Display the summary report
echo "Log File Analysis Report"
echo "------------------------"
echo "INFO: $info_count"
echo "ERROR: $error_count"
echo "WARN: $warn_count"

  1. Explanation of the Script

  • Shebang (#!/bin/bash): Specifies the script should be run in the Bash shell.
  • LOG_FILE: Variable holding the name of the log file to analyze.
  • File Existence Check: Ensures the log file exists before proceeding.
  • Counters: Variables to count occurrences of different log levels.
  • While Loop: Reads each line of the log file.
  • AWK Command: Extracts the log level from each line.
  • Case Statement: Increments the appropriate counter based on the log level.
  • Summary Report: Displays the counts of each log level.

  1. Running the Script

Make the script executable and run it:

chmod +x log_analyzer.sh
./log_analyzer.sh

  1. Enhancements

To make the script more robust and feature-rich, consider the following enhancements:

  • Date Range Filtering: Allow the user to specify a date range to filter log entries.
  • Detailed Report: Include additional details such as the most frequent error messages.
  • Output to File: Save the summary report to a file instead of just printing it to the console.

  1. Exercise

Modify the script to include the following features:

  • User Input: Prompt the user to enter the log file name.
  • Date Range Filtering: Allow the user to specify a start and end date to filter log entries.

Solution:

#!/bin/bash

# Prompt the user for the log file name
read -p "Enter the log file name: " LOG_FILE

# Check if the log file exists
if [[ ! -f "$LOG_FILE" ]]; then
    echo "Log file not found!"
    exit 1
fi

# Prompt the user for the date range
read -p "Enter the start date (YYYY-MM-DD): " START_DATE
read -p "Enter the end date (YYYY-MM-DD): " END_DATE

# Initialize counters
info_count=0
error_count=0
warn_count=0

# Process each line in the log file
while IFS= read -r line; do
    # Extract the date and log level
    log_date=$(echo "$line" | awk '{print $1}')
    log_level=$(echo "$line" | awk '{print $3}')
    
    # Check if the log date is within the specified range
    if [[ "$log_date" > "$START_DATE" && "$log_date" < "$END_DATE" ]]; then
        # Increment the corresponding counter
        case "$log_level" in
            INFO)
                ((info_count++))
                ;;
            ERROR)
                ((error_count++))
                ;;
            WARN)
                ((warn_count++))
                ;;
        esac
    fi
done < "$LOG_FILE"

# Display the summary report
echo "Log File Analysis Report"
echo "------------------------"
echo "INFO: $info_count"
echo "ERROR: $error_count"
echo "WARN: $warn_count"

Conclusion

In this project, you learned how to create a Bash script to analyze log files. You used text processing commands, loops, and conditional statements to extract and summarize log data. This script can be further enhanced to meet specific requirements, making it a powerful tool for system administrators and developers.

© Copyright 2024. All rights reserved