forked from JOJ/Joint-Teapot
		
	
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import logging
 | 
						|
import sys
 | 
						|
from sys import stderr
 | 
						|
from types import FrameType
 | 
						|
from typing import Optional
 | 
						|
 | 
						|
from loguru import logger as logger
 | 
						|
 | 
						|
from joint_teapot.config import settings
 | 
						|
 | 
						|
 | 
						|
# recipe from https://loguru.readthedocs.io/en/stable/overview.html#entirely-compatible-with-standard-logging
 | 
						|
class InterceptHandler(logging.Handler):
 | 
						|
    def __init__(self, diagnose: bool = True, backtrace: bool = True):
 | 
						|
        super().__init__()
 | 
						|
        self.diagnose = diagnose
 | 
						|
        self.backtrace = backtrace
 | 
						|
 | 
						|
    def emit(self, record: logging.LogRecord) -> None:
 | 
						|
        try:
 | 
						|
            level = logger.level(record.levelname).name
 | 
						|
        except ValueError:
 | 
						|
            level = record.levelno
 | 
						|
 | 
						|
        # Find caller from where originated the logged message
 | 
						|
        frame: Optional[FrameType] = sys._getframe(6)
 | 
						|
        depth = 6
 | 
						|
        while frame and frame.f_code.co_filename == logging.__file__:
 | 
						|
            frame = frame.f_back
 | 
						|
            depth += 1
 | 
						|
 | 
						|
        logger.opt(depth=depth, exception=record.exc_info).log(
 | 
						|
            level, record.getMessage(), diagnose=self.diagnose, backtrace=self.backtrace
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def set_logger(
 | 
						|
    stderr_log_level: str = settings.stderr_log_level,
 | 
						|
    *,
 | 
						|
    diagnose: bool = True,
 | 
						|
    backtrace: bool = True,
 | 
						|
) -> None:
 | 
						|
    logging.basicConfig(
 | 
						|
        handlers=[InterceptHandler(diagnose, backtrace)], level=0, force=True
 | 
						|
    )
 | 
						|
    logger.remove()
 | 
						|
    logger.add(
 | 
						|
        stderr,
 | 
						|
        level=stderr_log_level,
 | 
						|
        diagnose=diagnose,
 | 
						|
        backtrace=backtrace,
 | 
						|
    )
 | 
						|
    logger.add(settings.log_file_path, level="DEBUG")
 | 
						|
 | 
						|
 | 
						|
set_logger()
 |