Completed
Pull Request — master (#2409)
by
unknown
01:54
created

LogPrinter.warn()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
1
import traceback
2
import logging
3
4
from coalib.output.printers.LOG_LEVEL import LOG_LEVEL
5
from coalib.processes.communication.LogMessage import LogMessage
6
7
8
class LogPrinter:
9
    """
10
    This class is deprecated and will be soon removed. To get logger use
11
    logging.getLogger(__name__), if you're working on coalib module, or
12
    logging.getLogger(), otherwise.
13
14
    The LogPrinter class allows to print log messages to an underlying Printer.
15
16
    This class is an adapter, means you can create a LogPrinter from every
17
    existing Printer instance.
18
    """
19
20
    def __init__(self,
21
                 printer=None,
22
                 log_level=LOG_LEVEL.INFO,
23
                 timestamp_format="%X"):
24
        """
25
        Creates a new log printer from an existing Printer.
26
27
        :param printer:          The underlying Printer where log messages
28
                                 shall be written to. If you inherit from
29
                                 LogPrinter, set it to self.
30
        :param log_level:        The minimum log level, everything below will
31
                                 not be logged.
32
        :param timestamp_format: The format string for the
33
                                 datetime.today().strftime(format) method.
34
        """
35
        self.logger_name = 'coalib'
36
        self.logger = logging.getLogger(self.logger_name)
37
38
        self._printer = printer
39
        self.log_level = log_level
40
        self.timestamp_format = timestamp_format
41
42
    @property
43
    def log_level(self):
44
        """
45
        Returns current log_level used in logger.
46
        """
47
        return self.logger.getEffectiveLevel()
48
49
    @log_level.setter
50
    def log_level(self, log_level):
51
        """
52
        Sets log_level for logger.
53
        """
54
        self.logger.setLevel(log_level)
55
56
    @property
57
    def printer(self):
58
        """
59
        Returns the underlying printer where logs are printed to.
60
        """
61
        return self._printer
62
63
    def debug(self, *messages, delimiter=" ", timestamp=None, **kwargs):
64
        self.log_message(LogMessage(LOG_LEVEL.DEBUG,
65
                                    *messages,
66
                                    delimiter=delimiter,
67
                                    timestamp=timestamp),
68
                         **kwargs)
69
70
    def info(self, *messages, delimiter=" ", timestamp=None, **kwargs):
71
        self.log_message(LogMessage(LOG_LEVEL.INFO,
72
                                    *messages,
73
                                    delimiter=delimiter,
74
                                    timestamp=timestamp),
75
                         **kwargs)
76
77
    def warn(self, *messages, delimiter=" ", timestamp=None, **kwargs):
78
        self.log_message(LogMessage(LOG_LEVEL.WARNING,
79
                                    *messages,
80
                                    delimiter=delimiter,
81
                                    timestamp=timestamp),
82
                         **kwargs)
83
84
    def err(self, *messages, delimiter=" ", timestamp=None, **kwargs):
85
        self.log_message(LogMessage(LOG_LEVEL.ERROR,
86
                                    *messages,
87
                                    delimiter=delimiter,
88
                                    timestamp=timestamp),
89
                         **kwargs)
90
91
    def log(self, log_level, message, timestamp=None, **kwargs):
92
        self.log_message(LogMessage(log_level,
93
                                    message,
94
                                    timestamp=timestamp),
95
                         **kwargs)
96
97
    def log_exception(self,
98
                      message,
99
                      exception,
100
                      log_level=LOG_LEVEL.ERROR,
101
                      timestamp=None,
102
                      **kwargs):
103
        """
104
        If the log_level of the printer is greater than DEBUG, it prints
105
        only the message. If it is DEBUG or lower, it shows the message
106
        along with the traceback of the exception.
107
108
        :param message:   The message to print.
109
        :param exception: The exception to print.
110
        :param log_level: The log_level of this message (not used when
111
                          logging the traceback. Tracebacks always have
112
                          a level of DEBUG).
113
        :param timestamp: The time at which this log occured. Defaults to
114
                          the current time.
115
        :param kwargs:    Keyword arguments to be passed when logging the
116
                          message (not used when logging the traceback).
117
        """
118
        if not isinstance(exception, BaseException):
119
            raise TypeError("log_exception can only log derivatives of "
120
                            "BaseException.")
121
122
        traceback_str = "\n".join(
123
            traceback.format_exception(type(exception),
124
                                       exception,
125
                                       exception.__traceback__))
126
127
        self.log(log_level, message, timestamp=timestamp, **kwargs)
128
        self.log_message(
129
            LogMessage(LOG_LEVEL.DEBUG,
130
                       "Exception was:" + "\n" + traceback_str,
131
                       timestamp=timestamp),
132
            **kwargs)
133
134
    def log_message(self, log_message, **kwargs):
135
        if not isinstance(log_message, LogMessage):
136
            raise TypeError("log_message should be of type LogMessage.")
137
        self.logger.log(log_message.log_level, log_message.message)
138
139
    def __getstate__(self):
140
        # on Windows there are problems with serializing loggers, so omit it
141
        oldict = self.__dict__.copy()
142
        del oldict['logger']
143
        return oldict
144
145
    def __setstate__(self, newdict):
146
        self.__dict__.update(newdict)
147
        # restore logger by name
148
        self.logger = logging.getLogger(self.logger_name)
149