|
1 | 1 | importos |
| 2 | +importsys |
2 | 3 | importbase64 |
3 | 4 | importjson |
4 | 5 | importtime |
5 | 6 | importthreading |
| 7 | +importtraceback |
6 | 8 | fromenumimportIntEnum |
7 | | -importasyncio |
8 | 9 | importrequests |
9 | 10 | importarrow |
| 11 | +fromapscheduler.schedulers.backgroundimportBackgroundScheduler |
10 | 12 | from .commonimportAPI_URL |
11 | 13 |
|
12 | 14 | class_Log(): |
13 | 15 | def__init__(self,interceptor): |
14 | 16 | self.path='/log' |
15 | 17 | self.interceptor=interceptor |
16 | | -self._loop=None |
| 18 | +self._timer=None |
17 | 19 | self.entries= [] |
18 | 20 | self.level=Level.INFO |
19 | 21 | self.fields= {} |
20 | 22 | self.batch_size=60 |
21 | 23 | self.dispatch_interval=60 |
22 | 24 |
|
23 | | -asyncdef_schedule(self): |
24 | | -whileTrue: |
25 | | -try: |
26 | | -awaitself._dispatch() |
27 | | -exceptLogErroraserr: |
28 | | -print('log error: code={}, message={}'.format(err.code,err.message)) |
29 | | -awaitasyncio.sleep(self.dispatch_interval) |
30 | | - |
31 | | -asyncdef_dispatch(self): |
| 25 | +# Automatically report uncaught fatal error |
| 26 | +defexcepthook(type,value,trace): |
| 27 | +self.fatal(message=str(value),stack_trace=''.join(traceback.format_tb(trace))) |
| 28 | +sys.__excepthook__(type,value,trace) |
| 29 | +sys.excepthook=excepthook |
| 30 | + |
| 31 | +def_dispatch(self): |
32 | 32 | iflen(self.entries)==0: |
33 | 33 | return |
34 | 34 | try: |
@@ -61,19 +61,18 @@ def _log(self, level, **kwargs): |
61 | 61 | iflevel<self.level: |
62 | 62 | return |
63 | 63 |
|
64 | | -ifself._loopisNone: |
65 | | -self._loop=asyncio.new_event_loop() |
66 | | -asyncio.set_event_loop(self._loop) |
67 | | -self._loop.create_task(self._schedule()) |
68 | | -threading.Thread(target=self._loop.run_forever).start() |
| 64 | +ifself._timerisNone: |
| 65 | +self.timer=BackgroundScheduler() |
| 66 | +self.timer.add_job(self._dispatch,'interval',seconds=self.dispatch_interval) |
| 67 | +self.timer.start() |
69 | 68 |
|
70 | 69 | kwargs['time']=arrow.now().format('YYYY-MM-DDTHH:mm:ss.SSSZ') |
71 | 70 | fork,vinself.fields.items(): |
72 | 71 | kwargs[k]=v |
73 | 72 | kwargs['level']=level.name |
74 | 73 | self.entries.append(kwargs) |
75 | 74 |
|
76 | | -iflen(self.entries)>=self.batch_size: |
| 75 | +iflevel==Level.FATALorlen(self.entries)>=self.batch_size: |
77 | 76 | try: |
78 | 77 | self._dispatch() |
79 | 78 | exceptLogErroraserr: |
|