| 1 | import sys |
| 2 | from pathlib import Path |
| 3 | from loguru import logger |
| 4 | |
| 5 | from conf import BASE_DIR |
| 6 | |
| 7 | |
| 8 | if hasattr(sys.stdout, "reconfigure"): |
| 9 | sys.stdout.reconfigure(encoding="utf-8", errors="replace") |
| 10 | if hasattr(sys.stderr, "reconfigure"): |
| 11 | sys.stderr.reconfigure(encoding="utf-8", errors="replace") |
| 12 | |
| 13 | |
| 14 | def log_formatter(record: dict) -> str: |
| 15 | """ |
| 16 | Formatter for log records. |
| 17 | :param dict record: Log object containing log metadata & message. |
| 18 | :returns: str |
| 19 | """ |
| 20 | colors = { |
| 21 | "TRACE": "#cfe2f3", |
| 22 | "INFO": "#9cbfdd", |
| 23 | "DEBUG": "#8598ea", |
| 24 | "WARNING": "#dcad5a", |
| 25 | "SUCCESS": "#3dd08d", |
| 26 | "ERROR": "#ae2c2c" |
| 27 | } |
| 28 | color = colors.get(record["level"].name, "#b3cfe7") |
| 29 | return f"<fg #70acde>{{time:YYYY-MM-DD HH:mm:ss}}</fg #70acde> | <fg {color}>{{level}}</fg {color}>: <light-white>{{message}}</light-white>\n" |
| 30 | |
| 31 | |
| 32 | def create_logger(log_name: str, file_path: str): |
| 33 | """ |
| 34 | Create custom logger for different business modules. |
| 35 | :param str log_name: name of log |
| 36 | :param str file_path: Optional path to log file |
| 37 | :returns: Configured logger |
| 38 | """ |
| 39 | def filter_record(record): |
| 40 | return record["extra"].get("business_name") == log_name |
| 41 | |
| 42 | Path(BASE_DIR / file_path).parent.mkdir(exist_ok=True) |
| 43 | logger.add(Path(BASE_DIR / file_path), filter=filter_record, level="INFO", rotation="10 MB", retention="10 days", backtrace=True, diagnose=True) |
| 44 | return logger.bind(business_name=log_name) |
| 45 | |
| 46 | |
| 47 | # Remove all existing handlers |
| 48 | logger.remove() |
| 49 | # Add a standard console handler |
| 50 | logger.add(sys.stdout, colorize=True, format=log_formatter) |
| 51 | |
| 52 | douyin_logger = create_logger('douyin', 'logs/douyin.log') |
| 53 | tencent_logger = create_logger('tencent', 'logs/tencent.log') |
| 54 | xhs_logger = create_logger('xhs', 'logs/xhs.log') |
| 55 | tiktok_logger = create_logger('tiktok', 'logs/tiktok.log') |
| 56 | bilibili_logger = create_logger('bilibili', 'logs/bilibili.log') |
| 57 | kuaishou_logger = create_logger('kuaishou', 'logs/kuaishou.log') |
| 58 | baijiahao_logger = create_logger('baijiahao', 'logs/baijiahao.log') |
| 59 | xiaohongshu_logger = create_logger('xiaohongshu', 'logs/xiaohongshu.log') |
| 60 | youtube_logger = create_logger('youtube', 'logs/youtube.log') |
| 61 |