33import datetime
44import io
55import json
6- import logging
76from typing import Union
87
98import magic
109import requests
11- import urllib3
12- from pythonjsonlogger import jsonlogger
1310
1411from pycti import __version__
15- from pycti .api import LOGGER
1612from pycti .api .opencti_api_connector import OpenCTIApiConnector
1713from pycti .api .opencti_api_playbook import OpenCTIApiPlaybook
1814from pycti .api .opencti_api_work import OpenCTIApiWork
6561from pycti .entities .opencti_tool import Tool
6662from pycti .entities .opencti_vocabulary import Vocabulary
6763from pycti .entities .opencti_vulnerability import Vulnerability
64+ from pycti .utils .opencti_logger import logger
6865from pycti .utils .opencti_stix2 import OpenCTIStix2
6966from pycti .utils .opencti_stix2_utils import OpenCTIStix2Utils
7067
71- urllib3 .disable_warnings (urllib3 .exceptions .InsecureRequestWarning )
72-
73-
74- class CustomJsonFormatter (jsonlogger .JsonFormatter ):
75- def add_fields (self , log_record , record , message_dict ):
76- super (CustomJsonFormatter , self ).add_fields (log_record , record , message_dict )
77- if not log_record .get ("timestamp" ):
78- # This doesn't use record.created, so it is slightly off
79- now = datetime .datetime .utcnow ().strftime ("%Y-%m-%dT%H:%M:%S.%fZ" )
80- log_record ["timestamp" ] = now
81- if log_record .get ("level" ):
82- log_record ["level" ] = log_record ["level" ].upper ()
83- else :
84- log_record ["level" ] = record .levelname
85-
8668
8769class File :
8870 def __init__ (self , name , data , mime = "text/plain" ):
@@ -141,19 +123,8 @@ def __init__(
141123 raise ValueError ("A TOKEN must be set" )
142124
143125 # Configure logger
144- log_level = log_level .upper ()
145- LOGGER .setLevel (log_level )
146-
147- if json_logging :
148- log_handler = logging .StreamHandler ()
149- log_handler .setLevel (log_level )
150- formatter = CustomJsonFormatter (
151- "%(timestamp)s %(level)s %(name)s %(message)s"
152- )
153- log_handler .setFormatter (formatter )
154- logging .basicConfig (handlers = [log_handler ], level = log_level , force = True )
155- else :
156- logging .basicConfig (level = log_level )
126+ self .logger_class = logger (log_level .upper (), json_logging )
127+ self .app_logger = self .logger_class ("api" )
157128
158129 # Define API
159130 self .api_token = token
@@ -398,23 +369,6 @@ def fetch_opencti_file(self, fetch_uri, binary=False, serialize=False):
398369 return base64 .b64encode (r .text ).decode ("utf-8" )
399370 return r .text
400371
401- def log (self , level , message ):
402- """log a message with defined log level
403- :param level: must be a valid logging log level (debug, info, warning, error)
404- :type level: str
405- :param message: the message to log
406- :type message: str
407- """
408-
409- if level == "debug" :
410- LOGGER .debug (message )
411- elif level == "info" :
412- LOGGER .info (message )
413- elif level == "warning" :
414- LOGGER .warning (message )
415- elif level == "error" :
416- LOGGER .error (message )
417-
418372 def health_check (self ):
419373 """submit an example request to the OpenCTI API.
420374
@@ -426,7 +380,7 @@ def health_check(self):
426380 if test is not None :
427381 return True
428382 except Exception as err : # pylint: disable=broad-except
429- LOGGER . error ("%s" , err )
383+ self . app_logger . error (str ( err ) )
430384 return False
431385 return False
432386
@@ -437,7 +391,7 @@ def get_logs_worker_config(self):
437391 rtype: dict
438392 """
439393
440- LOGGER .info ("Getting logs worker config..." )
394+ self . app_logger .info ("Getting logs worker config..." )
441395 query = """
442396 query LogsWorkerConfig {
443397 logsWorkerConfig {
@@ -638,7 +592,7 @@ def upload_file(self, **kwargs):
638592 data = kwargs .get ("data" , None )
639593 mime_type = kwargs .get ("mime_type" , "text/plain" )
640594 if file_name is not None :
641- LOGGER .info ("Uploading a file." )
595+ self . app_logger .info ("Uploading a file." )
642596 query = """
643597 mutation UploadImport($file: Upload!) {
644598 uploadImport(file: $file) {
@@ -656,7 +610,7 @@ def upload_file(self, **kwargs):
656610
657611 return self .query (query , {"file" : (File (file_name , data , mime_type ))})
658612 else :
659- LOGGER .error ("[upload] Missing parameter: file_name" )
613+ self . app_logger .error ("[upload] Missing parameter: file_name" )
660614 return None
661615
662616 def upload_pending_file (self , ** kwargs ):
@@ -673,7 +627,7 @@ def upload_pending_file(self, **kwargs):
673627 entity_id = kwargs .get ("entity_id" , None )
674628
675629 if file_name is not None :
676- LOGGER .info ("Uploading a file." )
630+ self . app_logger .info ("Uploading a file." )
677631 query = """
678632 mutation UploadPending($file: Upload!, $entityId: String) {
679633 uploadPending(file: $file, entityId: $entityId) {
@@ -693,7 +647,7 @@ def upload_pending_file(self, **kwargs):
693647 {"file" : (File (file_name , data , mime_type )), "entityId" : entity_id },
694648 )
695649 else :
696- LOGGER .error ("[upload] Missing parameter: file_name" )
650+ self . app_logger .error ("[upload] Missing parameter: file_name" )
697651 return None
698652
699653 def get_stix_content (self , id ):
@@ -703,7 +657,7 @@ def get_stix_content(self, id):
703657 rtype: dict
704658 """
705659
706- LOGGER . info ("Entity in JSON %s " , id )
660+ self . app_logger . info ("Entity in JSON" , { "id" : id } )
707661 query = """
708662 query StixQuery($id: String!) {
709663 stix(id: $id)
0 commit comments