refac
This commit is contained in:
1 parent
9f20687680
commit
79bf3d28d8
1 file changed
+36
-13
@@ -1,6 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
import traceback
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
@@ -49,22 +50,44 @@ def _json_sink(message: 'Message') -> None:
|
|||||||
|
|
||||||
Used as a Loguru sink when LOG_FORMAT is set to "json".
|
Used as a Loguru sink when LOG_FORMAT is set to "json".
|
||||||
"""
|
"""
|
||||||
record = message.record
|
try:
|
||||||
log_entry = {
|
record = message.record
|
||||||
'ts': record['time'].strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
|
log_entry = {
|
||||||
'level': _LEVEL_MAP.get(record['level'].name, record['level'].name.lower()),
|
'ts': record['time'].isoformat(timespec='milliseconds'),
|
||||||
'msg': record['message'],
|
'level': _LEVEL_MAP.get(record['level'].name, record['level'].name.lower()),
|
||||||
'caller': f'{record["name"]}:{record["function"]}:{record["line"]}',
|
'msg': record['message'],
|
||||||
}
|
'caller': f'{record["name"]}:{record["function"]}:{record["line"]}',
|
||||||
|
}
|
||||||
|
|
||||||
if record['extra']:
|
if record['extra']:
|
||||||
log_entry['extra'] = record['extra']
|
log_entry['extra'] = record['extra']
|
||||||
|
|
||||||
if record['exception'] is not None:
|
exc = record['exception']
|
||||||
log_entry['error'] = ''.join(record['exception'].format_exception()).rstrip()
|
if exc is not None:
|
||||||
|
log_entry['error'] = {
|
||||||
|
'type': exc.type.__name__ if exc.type else None,
|
||||||
|
'message': str(exc.value) if exc.value else None,
|
||||||
|
'stacktrace': ''.join(
|
||||||
|
traceback.format_exception(exc.type, exc.value, exc.traceback)
|
||||||
|
).rstrip(),
|
||||||
|
}
|
||||||
|
|
||||||
sys.stdout.write(json.dumps(log_entry, ensure_ascii=False, default=str) + '\n')
|
sys.stdout.write(json.dumps(log_entry, ensure_ascii=False, default=str) + '\n')
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
except Exception:
|
||||||
|
# Last-resort fallback: never let a logging failure crash the application.
|
||||||
|
# Emit a minimal valid JSON line so the structured logging pipeline stays intact.
|
||||||
|
try:
|
||||||
|
fallback = {
|
||||||
|
'ts': message.record['time'].isoformat(timespec='milliseconds'),
|
||||||
|
'level': 'error',
|
||||||
|
'msg': f'[logging error] failed to serialize log record: {message}',
|
||||||
|
}
|
||||||
|
sys.stdout.write(json.dumps(fallback, ensure_ascii=False, default=str) + '\n')
|
||||||
|
sys.stdout.flush()
|
||||||
|
except Exception:
|
||||||
|
sys.stderr.write(f'[logging error] _json_sink failed: {message}\n')
|
||||||
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
|
||||||
class InterceptHandler(logging.Handler):
|
class InterceptHandler(logging.Handler):
|
||||||
|
|||||||
Reference in new issue
Block a user