Skip to content

Commit 4f713de

Browse files
committed
feat: expose extractors
1 parent 233fff2 commit 4f713de

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

ecs_logging/_stdlib.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,21 +159,25 @@ def format(self, record: logging.LogRecord) -> str:
159159
result = self.format_to_ecs(record)
160160
return json_dumps(result)
161161

162-
def format_to_ecs(self, record: logging.LogRecord) -> Dict[str, Any]:
163-
"""Function that can be overridden to add additional fields to
164-
(or remove fields from) the JSON before being dumped into a string.
162+
@property
163+
@lru_cache
164+
def _extractors(self) -> Dict[str, Callable[[logging.LogRecord], Any]]:
165+
"""Property that can be overridden to add additional field
166+
extractors to (or remove fields from) the JSON before being
167+
dumped into a string.
165168
166169
.. code-block: python
167170
168171
class MyFormatter(StdlibFormatter):
169-
def format_to_ecs(self, record):
170-
result = super().format_to_ecs(record)
171-
del result["log"]["original"] # remove unwanted field(s)
172-
result["my_field"] = "my_value" # add custom field
173-
return result
172+
@property
173+
@lru_cache
174+
def extractors(self):
175+
extractors = super().extractors
176+
del extractors["log.original"] # remove unwanted field(s)
177+
extractors["my_field"] = self._my_extractor # add custom field
178+
return extractors
174179
"""
175-
176-
extractors: Dict[str, Callable[[logging.LogRecord], Any]] = {
180+
return {
177181
"@timestamp": self._record_timestamp,
178182
"ecs.version": lambda _: ECS_VERSION,
179183
"log.level": lambda r: (r.levelname.lower() if r.levelname else None),
@@ -191,11 +195,24 @@ def format_to_ecs(self, record):
191195
"error.stack_trace": self._record_error_stack_trace,
192196
}
193197

198+
def format_to_ecs(self, record: logging.LogRecord) -> Dict[str, Any]:
199+
"""Function that can be overridden to add additional fields to
200+
(or remove fields from) the JSON before being dumped into a string.
201+
202+
.. code-block: python
203+
204+
class MyFormatter(StdlibFormatter):
205+
def format_to_ecs(self, record):
206+
result = super().format_to_ecs(record)
207+
del result["log"]["original"] # remove unwanted field(s)
208+
result["my_field"] = "my_value" # add custom field
209+
return result
210+
"""
194211
result: Dict[str, Any] = {}
195-
for field in set(extractors.keys()).difference(self._exclude_fields):
212+
for field in set(self.extractors.keys()).difference(self._exclude_fields):
196213
if self._is_field_excluded(field):
197214
continue
198-
value = extractors[field](record)
215+
value = self.extractors[field](record)
199216
if value is not None:
200217
# special case ecs.version that should not be de-dotted
201218
if field == "ecs.version":

0 commit comments

Comments
 (0)