File size: 4,471 Bytes
60b21d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# SPDX-FileCopyrightText: 2025 Stanford University, ETH Zurich, and the project authors (see CONTRIBUTORS.md)
# SPDX-FileCopyrightText: 2025 This source file is part of the OpenTSLM open-source project.
#
# SPDX-License-Identifier: MIT

"""
OpenTSLM Global Logger

This module provides a centralized logging system for the OpenTSLM project.
The logger can be used across all modules to provide consistent logging with
verbose mode control.
"""

import logging
from typing import Optional


class OpenTSLMLogger:
    """Global logger class for OpenTSLM project with verbose mode control."""

    _instance = None
    _initialized = False

    def __new__(cls, verbose: bool = False):
        if cls._instance is None:
            cls._instance = super(OpenTSLMLogger, cls).__new__(cls)
        return cls._instance

    def __init__(self, verbose: bool = False):
        if not self._initialized:
            self.verbose = verbose
            self.logger = logging.getLogger("OpenTSLM")

            if not self.logger.handlers:
                handler = logging.StreamHandler()
                formatter = logging.Formatter("%(message)s")
                handler.setFormatter(formatter)
                self.logger.addHandler(handler)

            if verbose:
                self.logger.setLevel(logging.DEBUG)
            else:
                self.logger.setLevel(logging.WARNING)
            self._initialized = True
        else:
            # Update verbose setting if already initialized
            self.verbose = verbose
            if verbose:
                self.logger.setLevel(logging.DEBUG)
            else:
                self.logger.setLevel(logging.WARNING)

    def info(self, message: str):
        """Log info message if verbose mode is enabled."""
        self.logger.info(f"{message}")

    def warning(self, message: str):
        """Log warning message (always shown)."""
        self.logger.warning(f"⚠️  {message}")

    def error(self, message: str):
        """Log error message (always shown)."""
        self.logger.error(f"❌ {message}")

    def debug(self, message: str):
        """Log debug message if verbose mode is enabled."""
        self.logger.debug(f"πŸ” {message}")

    def success(self, message: str):
        """Log success message with checkmark icon."""
        self.logger.info(f"βœ… {message}")

    def loading(self, message: str):
        """Log loading message with spinner icon."""
        self.logger.info(f"πŸ”„ {message}")

    def rocket(self, message: str):
        """Log rocket message for exciting progress."""
        self.logger.info(f"πŸš€ {message}")

    def data(self, message: str):
        """Log data message for dataset related info."""
        self.logger.info(f"πŸ“ˆ {message}")

    def set_verbose(self, verbose: bool):
        """Update verbose setting."""
        self.verbose = verbose
        if verbose:
            self.logger.setLevel(logging.DEBUG)
        else:
            self.logger.setLevel(logging.WARNING)


# Global logger instance
_global_logger: Optional[OpenTSLMLogger] = None
_global_verbose_setting: bool = False


def get_logger(verbose: bool = None) -> OpenTSLMLogger:
    """
    Get the global OpenTSLM logger instance.

    Args:
        verbose: Whether to enable verbose logging. If None, uses global setting.

    Returns:
        OpenTSLMLogger instance
    """
    global _global_logger, _global_verbose_setting
    if _global_logger is None:
        # If no global logger exists, create one with the provided verbose setting
        # or use global setting if no verbose setting provided
        if verbose is None:
            verbose = _global_verbose_setting
        _global_logger = OpenTSLMLogger(verbose=verbose)
    else:
        # If global logger exists, update its verbose setting
        if verbose is not None:
            _global_logger.set_verbose(verbose)
        else:
            # If no verbose parameter provided, use global setting
            _global_logger.set_verbose(_global_verbose_setting)
    return _global_logger


def set_global_verbose(verbose: bool):
    """
    Set the global verbose setting for all logger instances.

    Args:
        verbose: Whether to enable verbose logging
    """
    global _global_logger, _global_verbose_setting
    _global_verbose_setting = verbose
    if _global_logger is None:
        _global_logger = OpenTSLMLogger(verbose=verbose)
    else:
        _global_logger.set_verbose(verbose)