1
- # -*- coding: utf-8 -*-
2
- #
3
1
# This software may be modified and distributed under the terms
4
2
# of the MIT license. See the LICENSE file for details.
5
3
6
- from datetime import date , datetime
7
4
import importlib .metadata
8
5
import logging
9
6
import socket
10
7
import sys
11
8
import time
12
9
import traceback
13
10
import uuid
11
+ from datetime import date , datetime , UTC
14
12
13
+ import logstash_async
15
14
from logstash_async .constants import constants
16
15
from logstash_async .utils import normalize_ecs_dict
17
- import logstash_async
18
16
19
17
20
18
try :
@@ -142,7 +140,7 @@ def _format_to_dict(self, record):
142
140
143
141
# ----------------------------------------------------------------------
144
142
def _format_timestamp (self , time_ ):
145
- timestamp = datetime .utcfromtimestamp (time_ )
143
+ timestamp = datetime .fromtimestamp (time_ , UTC )
146
144
formatted_timestamp = timestamp .strftime ('%Y-%m-%dT%H:%M:%S' )
147
145
microsecond = int (timestamp .microsecond / 1000 )
148
146
return f'{ formatted_timestamp } .{ microsecond :03} Z'
@@ -168,47 +166,47 @@ def _value_repr(self, value):
168
166
169
167
# ----------------------------------------------------------------------
170
168
def _get_primary_fields (self , record ):
171
- Schema = self .MessageSchema
169
+ schema = self .MessageSchema
172
170
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 ,
182
180
}
183
181
if self ._metadata :
184
- primary_fields [Schema .METADATA ] = self ._metadata
182
+ primary_fields [schema .METADATA ] = self ._metadata
185
183
if self ._tags :
186
- primary_fields [Schema .TAGS ] = self ._tags
184
+ primary_fields [schema .TAGS ] = self ._tags
187
185
return primary_fields
188
186
189
187
# ----------------------------------------------------------------------
190
188
def _get_extra_fields (self , record ):
191
- Schema = self .MessageSchema
189
+ schema = self .MessageSchema
192
190
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 ,
202
200
}
203
201
# static extra fields
204
202
if self ._extra :
205
203
extra_fields .update (self ._extra )
206
204
if getattr (record , 'taskName' , None ):
207
- extra_fields [Schema .TASK_NAME ] = record .taskName
205
+ extra_fields [schema .TASK_NAME ] = record .taskName
208
206
# exceptions
209
207
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 )
212
210
return extra_fields
213
211
214
212
# ----------------------------------------------------------------------
@@ -279,8 +277,8 @@ def __init__(self, *args, **kwargs):
279
277
280
278
def _get_primary_fields (self , record ):
281
279
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
284
282
return message
285
283
286
284
def _format_to_dict (self , record ):
@@ -323,10 +321,10 @@ def _fetch_django_version(self):
323
321
# ----------------------------------------------------------------------
324
322
def _get_extra_fields (self , record ):
325
323
extra_fields = super ()._get_extra_fields (record )
326
- Schema = self .MessageSchema
324
+ schema = self .MessageSchema
327
325
328
326
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
330
328
331
329
# Django's runserver command passes socketobject and WSGIRequest instances as "request".
332
330
# Hence the check for the META attribute.
@@ -335,34 +333,34 @@ def _get_extra_fields(self, record):
335
333
request = record .request
336
334
337
335
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' , '' )
346
344
347
345
forwarded_proto = request .META .get ('HTTP_X_FORWARDED_PROTO' , None )
348
346
if forwarded_proto is not None :
349
- extra_fields [Schema .REQ_FORWARDED_PROTO ] = forwarded_proto
347
+ extra_fields [schema .REQ_FORWARDED_PROTO ] = forwarded_proto
350
348
351
349
forwarded_for = request .META .get ('HTTP_X_FORWARDED_FOR' , None )
352
350
if forwarded_for is not None :
353
351
# make it a list
354
352
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
356
354
357
355
# template debug
358
356
if isinstance (record .exc_info , tuple ):
359
357
exc_value = record .exc_info [1 ]
360
358
template_info = getattr (exc_value , 'template_debug' , None )
361
359
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' ]
366
364
367
365
return extra_fields
368
366
@@ -456,37 +454,37 @@ def _get_extra_fields(self, record):
456
454
from flask import request
457
455
458
456
extra_fields = super ()._get_extra_fields (record )
459
- Schema = self .MessageSchema
457
+ schema = self .MessageSchema
460
458
461
- extra_fields [Schema .FLASK_VERSION ] = self ._flask_version
459
+ extra_fields [schema .FLASK_VERSION ] = self ._flask_version
462
460
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 )
464
462
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
470
468
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' )
472
470
if request .remote_user :
473
- extra_fields [Schema .REQ_USER ] = request .remote_user
471
+ extra_fields [schema .REQ_USER ] = request .remote_user
474
472
475
473
forwarded_proto = request .headers .get ('X-Forwarded-Proto' , None )
476
474
if forwarded_proto is not None :
477
- extra_fields [Schema .REQ_FORWARDED_PROTO ] = forwarded_proto
475
+ extra_fields [schema .REQ_FORWARDED_PROTO ] = forwarded_proto
478
476
479
477
forwarded_for = request .headers .get ('X-Forwarded-For' , None )
480
478
if forwarded_for is not None :
481
479
# make it a list
482
480
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
484
482
485
483
# check if we have a status code somewhere
486
484
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
488
486
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
490
488
491
489
return extra_fields
492
490
0 commit comments