File size: 1,549 Bytes
3fd6cd5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os
import sys
import logging
from functools import wraps
from pprint import pprint

class CustomLogger:
    def __init__(self, log_dir='logs', log_name='custom_logger'):

        log_file = log_name + '.log'
        # Create logs directory if it doesn't exist
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        self.formatter = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        # Configure logging
        self.logger = logging.getLogger(log_file)
        self.logger.setLevel(logging.DEBUG)
        file_handler = logging.FileHandler(os.path.join(log_dir, log_file))
        file_handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter(self.formatter)
        file_handler.setFormatter(formatter)
        self.logger.addHandler(file_handler)

    def log_to_stdout_and_file(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            try:
                self.logger.info(f"Executing function: {func.__name__}")
                result = func(*args, **kwargs)
                pprint(result)
                self.logger.info(f"Result: {result}")
                return result
            except Exception as e:
                self.logger.error(f"Error in function {func.__name__}: {e}")
                raise
        return wrapper

# Example usage
if __name__ == "__main__":
    custom_logger = CustomLogger()

    @custom_logger.log_to_stdout_and_file
    def example_function(x, y):
        return {'sum': x + y, 'product': x * y}

    example_function(3, 5)