Coverage for logger.py: 100%
32 statements
« prev ^ index » next coverage.py v7.14.3, created at 2026-06-23 16:27 +0300
« 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
6def setup_logging():
7 os.makedirs("logs", exist_ok=True)
9 logger = logging.getLogger(os.getenv('LOGGER_NAME', 'scraper'))
10 logger.setLevel(logging.INFO)
12 formatter = logging.Formatter(
13 "[%(asctime)s] - %(levelname)s - %(name)s - %(message)s"
14 )
16 console_handler = logging.StreamHandler()
17 console_handler.setLevel(logging.INFO)
18 console_handler.setFormatter(formatter)
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)
25 if not logger.handlers:
26 logger.addHandler(console_handler)
27 logger.addHandler(file_handler)
29 return logger
31def log_calls(func):
32 logger = logging.getLogger("scraper")
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
45 return wrapper