Coverage for logger.py: 100%

32 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-06-23 16:27 +0300

1import logging 

2import os 

3from functools import wraps 

4from datetime import datetime 

5 

6def setup_logging(): 

7 os.makedirs("logs", exist_ok=True) 

8 

9 logger = logging.getLogger(os.getenv('LOGGER_NAME', 'scraper')) 

10 logger.setLevel(logging.INFO) 

11 

12 formatter = logging.Formatter( 

13 "[%(asctime)s] - %(levelname)s - %(name)s - %(message)s" 

14 ) 

15 

16 console_handler = logging.StreamHandler() 

17 console_handler.setLevel(logging.INFO) 

18 console_handler.setFormatter(formatter) 

19 

20 # TODO: implement file rotation on day change 

21 file_handler = logging.FileHandler(f"logs/{datetime.now().strftime('%Y-%m-%d')}.log", encoding="utf-8") 

22 file_handler.setLevel(logging.INFO) 

23 file_handler.setFormatter(formatter) 

24 

25 if not logger.handlers: 

26 logger.addHandler(console_handler) 

27 logger.addHandler(file_handler) 

28 

29 return logger 

30 

31def log_calls(func): 

32 logger = logging.getLogger("scraper") 

33 

34 @wraps(func) 

35 def wrapper(*args, **kwargs): 

36 logger.info("Calling %s", func.__name__) 

37 try: 

38 result = func(*args, **kwargs) 

39 logger.info("Finished %s", func.__name__) 

40 return result 

41 except Exception: 

42 logger.exception("Error in %s", func.__name__) 

43 raise 

44 

45 return wrapper