Completed
Pull Request — master (#2409)
by
unknown
02:05
created

LogPrinter.log_level()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 1
c 3
b 0
f 0
dl 0
loc 6
rs 9.4285
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__). Make sure that you're getting it when the
12
    logging configuration is loaded.
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.DEBUG,
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 = logging.getLogger()
36
37
        self._printer = printer
38
        self.log_level = log_level
39
        self.timestamp_format = timestamp_format
40
41
    @property
42
    def log_level(self):
43
        """
44
        Returns current log_level used in logger.
45
        """
46
        return self.logger.getEffectiveLevel()
47
48
    @log_level.setter
49
    def log_level(self, log_level):
50
        """
51
        Sets log_level for logger.
52
        """
53
        self.logger.setLevel(log_level)
54
55
    @property
56
    def printer(self):
57
        """
58
        Returns the underlying printer where logs are printed to.
59
        """
60
        return self._printer
61
62
    def debug(self, *messages, delimiter=" ", timestamp=None, **kwargs):
63
        self.log_message(LogMessage(LOG_LEVEL.DEBUG,
64
                                    *messages,
65
                                    delimiter=delimiter,
66
                                    timestamp=timestamp),
67
                         **kwargs)
68
69
    def info(self, *messages, delimiter=" ", timestamp=None, **kwargs):
70
        self.log_message(LogMessage(LOG_LEVEL.INFO,
71
                                    *messages,
72
                                    delimiter=delimiter,
73
                                    timestamp=timestamp),
74
                         **kwargs)
75
76
    def warn(self, *messages, delimiter=" ", timestamp=None, **kwargs):
77
        self.log_message(LogMessage(LOG_LEVEL.WARNING,
78
                                    *messages,
79
                                    delimiter=delimiter,
80
                                    timestamp=timestamp),
81
                         **kwargs)
82
83
    def err(self, *messages, delimiter=" ", timestamp=None, **kwargs):
84
        self.log_message(LogMessage(LOG_LEVEL.ERROR,
85
                                    *messages,
86
                                    delimiter=delimiter,
87
                                    timestamp=timestamp),
88
                         **kwargs)
89
90
    def log(self, log_level, message, timestamp=None, **kwargs):
91
        self.log_message(LogMessage(log_level,
92
                                    message,
93
                                    timestamp=timestamp),
94
                         **kwargs)
95
96
    def log_exception(self,
97
                      message,
98
                      exception,
99
                      log_level=LOG_LEVEL.ERROR,
100
                      timestamp=None,
101
                      **kwargs):
102
        """
103
        If the log_level of the printer is greater than DEBUG, it prints
104
        only the message. If it is DEBUG or lower, it shows the message
105
        along with the traceback of the exception.
106
107
        :param message:   The message to print.
108
        :param exception: The exception to print.
109
        :param log_level: The log_level of this message (not used when
110
                          logging the traceback. Tracebacks always have
111
                          a level of DEBUG).
112
        :param timestamp: The time at which this log occured. Defaults to
113
                          the current time.
114
        :param kwargs:    Keyword arguments to be passed when logging the
115
                          message (not used when logging the traceback).
116
        """
117
        if not isinstance(exception, BaseException):
118
            raise TypeError("log_exception can only log derivatives of "
119
                            "BaseException.")
120
121
        traceback_str = "\n".join(
122
            traceback.format_exception(type(exception),
123
                                       exception,
124
                                       exception.__traceback__))
125
126
        self.log(log_level, message, timestamp=timestamp, **kwargs)
127
        self.log_message(
128
            LogMessage(LOG_LEVEL.DEBUG,
129
                       "Exception was:" + "\n" + traceback_str,
130
                       timestamp=timestamp),
131
            **kwargs)
132
133
    def log_message(self, log_message, **kwargs):
134
        if not isinstance(log_message, LogMessage):
135
            raise TypeError("log_message should be of type LogMessage.")
136
        self.logger.log(log_message.log_level, log_message.message)
137
138
    def __getstate__(self):
139
        # on Windows there are problems with serializing loggers, so omit it
140
        oldict = self.__dict__.copy()
141
        del oldict['logger']
142
        return oldict
143
144
    def __setstate__(self, newdict):
145
        self.__dict__.update(newdict)
146
        # restore logger by name
147
        self.logger = logging.getLogger()
148