"""Logging configuration for the langchain-prolog library."""
import logging
import sys
from pathlib import Path
from typing import (
Any,
Callable,
Union,
)
# Define custom log levels
TRACE = 5
logging.addLevelName(TRACE, "TRACE")
[docs]
class LangChainPrologLogger:
"""Logger for the langchain-prolog package."""
[docs]
def __init__(self, name: str = "langchain_prolog"):
"""Initialize logger with default configuration.
Args:
name (str): Logger name, defaults to 'langchain_prolog'
"""
self.logger = logging.getLogger(name)
self._configure_default_logger()
def _configure_default_logger(self) -> None:
"""Configure default logging settings."""
if not self.logger.handlers:
self.logger.setLevel(logging.WARNING)
# Console handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.WARNING)
# Format
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)
console_handler.setFormatter(formatter)
self.logger.addHandler(console_handler)
[docs]
def setup_file_logging(self, log_file: Union[str, Path] = "langchain_prolog.log") -> None:
"""Setup file logging.
Args:
log_file (str | Path): Path to log file. Defaults to 'langchain_prolog.log'.
"""
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.INFO)
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)
file_handler.setFormatter(formatter)
self.logger.addHandler(file_handler)
[docs]
def set_level(self, level: int) -> None:
"""Set logging level.
Args:
level (int): Logging level (e.g., logging.DEBUG, logging.INFO)
"""
self.logger.setLevel(level)
[docs]
def trace(self, msg: str, *args: Any, **kwargs: Any) -> None:
"""Log at TRACE level."""
self.logger.log(TRACE, msg, *args, **kwargs)
@property
def debug(self) -> Callable:
"""Debug level logging."""
return self.logger.debug
@property
def info(self) -> Callable:
"""Info level logging."""
return self.logger.info
@property
def warning(self) -> Callable:
"""Warning level logging."""
return self.logger.warning
@property
def error(self) -> Callable:
"""Error level logging."""
return self.logger.error
@property
def critical(self) -> Callable:
"""Critical level logging."""
return self.logger.critical
# Create default logger instance
logger_setup = LangChainPrologLogger()
logger = logger_setup.logger