Coverage for utils/log.py : 39%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2from __future__ import annotations
4# -- stdlib --
5from typing import Any
6import datetime
7import logging
8import sys
10# -- third party --
11from raven.handlers.logging import SentryHandler
12from raven.transport.gevent import GeventedHTTPTransport
13import gevent
14import raven
16# -- own --
17from utils.escapes import escape_codes
20# -- code --
21class UnityLogHandler(logging.Handler):
23 def emit(self, rec):
24 msg = self.format(rec)
26 try:
27 from UnityEngine import Debug
28 if rec.levelno <= logging.DEBUG:
29 Debug.LogDebug(msg)
30 elif rec.levelno <= logging.INFO:
31 Debug.LogInfo(msg)
32 elif rec.levelno <= logging.ERROR:
33 Debug.LogError(msg)
34 else:
35 Debug.LogError(msg)
36 except Exception:
37 # fuck
38 pass
41class _ServerLogFormatter_OLD(logging.Formatter):
42 def __init__(self, with_gr_name=True):
43 logging.Formatter.__init__(self)
44 self.with_gr_name = with_gr_name
46 def format(self, rec):
48 if rec.exc_info:
49 s = []
50 s.append('>>>>>>' + '-' * 74)
51 s.append(self._format(rec))
52 import traceback
53 s.append(''.join(traceback.format_exception(*rec.exc_info)).strip())
54 s.append('<<<<<<' + '-' * 74)
55 return '\n'.join(s)
56 else:
57 return self._format(rec)
59 def _format(self, rec):
60 import time
61 g = gevent.getcurrent()
63 if self.with_gr_name:
64 gr_name = ' ' + getattr(g, 'gr_name', repr(g))
65 else:
66 gr_name = ''
68 if rec.args:
69 msg = (rec.msg % rec.args) if isinstance(rec.msg, str) else repr((rec.msg, rec.args))
70 else:
71 msg = rec.msg
73 return '[%s %s%s] %s' % (
74 rec.levelname[0],
75 time.strftime('%y%m%d %H:%M:%S'),
76 gr_name,
77 msg,
78 )
81class ServerLogFormatter(logging.Formatter):
82 def __init__(self, use_color=True):
83 super().__init__()
84 self.use_color = use_color
85 self.color_mapping = {
86 'CRITICAL': 'bold_red',
87 'ERROR': 'red',
88 'WARNING': 'yellow',
89 'INFO': 'green',
90 'DEBUG': 'blue',
91 }
93 def format(self, rec):
95 if rec.exc_info:
96 s = []
97 s.append('>>>>>>' + '-' * 74)
98 s.append(self._format(rec))
99 import traceback
100 s.append(''.join(traceback.format_exception(*rec.exc_info)).strip())
101 s.append('<<<<<<' + '-' * 74)
102 return '\n'.join(s)
103 else:
104 return self._format(rec)
106 def _format(self, rec):
107 import time
108 g = gevent.getcurrent()
109 gr_name = getattr(g, 'gr_name', None)
110 if not gr_name:
111 if isinstance(g, gevent.Greenlet):
112 gr_name = repr(g)
113 else:
114 gr_name = '<RAW>'
116 rec.message = rec.getMessage()
117 lvl = rec.levelname
118 prefix = '[{} {} {}:{} {}]'.format(
119 lvl[0],
120 time.strftime('%y%m%d %H:%M:%S'),
121 rec.module,
122 rec.lineno,
123 gr_name,
124 )
125 if self.use_color: 125 ↛ 130line 125 didn't jump to line 130, because the condition on line 125 was never false
126 E = escape_codes
127 M = self.color_mapping
128 prefix = f"{E[M[lvl]]}{prefix}{E['reset']}"
130 return f'{prefix} {rec.message}'
133def init(level, sentry_dsn, release):
134 patch_gevent_hub_print_exception()
136 root = logging.getLogger()
137 root.setLevel(0)
139 hdlr: Any
141 hdlr = logging.FileHandler('client_log.txt', encoding='utf-8')
142 hdlr.setLevel(logging.INFO)
143 root.addHandler(hdlr)
145 if sentry_dsn:
146 hdlr = SentryHandler(raven.Client(sentry_dsn, transport=GeventedHTTPTransport, release=release))
147 hdlr.setLevel(logging.ERROR)
148 root.addHandler(hdlr)
150 hdlr = logging.StreamHandler(sys.stdout)
151 hdlr.setLevel(getattr(logging, level))
153 logging.getLogger('sentry.errors').setLevel(1000)
155 formatter = ServerLogFormatter()
156 hdlr.setFormatter(formatter)
157 root.addHandler(hdlr)
159 root.info(datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))
160 root.info('==============================================')
163def init_unity(level, sentry_dsn, release):
164 root = logging.getLogger()
165 root.setLevel(0)
167 if sentry_dsn:
168 hdlr = SentryHandler(raven.Client(sentry_dsn, transport=GeventedHTTPTransport, release=release))
169 hdlr.setLevel(logging.ERROR)
170 root.addHandler(hdlr)
172 hdlr = UnityLogHandler()
173 hdlr.setLevel(level)
174 root.addHandler(hdlr)
176 root.info(datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))
177 root.info('==============================================')
180def init_server(level, sentry_dsn, release, logfile, with_gr_name=True):
181 patch_gevent_hub_print_exception()
183 root = logging.getLogger()
184 root.setLevel(level)
186 fmter = ServerLogFormatter()
187 std = logging.StreamHandler(stream=sys.stdout)
188 std.setFormatter(fmter)
189 root.addHandler(std)
191 if sentry_dsn:
192 hdlr = SentryHandler(raven.Client(sentry_dsn, transport=GeventedHTTPTransport, release=release))
193 hdlr.setLevel(logging.ERROR)
194 root.addHandler(hdlr)
196 logging.getLogger('sentry.errors').setLevel(1000)
198 if logfile:
199 from logging.handlers import WatchedFileHandler
200 filehdlr = WatchedFileHandler(logfile)
201 filehdlr.setFormatter(fmter)
202 root.addHandler(filehdlr)
205def patch_gevent_hub_print_exception():
206 from gevent.hub import Hub
208 def print_exception(self, context, type, value, tb):
209 import logging
210 log = logging.getLogger('exception')
211 log.error(
212 '%s failed with %s',
213 context, getattr(type, '__name__', 'exception'),
214 exc_info=(type, value, tb),
215 )
217 Hub.print_exception = print_exception