11# coding: utf-8
2-
32import datetime
43import io
54import json
65import logging
76from typing import Union
87
98import magic
9+ from pythonjsonlogger import jsonlogger
1010import requests
1111import urllib3
1212
5050urllib3 .disable_warnings (urllib3 .exceptions .InsecureRequestWarning )
5151
5252
53+ class CustomJsonFormatter (jsonlogger .JsonFormatter ):
54+ def add_fields (self , log_record , record , message_dict ):
55+ super (CustomJsonFormatter , self ).add_fields (log_record , record , message_dict )
56+ if not log_record .get ("timestamp" ):
57+ # This doesn't use record.created, so it is slightly off
58+ now = datetime .datetime .utcnow ().strftime ("%Y-%m-%dT%H:%M:%S.%fZ" )
59+ log_record ["timestamp" ] = now
60+ if log_record .get ("level" ):
61+ log_record ["level" ] = log_record ["level" ].upper ()
62+ else :
63+ log_record ["level" ] = record .levelname
64+
65+
5366class File :
5467 def __init__ (self , name , data , mime = "text/plain" ):
5568 self .name = name
@@ -76,9 +89,19 @@ class OpenCTIApiClient:
7689 "https: "http://my_proxy:8080"
7790 }
7891 ```
92+ :param json_logging: format the logs as json if set to True
93+ :type json_logging: bool, optional
7994 """
8095
81- def __init__ (self , url , token , log_level = "info" , ssl_verify = False , proxies = {}):
96+ def __init__ (
97+ self ,
98+ url ,
99+ token ,
100+ log_level = "info" ,
101+ ssl_verify = False ,
102+ proxies = {},
103+ json_logging = False ,
104+ ):
82105 """Constructor method"""
83106
84107 # Check configuration
@@ -94,7 +117,17 @@ def __init__(self, url, token, log_level="info", ssl_verify=False, proxies={}):
94117 numeric_level = getattr (logging , self .log_level .upper (), None )
95118 if not isinstance (numeric_level , int ):
96119 raise ValueError ("Invalid log level: " + self .log_level )
97- logging .basicConfig (level = numeric_level )
120+
121+ if json_logging :
122+ log_handler = logging .StreamHandler ()
123+ log_handler .setLevel (self .log_level .upper ())
124+ formatter = CustomJsonFormatter (
125+ "%(timestamp)s %(level)s %(name)s %(message)s"
126+ )
127+ log_handler .setFormatter (formatter )
128+ logging .basicConfig (handlers = [log_handler ], level = numeric_level , force = True )
129+ else :
130+ logging .basicConfig (level = numeric_level )
98131
99132 # Define API
100133 self .api_token = token
0 commit comments