@@ -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