Passed
Push — develop ( 31cd0f...eceb88 )
by Dean
02:44
created

LoggerManager.setup_raven()   A

Complexity

Conditions 2

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 4.5185
Metric Value
dl 0
loc 12
ccs 1
cts 7
cp 0.1429
rs 9.4285
cc 2
crap 4.5185
1 1
from plugin.core.constants import PLUGIN_IDENTIFIER
2 1
from plugin.core.environment import Environment
3 1
from plugin.core.helpers.variable import md5
4 1
from plugin.core.logger.filters import FrameworkFilter, AuthorizationFilter, RequestsLogFilter
5
6 1
from logging.handlers import RotatingFileHandler
7 1
from raven.utils import gethostname
8 1
import logging
9 1
import uuid
10
11 1
LOG_FORMAT = '%(asctime)-15s - %(name)-32s (%(thread)x) :  %(levelname)s (%(name)s:%(lineno)d) - %(message)s'
12 1
LOG_OPTIONS = {
13
    'plex':                         'libraries',
14
    'plex_activity':                'libraries',
15
    'plex_metadata':                'libraries',
16
    'raven':                        'libraries',
17
    'requests':                     'libraries',
18
    'trakt':                        'libraries',
19
20
    'peewee':                       'peewee',
21
    'peewee_migrate':               'peewee',
22
23
    'com.plexapp.plugins.trakttv':  'plugin',
24
    'plugin':                       'plugin',
25
26
    'pyemitter':                    'pyemitter'
27
}
28
29 1
TRACE = 5
30
31 1
log = logging.getLogger(__name__)
32
33
34 1
class LogHandler(logging.Handler):
35 1
    def __init__(self, handler):
36
        super(LogHandler, self).__init__()
37
38
        self.handler = handler
39
40
        # Update formatter for log file
41
        self.handler.formatter._fmt = LOG_FORMAT
42
43 1
    @property
44
    def baseFilename(self):
45
        return self.handler.baseFilename
46
47 1
    def emit(self, record):
48
        return self.handler.emit(record)
49
50
51 1
class LoggerManager(object):
52 1
    @staticmethod
53
    def get_handler():
54 1
        logger = logging.getLogger(PLUGIN_IDENTIFIER)
55
56 1
        for h in logger.handlers:
57
            if type(h) is RotatingFileHandler:
58
                logger.handlers.remove(h)
59
                return LogHandler(h)
60
61 1
        return None
62
63 1
    @classmethod
64 1
    def setup(cls, report=True, storage=True):
65
        cls.setup_logging(report, storage)
66
67
        if report:
68
            cls.setup_raven()
69
70
        log.debug('Initialized logging (report: %r, storage: %r)', report, storage)
71
72 1
    @staticmethod
73 1
    def setup_logging(report=True, storage=True):
74
        # Setup root logger
75
        rootLogger = logging.getLogger()
76
77
        # Set filters
78
        rootLogger.filters = [
79
            FrameworkFilter()
80
        ]
81
82
        # Set level
83
        rootLogger.setLevel(logging.DEBUG)
84
85
        # Set handlers
86
        rootLogger.handlers = [
87
            LOG_HANDLER
88
        ]
89
90
        # Setup error reporting (if enabled)
91
        if report:
92
            from plugin.core.logger.handlers.error_reporter import ERROR_REPORTER_HANDLER
93
94
            rootLogger.handlers.append(ERROR_REPORTER_HANDLER)
95
96
        # Setup local error storage (if enabled)
97
        if storage:
98
            from plugin.core.logger.handlers.error_storage import ERROR_STORAGE_HANDLER
99
100
            rootLogger.handlers.append(ERROR_STORAGE_HANDLER)
101
102 1
    @classmethod
103
    def setup_raven(cls):
104
        from plugin.core.logger.handlers.error_reporter import RAVEN
105
106
        # Generate client identifier
107
        RAVEN.name = cls.generate_id()
108
109
        # Include server version in error reports
110
        try:
111
            RAVEN.tags.update({'server.version': Environment.platform.server_version})
112
        except Exception, ex:
113
            log.warn('Unable to retrieve server version - %s', ex, exc_info=True)
114
115 1
    @staticmethod
116
    def generate_id():
117
        # Try use hashed machine identifier
118
        try:
119
            return md5(Environment.platform.machine_identifier)
120
        except Exception, ex:
121
            log.warn('Unable to generate id from machine identifier - %s', ex, exc_info=True)
122
123
        # Try use hashed hostname
124
        try:
125
            return md5(gethostname().encode('utf-8'))
126
        except Exception, ex:
127
            log.warn('Unable to generate id from hostname - %s', ex, exc_info=True)
128
129
        # Fallback to random identifier
130
        return md5(str(uuid.uuid4()))
131
132 1
    @classmethod
133
    def refresh(cls):
134
        for name, option in LOG_OPTIONS.items():
135
            logger = logging.getLogger(name)
136
137
            # Retrieve logger level, check if it has changed
138
            level = cls.get_level(option)
139
140
            if level == logger.level:
141
                continue
142
143
            # Update logger level
144
            log.debug('Changed %r logger level to %s', name, logging.getLevelName(level))
145
146
            logger.setLevel(level)
147
148 1
    @staticmethod
149
    def get_level(option):
150
        # Try retrieve preference
151
        try:
152
            value = Environment.prefs['level_%s' % option]
153
        except KeyError:
154
            # Default to "plugin" preference
155
            value = Environment.prefs['level_plugin']
156
157
        # Parse labels into level attributes
158
        if value == 'ERROR':
159
            return logging.ERROR
160
161
        if value == 'WARN' or value == 'WARNING':
162
            return logging.WARNING
163
164
        if value == 'INFO':
165
            return logging.INFO
166
167
        if value == 'DEBUG':
168
            return logging.DEBUG
169
170
        if value == "TRACE":
171
            return TRACE
172
173
        log.warn('Unknown logging level "%s"', value)
174
        return logging.DEBUG
175
176
# Get the logging file handler
177 1
LOG_HANDLER = LoggerManager.get_handler()
178
179 1
if LOG_HANDLER:
180
    LOG_HANDLER.addFilter(AuthorizationFilter())
181
    LOG_HANDLER.addFilter(RequestsLogFilter())
182