Log Errors in Bash Scripts

Bash provides several ways to log errors, including using the built-in logger command, redirecting output to log files, and incorporating timestamps for better traceability.

Error logging is a critical component of robust Bash scripting. By logging errors, you can capture important details about failures, making it easier to troubleshoot and debug scripts.

In this tutorial, we will go through different ways to log errors in Bash Scripting with well detailed examples; and the best practices for logging errors.


Examples of Logging Errors in Bash

Let’s look at some examples of how to log errors in Bash scripts using different techniques.


1. Using logger Command to Log Errors

What is logger in Bash?

The logger command in Bash allows you to send messages directly to the system log (typically /var/log/syslog or /var/log/messages). It is a convenient way to log errors and other information without manually managing log files. The messages logged using logger include the script name, timestamp, and the message, making it easier to trace issues.

Syntax of logger Command

The basic syntax of the logger command is as follows:

</>
Copy
logger [options] "Message to log"

Common options for logger include:

  • -p: Specifies the priority of the message (e.g., user.err for an error message).
  • -t: Adds a tag (typically the script name) to the message.
  • -s: Also sends the message to the standard error output (stderr).

In this example, we use the logger command to log an error message if a command fails.

example.sh

</>
Copy
#!/bin/bash

# Attempt to copy a nonexistent file
cp /nonexistent/file /tmp/ 2>/dev/null

# Check if the command failed
if [ $? -ne 0 ]
then
    logger -p user.err -t myscript "Error: Failed to copy file /nonexistent/file"
    echo "An error has been logged."
fi

Output in syslog

Nov  7 14:23:45 localhost myscript: Error: Failed to copy file /nonexistent/file

In this script, the logger command logs the error message with the priority user.err and the tag myscript. You can view the log message in the system log file, typically found at /var/log/syslog or /var/log/messages.


2. Logging Errors to a File

If you prefer to maintain a separate log file for your script, you can redirect error messages to a log file. This method is useful for scripts running on systems where you do not have access to the system logs.

example.sh

</>
Copy
#!/bin/bash

LOGFILE="/tmp/myscript.log"

# Attempt to remove a nonexistent file
rm /nonexistent/file 2>> $LOGFILE

# Check if the command failed
if [ $? -ne 0 ]
then
    echo "$(date): Error: Failed to remove file /nonexistent/file" >> $LOGFILE
    echo "An error has been logged to $LOGFILE"
fi

Output in log file

In this example, errors are appended to a custom log file /tmp/myscript.log with a timestamp for each entry, making it easier to trace when the error occurred.


3. Using trap to Log Errors Automatically

By combining trap with logging, you can automatically log any errors that occur during script execution. This method captures errors using the ERR signal.

example.sh

</>
Copy
#!/bin/bash

LOGFILE="/tmp/error.log"

# Function to log errors
log_error() {
    echo "$(date): An error occurred in the script." >> $LOGFILE
}

# Set a trap for ERR signal
trap log_error ERR

# Command that will fail
ls /nonexistent/directory

echo "This message will not appear if an error occurs."

Output in log file

In this script, the trap command catches any errors and logs a message automatically, ensuring that all errors are recorded without additional checks.

In the log file, the error message appeared twice because we have run the script twice.


Best Practices for Logging Errors in Bash

  • Use the logger command for logging to system logs when possible, as it includes timestamps and script tags automatically.
  • Include timestamps in your log entries for better traceability and debugging.
  • Redirect both stdout and stderr to log files using exec > >(tee -a logfile) 2>&1 at the beginning of your script.
  • Use a consistent log format with clear error messages, including the script name and error details.
  • Rotate log files if they grow large using tools like logrotate to prevent disk space issues.