Creating a Custom Log Generator Helper Class in Python
Tags: python, tips
Published: 2024-05-28 03:30:00

Logging is an essential aspect of any application, providing insights into the application's behavior, aiding in debugging, and monitoring system health. While Python’s built-in logging module is versatile, there are scenarios where a custom log generator can provide additional flexibility. 

In this post, we will create a custom log generator helper class in Python to streamline and enhance your logging process.

## Why Custom Logging?
A custom log generator can offer several benefits:

- Simplify configuration and setup.
- Standardize log formats and file naming.
- Automatically handle log rotation based on file size.
- Make it easy to include additional context in logs.

## Building the Custom Log Generator Helper Class
**Step 1: Import Required Modules**
First, import the necessary modules. We’ll use os for handling file operations and datetime for timestamping.

```Python
import os
import datetime
```

**Step 2: Define the CustomLogGenerator Class**
Next, define the CustomLogGenerator class. This class will handle the logging configuration, log file management, and message logging.

```Python
class CustomLogGenerator:
    def __init__(self, log_folder, file_prefix, max_file_size=1e6):
        self.log_folder = log_folder
        self.file_prefix = file_prefix
        self.max_file_size = max_file_size  # in bytes

        # Create log folder if it doesn't exist
        if not os.path.exists(self.log_folder):
            os.makedirs(self.log_folder)

    def _get_filename(self, date_str, file_number=None):
        if file_number:
            return f"{self.log_folder}/{self.file_prefix}{date_str}_{file_number}.log"
        else:
            return f"{self.log_folder}/{self.file_prefix}{date_str}.log"

    def _get_next_file_number(self, date_str):
        i = 1
        while True:
            log_file = self._get_filename(date_str, i)
            if not os.path.exists(log_file):
                return i
            i += 1

    def generate_log(self, message):
        date_str = datetime.datetime.now().strftime("%d%m%Y")
        log_file = self._get_filename(date_str)
        next_file_number = 1

        # Check if the log file exists and its size is more than the max_file_size
        if os.path.exists(log_file) and os.path.getsize(log_file) > self.max_file_size:
            while True:
                log_file = self._get_filename(date_str, next_file_number)
                if not os.path.exists(log_file) or os.path.getsize(log_file) <= self.max_file_size:
                    break
                next_file_number += 1

        # Write the log message to the log file
        with open(log_file, 'a') as f:
            timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            f.write(f"{timestamp} - {message}\n")

```

**Step 3: Using the Custom Log Generator**
Now, let's see how you can use this CustomLogGenerator in your application.

```Python
# Initialize the log generator
log_generator = CustomLogGenerator(log_folder='logs', file_prefix='app_log_', max_file_size=1e6)

# Generate some log messages
log_generator.generate_log('This is the first log message.')
log_generator.generate_log('This is the second log message.')
log_generator.generate_log('Another log message with more details.')

```

## Conclusion

By creating a custom log generator helper class, you can streamline your logging process, ensure consistent log formatting, and handle log file rotation automatically. This class provides a flexible foundation for enhancing your application's logging capabilities.

Feel free to modify and extend this class to suit your specific needs. Happy logging!

Please find complete code [here](https://github.com/learn-with-santosh/python/blob/main/custom-log-generator.py)