1- from datetime import datetime
1+ from datetime import datetime
22from app .root_logger import get_root_logger
33from ast import literal_eval
4-
4+ import inspect
55from flask import Blueprint , request
66
77from app .lti_session_passback .auth_checkers import check_admin
1111logger = get_root_logger ()
1212
1313
14-
1514@api_logs .route ('/api/logs/' , methods = ['GET' ])
1615def get_logs () -> (dict , int ):
1716 """
@@ -26,13 +25,15 @@ def get_logs() -> (dict, int):
2625 try :
2726 limit = request .args .get ('limit' , default = None , type = int )
2827 except Exception as e :
29- logger .info ('Limit value {} is invalid.\n {}' .format (request .args .get ('limit' ), e ))
28+ logger .info ('Limit value {} is invalid.\n {}' .format (
29+ request .args .get ('limit' ), e ))
3030 limit = None
3131
3232 try :
3333 offset = request .args .get ('offset' , default = None , type = int )
3434 except Exception as e :
35- logger .info ('Offset value {} is invalid.\n {}' .format (request .args .get ('offset' , default = None ), e ))
35+ logger .info ('Offset value {} is invalid.\n {}' .format (
36+ request .args .get ('offset' , default = None ), e ))
3637 offset = None
3738
3839 raw_filters = request .args .get ('filter' , default = None )
@@ -42,7 +43,8 @@ def get_logs() -> (dict, int):
4243 if not isinstance (filters , dict ):
4344 filters = None
4445 except Exception as e :
45- logger .info ('Filter value {} is invalid.\n {}' .format (raw_filters , e ))
46+ logger .info (
47+ 'Filter value {} is invalid.\n {}' .format (raw_filters , e ))
4648 filters = None
4749 else :
4850 filters = raw_filters
@@ -52,18 +54,22 @@ def get_logs() -> (dict, int):
5254 try :
5355 ordering = literal_eval (raw_ordering )
5456 if not isinstance (ordering , list ) or not all (map (lambda x : x [1 ] in [- 1 , 1 ], ordering )):
55- logger .info ('Ordering value {} is invalid.' .format (raw_ordering ))
57+ logger .info (
58+ 'Ordering value {} is invalid.' .format (raw_ordering ))
5659 ordering = None
5760 except Exception as e :
58- logger .info ('Ordering value {} is invalid.\n {}' .format (request .args .get ('ordering' , default = None ), e ))
61+ logger .info ('Ordering value {} is invalid.\n {}' .format (
62+ request .args .get ('ordering' , default = None ), e ))
5963 ordering = None
6064 else :
6165 ordering = raw_ordering
6266
6367 try :
64- logs = LogsDBManager ().get_logs_filtered (filters = filters , limit = limit , offset = offset , ordering = ordering )
68+ logs = LogsDBManager ().get_logs_filtered (
69+ filters = filters , limit = limit , offset = offset , ordering = ordering )
6570 except Exception as e :
66- message = 'Incorrect get_logs_filtered execution, {}: {}.' .format (e .__class__ , e )
71+ message = 'Incorrect get_logs_filtered execution, {}: {}.' .format (
72+ e .__class__ , e )
6773 logger .warning (message )
6874 return {'message' : message }, 404
6975
@@ -84,3 +90,56 @@ def get_logs() -> (dict, int):
8490 logs_json ['logs' ][str (_id )] = current_log_json
8591 logs_json ['message' ] = 'OK'
8692 return logs_json , 200
93+
94+
95+ @api_logs .route ('/logs' , methods = ['POST' ])
96+ def create_log ():
97+ """
98+ Endpoint to receive client logs.
99+ Expected JSON:
100+ {
101+ "timestamp": "...",
102+ "message": "..."
103+ }
104+ """
105+ # logger.info("Received client log")
106+ frame = inspect .currentframe () # кадр
107+ caller = frame .f_back # кадр вызывающей функции
108+ pathname = caller .f_code .co_filename # путь к файлу вызвывающей функции
109+ filename = pathname .split ('/' )[- 1 ] # имя файла
110+ funcName = caller .f_code .co_name # имя функции
111+ lineno = caller .f_lineno # номер строки
112+ try :
113+ data = request .get_json (force = True )
114+ if not data :
115+ return {"message" : "Invalid json" }, 400
116+
117+ timestamp = data .get ("timestamp" )
118+ message = data .get ("message" )
119+
120+ if message is None :
121+ return {"message" : "message field is required" }, 400
122+
123+ if timestamp :
124+ timestamp = datetime .fromisoformat (
125+ timestamp .replace ("Z" , "+00:00" ))
126+ else :
127+ timestamp = datetime .now ()
128+
129+ LogsDBManager ().add_log (
130+ timestamp = timestamp ,
131+ serviceName = "client" ,
132+ levelname = "INFO" ,
133+ levelno = 20 ,
134+ message = message ,
135+ pathname = pathname ,
136+ filename = filename ,
137+ funcName = funcName ,
138+ lineno = lineno
139+ )
140+
141+ return {"message" : "log received" }, 201
142+
143+ except Exception as e :
144+ logger .warning (f"Client log creation failed: { e } " )
145+ return {"message" : "Internal server error" }, 500
0 commit comments