1- # -*- coding: utf-8 -*-
2- #
31# This software may be modified and distributed under the terms
42# of the MIT license. See the LICENSE file for details.
53
6- from datetime import date , datetime
74import importlib .metadata
85import logging
96import socket
107import sys
118import time
129import traceback
1310import uuid
11+ from datetime import date , datetime , UTC
1412
13+ import logstash_async
1514from logstash_async .constants import constants
1615from logstash_async .utils import normalize_ecs_dict
17- import logstash_async
1816
1917
2018try :
@@ -142,7 +140,7 @@ def _format_to_dict(self, record):
142140
143141 # ----------------------------------------------------------------------
144142 def _format_timestamp (self , time_ ):
145- timestamp = datetime .utcfromtimestamp (time_ )
143+ timestamp = datetime .fromtimestamp (time_ , UTC )
146144 formatted_timestamp = timestamp .strftime ('%Y-%m-%dT%H:%M:%S' )
147145 microsecond = int (timestamp .microsecond / 1000 )
148146 return f'{ formatted_timestamp } .{ microsecond :03} Z'
@@ -168,47 +166,47 @@ def _value_repr(self, value):
168166
169167 # ----------------------------------------------------------------------
170168 def _get_primary_fields (self , record ):
171- Schema = self .MessageSchema
169+ schema = self .MessageSchema
172170 primary_fields = {
173- Schema .TIMESTAMP : self ._format_timestamp (record .created ),
174- Schema .VERSION : '1' ,
175- Schema .HOST : self ._host ,
176- Schema .LOG_LEVEL : record .levelname ,
177- Schema .LOG_SOURCE : self ._logsource ,
178- Schema .MESSAGE : record .getMessage (),
179- Schema .PID : record .process ,
180- Schema .PROGRAM : self ._program_name ,
181- Schema .MESSAGE_TYPE : self ._message_type ,
171+ schema .TIMESTAMP : self ._format_timestamp (record .created ),
172+ schema .VERSION : '1' ,
173+ schema .HOST : self ._host ,
174+ schema .LOG_LEVEL : record .levelname ,
175+ schema .LOG_SOURCE : self ._logsource ,
176+ schema .MESSAGE : record .getMessage (),
177+ schema .PID : record .process ,
178+ schema .PROGRAM : self ._program_name ,
179+ schema .MESSAGE_TYPE : self ._message_type ,
182180 }
183181 if self ._metadata :
184- primary_fields [Schema .METADATA ] = self ._metadata
182+ primary_fields [schema .METADATA ] = self ._metadata
185183 if self ._tags :
186- primary_fields [Schema .TAGS ] = self ._tags
184+ primary_fields [schema .TAGS ] = self ._tags
187185 return primary_fields
188186
189187 # ----------------------------------------------------------------------
190188 def _get_extra_fields (self , record ):
191- Schema = self .MessageSchema
189+ schema = self .MessageSchema
192190 extra_fields = {
193- Schema .FUNC_NAME : record .funcName ,
194- Schema .INTERPRETER : self ._interpreter ,
195- Schema .INTERPRETER_VERSION : self ._interpreter_version ,
196- Schema .LINE : record .lineno ,
197- Schema .LOGGER_NAME : record .name ,
198- Schema .LOGSTASH_ASYNC_VERSION : logstash_async .__version__ ,
199- Schema .PATH : record .pathname ,
200- Schema .PROCESS_NAME : record .processName ,
201- Schema .THREAD_NAME : record .threadName ,
191+ schema .FUNC_NAME : record .funcName ,
192+ schema .INTERPRETER : self ._interpreter ,
193+ schema .INTERPRETER_VERSION : self ._interpreter_version ,
194+ schema .LINE : record .lineno ,
195+ schema .LOGGER_NAME : record .name ,
196+ schema .LOGSTASH_ASYNC_VERSION : logstash_async .__version__ ,
197+ schema .PATH : record .pathname ,
198+ schema .PROCESS_NAME : record .processName ,
199+ schema .THREAD_NAME : record .threadName ,
202200 }
203201 # static extra fields
204202 if self ._extra :
205203 extra_fields .update (self ._extra )
206204 if getattr (record , 'taskName' , None ):
207- extra_fields [Schema .TASK_NAME ] = record .taskName
205+ extra_fields [schema .TASK_NAME ] = record .taskName
208206 # exceptions
209207 if record .exc_info :
210- extra_fields [Schema .ERROR_TYPE ] = record .exc_info [0 ].__name__
211- extra_fields [Schema .STACK_TRACE ] = self ._format_exception (record .exc_info )
208+ extra_fields [schema .ERROR_TYPE ] = record .exc_info [0 ].__name__
209+ extra_fields [schema .STACK_TRACE ] = self ._format_exception (record .exc_info )
212210 return extra_fields
213211
214212 # ----------------------------------------------------------------------
@@ -279,8 +277,8 @@ def __init__(self, *args, **kwargs):
279277
280278 def _get_primary_fields (self , record ):
281279 message = super ()._get_primary_fields (record )
282- Schema = self .MessageSchema
283- message [Schema .ECS_VERSION ] = self .ecs_version
280+ schema = self .MessageSchema
281+ message [schema .ECS_VERSION ] = self .ecs_version
284282 return message
285283
286284 def _format_to_dict (self , record ):
@@ -323,10 +321,10 @@ def _fetch_django_version(self):
323321 # ----------------------------------------------------------------------
324322 def _get_extra_fields (self , record ):
325323 extra_fields = super ()._get_extra_fields (record )
326- Schema = self .MessageSchema
324+ schema = self .MessageSchema
327325
328326 if hasattr (record , 'status_code' ):
329- extra_fields [Schema .RESP_STATUS_CODE ] = record .status_code
327+ extra_fields [schema .RESP_STATUS_CODE ] = record .status_code
330328
331329 # Django's runserver command passes socketobject and WSGIRequest instances as "request".
332330 # Hence the check for the META attribute.
@@ -335,34 +333,34 @@ def _get_extra_fields(self, record):
335333 request = record .request
336334
337335 request_user = self ._get_attribute_with_default (request , 'user' , '' )
338- extra_fields [Schema .DJANGO_VERSION ] = self ._django_version
339- extra_fields [Schema .REQ_USER_AGENT ] = request .META .get ('HTTP_USER_AGENT' , '<none>' )
340- extra_fields [Schema .REQ_REMOTE_ADDRESS ] = request .META .get ('REMOTE_ADDR' , '<none>' )
341- extra_fields [Schema .REQ_HOST ] = self ._try_to_get_host_from_remote (request )
342- extra_fields [Schema .REQ_URI ] = self ._try_to_get_full_request_uri (request )
343- extra_fields [Schema .REQ_USER ] = str (request_user )
344- extra_fields [Schema .REQ_METHOD ] = request .META .get ('REQUEST_METHOD' , '' )
345- extra_fields [Schema .REQ_REFERER ] = request .META .get ('HTTP_REFERER' , '' )
336+ extra_fields [schema .DJANGO_VERSION ] = self ._django_version
337+ extra_fields [schema .REQ_USER_AGENT ] = request .META .get ('HTTP_USER_AGENT' , '<none>' )
338+ extra_fields [schema .REQ_REMOTE_ADDRESS ] = request .META .get ('REMOTE_ADDR' , '<none>' )
339+ extra_fields [schema .REQ_HOST ] = self ._try_to_get_host_from_remote (request )
340+ extra_fields [schema .REQ_URI ] = self ._try_to_get_full_request_uri (request )
341+ extra_fields [schema .REQ_USER ] = str (request_user )
342+ extra_fields [schema .REQ_METHOD ] = request .META .get ('REQUEST_METHOD' , '' )
343+ extra_fields [schema .REQ_REFERER ] = request .META .get ('HTTP_REFERER' , '' )
346344
347345 forwarded_proto = request .META .get ('HTTP_X_FORWARDED_PROTO' , None )
348346 if forwarded_proto is not None :
349- extra_fields [Schema .REQ_FORWARDED_PROTO ] = forwarded_proto
347+ extra_fields [schema .REQ_FORWARDED_PROTO ] = forwarded_proto
350348
351349 forwarded_for = request .META .get ('HTTP_X_FORWARDED_FOR' , None )
352350 if forwarded_for is not None :
353351 # make it a list
354352 forwarded_for_list = forwarded_for .replace (' ' , '' ).split (',' )
355- extra_fields [Schema .REQ_FORWARDED_FOR ] = forwarded_for_list
353+ extra_fields [schema .REQ_FORWARDED_FOR ] = forwarded_for_list
356354
357355 # template debug
358356 if isinstance (record .exc_info , tuple ):
359357 exc_value = record .exc_info [1 ]
360358 template_info = getattr (exc_value , 'template_debug' , None )
361359 if template_info :
362- extra_fields [Schema .TMPL_NAME ] = template_info ['name' ]
363- extra_fields [Schema .TMPL_LINE ] = template_info ['line' ]
364- extra_fields [Schema .TMPL_MESSAGE ] = template_info ['message' ]
365- extra_fields [Schema .TMPL_DURING ] = template_info ['during' ]
360+ extra_fields [schema .TMPL_NAME ] = template_info ['name' ]
361+ extra_fields [schema .TMPL_LINE ] = template_info ['line' ]
362+ extra_fields [schema .TMPL_MESSAGE ] = template_info ['message' ]
363+ extra_fields [schema .TMPL_DURING ] = template_info ['during' ]
366364
367365 return extra_fields
368366
@@ -456,37 +454,37 @@ def _get_extra_fields(self, record):
456454 from flask import request
457455
458456 extra_fields = super ()._get_extra_fields (record )
459- Schema = self .MessageSchema
457+ schema = self .MessageSchema
460458
461- extra_fields [Schema .FLASK_VERSION ] = self ._flask_version
459+ extra_fields [schema .FLASK_VERSION ] = self ._flask_version
462460 if request : # request might be unbound in other threads
463- extra_fields [Schema .REQ_USER_AGENT ] = (str (request .user_agent )
461+ extra_fields [schema .REQ_USER_AGENT ] = (str (request .user_agent )
464462 if request .user_agent else '' )
465- extra_fields [Schema .REQ_REMOTE_ADDRESS ] = request .remote_addr
466- extra_fields [Schema .REQ_HOST ] = request .host .split (':' , 1 )[0 ]
467- extra_fields [Schema .REQ_URI ] = request .url
468- extra_fields [Schema .REQ_METHOD ] = request .method
469- extra_fields [Schema .REQ_REFERER ] = request .referrer
463+ extra_fields [schema .REQ_REMOTE_ADDRESS ] = request .remote_addr
464+ extra_fields [schema .REQ_HOST ] = request .host .split (':' , 1 )[0 ]
465+ extra_fields [schema .REQ_URI ] = request .url
466+ extra_fields [schema .REQ_METHOD ] = request .method
467+ extra_fields [schema .REQ_REFERER ] = request .referrer
470468 if 'X-Request-ID' in request .headers :
471- extra_fields [Schema .REQ_ID ] = request .headers .get ('X-Request-ID' )
469+ extra_fields [schema .REQ_ID ] = request .headers .get ('X-Request-ID' )
472470 if request .remote_user :
473- extra_fields [Schema .REQ_USER ] = request .remote_user
471+ extra_fields [schema .REQ_USER ] = request .remote_user
474472
475473 forwarded_proto = request .headers .get ('X-Forwarded-Proto' , None )
476474 if forwarded_proto is not None :
477- extra_fields [Schema .REQ_FORWARDED_PROTO ] = forwarded_proto
475+ extra_fields [schema .REQ_FORWARDED_PROTO ] = forwarded_proto
478476
479477 forwarded_for = request .headers .get ('X-Forwarded-For' , None )
480478 if forwarded_for is not None :
481479 # make it a list
482480 forwarded_for_list = forwarded_for .replace (' ' , '' ).split (',' )
483- extra_fields [Schema .REQ_FORWARDED_FOR ] = forwarded_for_list
481+ extra_fields [schema .REQ_FORWARDED_FOR ] = forwarded_for_list
484482
485483 # check if we have a status code somewhere
486484 if hasattr (record , 'status_code' ):
487- extra_fields [Schema .RESP_STATUS_CODE ] = record .status_code
485+ extra_fields [schema .RESP_STATUS_CODE ] = record .status_code
488486 if hasattr (record , 'response' ):
489- extra_fields [Schema .RESP_STATUS_CODE ] = record .response .status_code
487+ extra_fields [schema .RESP_STATUS_CODE ] = record .response .status_code
490488
491489 return extra_fields
492490
0 commit comments