11import json
22import time
3- from datetime import datetime
3+ from datetime import datetime , timedelta
44
55from roboflow .adapters import deploymentapi
66from roboflow .config import load_roboflow_api_key
@@ -19,6 +19,7 @@ def add_deployment_parser(subparsers):
1919 )
2020 deployment_list_parser = deployment_subparsers .add_parser ("list" , help = "list dedicated deployments in a workspace" )
2121 deployment_delete_parser = deployment_subparsers .add_parser ("delete" , help = "delete a dedicated deployment" )
22+ deployment_log_parser = deployment_subparsers .add_parser ("log" , help = "show log info for a dedicated deployment" )
2223
2324 deployment_machine_type_parser .set_defaults (func = list_machine_types )
2425 deployment_machine_type_parser .add_argument ("-a" , "--api_key" , help = "api key" )
@@ -68,6 +69,14 @@ def add_deployment_parser(subparsers):
6869 deployment_delete_parser .set_defaults (func = delete_deployment )
6970 deployment_delete_parser .add_argument ("-a" , "--api_key" , help = "api key" )
7071 deployment_delete_parser .add_argument ("deployment_name" , help = "deployment name" )
72+
73+ deployment_log_parser .set_defaults (func = get_deployment_log )
74+ deployment_log_parser .add_argument ("-a" , "--api_key" , help = "api key" )
75+ deployment_log_parser .add_argument ("deployment_name" , help = "deployment name" )
76+ deployment_log_parser .add_argument ("-d" , "--duration" , help = "duration of log (from now) in seconds" , type = int , default = 3600 )
77+ deployment_log_parser .add_argument (
78+ "-f" , "--follow" , help = "follow log output" , action = "store_true"
79+ )
7180
7281
7382def list_machine_types (args ):
@@ -149,3 +158,33 @@ def delete_deployment(args):
149158 print (f"{ status_code } : { msg } " )
150159 return
151160 print (json .dumps (msg , indent = 2 ))
161+
162+
163+ def get_deployment_log (args ):
164+ api_key = args .api_key or load_roboflow_api_key (None )
165+ if api_key is None :
166+ print ("Please provide an api key" )
167+ return
168+
169+ to_timestamp = datetime .now ()
170+ from_timestamp = (to_timestamp - timedelta (seconds = args .duration ))
171+ log_ids = set () # to avoid duplicate logs
172+ while True :
173+ status_code , msg = deploymentapi .get_deployment_log (api_key , args .deployment_name , from_timestamp , to_timestamp )
174+ if status_code != 200 :
175+ print (f"{ status_code } : { msg } " )
176+ return
177+
178+ for log in msg [::- 1 ]: # logs are sorted by reversed timestamp
179+ if log ['insert_id' ] in log_ids :
180+ continue
181+ log_ids .add (log ['insert_id' ])
182+ print (f'[{ datetime .fromisoformat (log ["timestamp" ]).strftime ("%Y-%m-%d %H:%M:%S.%f" )} ] { log ["payload" ]} ' )
183+
184+ if not args .follow :
185+ break
186+
187+ time .sleep (10 )
188+ from_timestamp = to_timestamp
189+ to_timestamp = datetime .now ()
190+
0 commit comments