|
1 | 1 | import sys |
2 | 2 | import logging |
| 3 | +from contextlib import contextmanager |
3 | 4 | from functools import wraps |
4 | 5 |
|
5 | 6 | from .service import PyTestService |
@@ -84,51 +85,50 @@ def emit(self, record): |
84 | 85 | ) |
85 | 86 |
|
86 | 87 |
|
87 | | -def patch_logger_class(): |
| 88 | +@contextmanager |
| 89 | +def patching_logger_class(): |
88 | 90 | logger_class = logging.getLoggerClass() |
89 | | - |
90 | | - def wrap_log(original_func): |
91 | | - @wraps(original_func) |
92 | | - def _log(self, *args, **kwargs): |
93 | | - attachment = kwargs.pop('attachment', None) |
94 | | - if attachment is not None: |
95 | | - kwargs.setdefault('extra', {}).update({'attachment': attachment}) |
96 | | - return original_func(self, *args, **kwargs) |
97 | | - return _log |
98 | | - |
99 | | - def wrap_makeRecord(original_func): |
100 | | - @wraps(original_func) |
101 | | - def makeRecord(self, name, level, fn, lno, msg, args, exc_info, |
102 | | - func=None, extra=None, sinfo=None): |
103 | | - if extra is not None: |
104 | | - attachment = extra.pop('attachment', None) |
105 | | - else: |
106 | | - attachment = None |
107 | | - try: |
108 | | - # Python 3.5 |
109 | | - record = original_func(self, name, level, fn, lno, msg, args, |
110 | | - exc_info, func=func, extra=extra, |
111 | | - sinfo=sinfo) |
112 | | - except TypeError: |
113 | | - # Python 2.7 |
114 | | - record = original_func(self, name, level, fn, lno, msg, args, |
115 | | - exc_info, func=func, extra=extra) |
116 | | - record.attachment = attachment |
117 | | - return record |
118 | | - return makeRecord |
119 | | - |
120 | | - # Store references to the original methods to allow unpatching |
121 | | - setattr(logger_class, '_original__log', logger_class._log) |
122 | | - logger_class._log = wrap_log(logger_class._log) |
123 | | - setattr(logger_class, '_original_makeRecord', logger_class.makeRecord) |
124 | | - logger_class.makeRecord = wrap_makeRecord(logger_class.makeRecord) |
125 | | - |
126 | | - |
127 | | -def unpatch_logger_class(): |
128 | | - logger_class = logging.getLoggerClass() |
129 | | - if hasattr(logger_class, '_original__log'): |
130 | | - logger_class._log = logger_class._original__log |
131 | | - delattr(logger_class, '_original__log') |
132 | | - if hasattr(logger_class, '_original_makeRecord'): |
133 | | - logger_class.makeRecord = logger_class._original_makeRecord |
134 | | - delattr(logger_class, '_original_makeRecord') |
| 91 | + original_log = logger_class._log |
| 92 | + original_makeRecord = logger_class.makeRecord |
| 93 | + |
| 94 | + try: |
| 95 | + def wrap_log(original_func): |
| 96 | + @wraps(original_func) |
| 97 | + def _log(self, *args, **kwargs): |
| 98 | + attachment = kwargs.pop('attachment', None) |
| 99 | + if attachment is not None: |
| 100 | + kwargs.setdefault('extra', {}).update( |
| 101 | + {'attachment': attachment}) |
| 102 | + return original_func(self, *args, **kwargs) |
| 103 | + return _log |
| 104 | + |
| 105 | + def wrap_makeRecord(original_func): |
| 106 | + @wraps(original_func) |
| 107 | + def makeRecord(self, name, level, fn, lno, msg, args, exc_info, |
| 108 | + func=None, extra=None, sinfo=None): |
| 109 | + if extra is not None: |
| 110 | + attachment = extra.pop('attachment', None) |
| 111 | + else: |
| 112 | + attachment = None |
| 113 | + try: |
| 114 | + # Python 3.5 |
| 115 | + record = original_func(self, name, level, fn, lno, msg, |
| 116 | + args, exc_info, func=func, |
| 117 | + extra=extra, sinfo=sinfo) |
| 118 | + except TypeError: |
| 119 | + # Python 2.7 |
| 120 | + record = original_func(self, name, level, fn, lno, msg, |
| 121 | + args, exc_info, func=func, |
| 122 | + extra=extra) |
| 123 | + record.attachment = attachment |
| 124 | + return record |
| 125 | + return makeRecord |
| 126 | + |
| 127 | + logger_class._log = wrap_log(logger_class._log) |
| 128 | + logger_class.makeRecord = wrap_makeRecord(logger_class.makeRecord) |
| 129 | + |
| 130 | + yield |
| 131 | + |
| 132 | + finally: |
| 133 | + logger_class._log = original_log |
| 134 | + logger_class.makeRecord = original_makeRecord |
0 commit comments