Skip to content

Commit de5c3e4

Browse files
authored
Merge pull request #411 from avinxshKD/fix/logging-nullhandler
use named logger, drop force=True
2 parents 6b7f645 + 1bfd16c commit de5c3e4

1 file changed

Lines changed: 32 additions & 35 deletions

File tree

concore.py

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@
99
import numpy as np
1010
import signal
1111

12-
logging.basicConfig(
13-
level=logging.INFO,
14-
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
15-
force=True
16-
)
12+
logger = logging.getLogger('concore')
13+
logger.addHandler(logging.NullHandler())
1714

1815
#these lines mute the noisy library
1916
logging.getLogger('matplotlib').setLevel(logging.WARNING)
@@ -53,10 +50,10 @@ def __init__(self, port_type, address, zmq_socket_type):
5350
# Bind or connect
5451
if self.port_type == "bind":
5552
self.socket.bind(address)
56-
logging.info(f"ZMQ Port bound to {address}")
53+
logger.info(f"ZMQ Port bound to {address}")
5754
else:
5855
self.socket.connect(address)
59-
logging.info(f"ZMQ Port connected to {address}")
56+
logger.info(f"ZMQ Port connected to {address}")
6057

6158
def send_json_with_retry(self, message):
6259
"""Send JSON message with retries if timeout occurs."""
@@ -65,9 +62,9 @@ def send_json_with_retry(self, message):
6562
self.socket.send_json(message)
6663
return
6764
except zmq.Again:
68-
logging.warning(f"Send timeout (attempt {attempt + 1}/5)")
65+
logger.warning(f"Send timeout (attempt {attempt + 1}/5)")
6966
time.sleep(0.5)
70-
logging.error("Failed to send after retries.")
67+
logger.error("Failed to send after retries.")
7168
return
7269

7370
def recv_json_with_retry(self):
@@ -76,9 +73,9 @@ def recv_json_with_retry(self):
7673
try:
7774
return self.socket.recv_json()
7875
except zmq.Again:
79-
logging.warning(f"Receive timeout (attempt {attempt + 1}/5)")
76+
logger.warning(f"Receive timeout (attempt {attempt + 1}/5)")
8077
time.sleep(0.5)
81-
logging.error("Failed to receive after retries.")
78+
logger.error("Failed to receive after retries.")
8279
return None
8380

8481
# Global ZeroMQ ports registry
@@ -94,20 +91,20 @@ def init_zmq_port(port_name, port_type, address, socket_type_str):
9491
socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB").
9592
"""
9693
if port_name in zmq_ports:
97-
logging.info(f"ZMQ Port {port_name} already initialized.")
94+
logger.info(f"ZMQ Port {port_name} already initialized.")
9895
return # Avoid reinitialization
9996

10097
try:
10198
# Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP)
10299
zmq_socket_type = getattr(zmq, socket_type_str.upper())
103100
zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type)
104-
logging.info(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}")
101+
logger.info(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}")
105102
except AttributeError:
106-
logging.error(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.")
103+
logger.error(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.")
107104
except zmq.error.ZMQError as e:
108-
logging.error(f"Error initializing ZMQ port {port_name} on {address}: {e}")
105+
logger.error(f"Error initializing ZMQ port {port_name} on {address}: {e}")
109106
except Exception as e:
110-
logging.error(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}")
107+
logger.error(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}")
111108

112109
def terminate_zmq():
113110
"""Clean up all ZMQ sockets and contexts before exit."""
@@ -127,7 +124,7 @@ def terminate_zmq():
127124
port.context.term()
128125
print(f"Closed ZMQ port: {port_name}")
129126
except Exception as e:
130-
logging.error(f"Error while terminating ZMQ port {port.address}: {e}")
127+
logger.error(f"Error while terminating ZMQ port {port.address}: {e}")
131128
zmq_ports.clear()
132129
_cleanup_in_progress = False
133130

@@ -242,9 +239,9 @@ def parse_params(sparams: str) -> dict:
242239
sparams = sparams[1:-1]
243240

244241
# Parse params using clean function instead of regex
245-
logging.debug("parsing sparams: "+sparams)
242+
logger.debug("parsing sparams: "+sparams)
246243
params = parse_params(sparams)
247-
logging.debug("parsed params: " + str(params))
244+
logger.debug("parsed params: " + str(params))
248245
else:
249246
params = dict()
250247
else:
@@ -306,17 +303,17 @@ def read(port_identifier, name, initstr_val):
306303
return message[1:]
307304
return message
308305
except zmq.error.ZMQError as e:
309-
logging.error(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.")
306+
logger.error(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.")
310307
return default_return_val
311308
except Exception as e:
312-
logging.error(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.")
309+
logger.error(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.")
313310
return default_return_val
314311

315312
# Case 2: File-based port
316313
try:
317314
file_port_num = int(port_identifier)
318315
except ValueError:
319-
logging.error(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.")
316+
logger.error(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.")
320317
return default_return_val
321318

322319
time.sleep(delay)
@@ -330,7 +327,7 @@ def read(port_identifier, name, initstr_val):
330327
ins = str(initstr_val)
331328
s += ins # Update s to break unchanged() loop
332329
except Exception as e:
333-
logging.error(f"Error reading {file_path}: {e}. Using default value.")
330+
logger.error(f"Error reading {file_path}: {e}. Using default value.")
334331
return default_return_val
335332

336333
# Retry logic if file is empty
@@ -342,12 +339,12 @@ def read(port_identifier, name, initstr_val):
342339
with open(file_path, "r") as infile:
343340
ins = infile.read()
344341
except Exception as e:
345-
logging.warning(f"Retry {attempts + 1}: Error reading {file_path} - {e}")
342+
logger.warning(f"Retry {attempts + 1}: Error reading {file_path} - {e}")
346343
attempts += 1
347344
retrycount += 1
348345

349346
if len(ins) == 0:
350-
logging.error(f"Max retries reached for {file_path}, using default value.")
347+
logger.error(f"Max retries reached for {file_path}, using default value.")
351348
return default_return_val
352349

353350
s += ins
@@ -361,10 +358,10 @@ def read(port_identifier, name, initstr_val):
361358
simtime = max(simtime, current_simtime_from_file)
362359
return inval[1:]
363360
else:
364-
logging.warning(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.")
361+
logger.warning(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.")
365362
return inval
366363
except Exception as e:
367-
logging.error(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.")
364+
logger.error(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.")
368365
return default_return_val
369366

370367

@@ -389,24 +386,24 @@ def write(port_identifier, name, val, delta=0):
389386
else:
390387
zmq_p.send_json_with_retry(zmq_val)
391388
except zmq.error.ZMQError as e:
392-
logging.error(f"ZMQ write error on port {port_identifier} (name: {name}): {e}")
389+
logger.error(f"ZMQ write error on port {port_identifier} (name: {name}): {e}")
393390
except Exception as e:
394-
logging.error(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}")
391+
logger.error(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}")
395392
return
396393

397394
# Case 2: File-based port
398395
try:
399396
file_port_num = int(port_identifier)
400397
file_path = os.path.join(outpath + str(file_port_num), name)
401398
except ValueError:
402-
logging.error(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.")
399+
logger.error(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.")
403400
return
404401

405402
# File writing rules
406403
if isinstance(val, str):
407404
time.sleep(2 * delay) # string writes wait longer
408405
elif not isinstance(val, list):
409-
logging.error(f"File write to {file_path} must have list or str value, got {type(val)}")
406+
logger.error(f"File write to {file_path} must have list or str value, got {type(val)}")
410407
return
411408

412409
try:
@@ -420,7 +417,7 @@ def write(port_identifier, name, val, delta=0):
420417
else:
421418
outfile.write(val)
422419
except Exception as e:
423-
logging.error(f"Error writing to {file_path}: {e}")
420+
logger.error(f"Error writing to {file_path}: {e}")
424421

425422
def initval(simtime_val_str):
426423
"""
@@ -436,12 +433,12 @@ def initval(simtime_val_str):
436433
simtime = first_element
437434
return val[1:]
438435
else:
439-
logging.error(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.")
436+
logger.error(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.")
440437
return val[1:] if len(val) > 1 else []
441438
else:
442-
logging.error(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.")
439+
logger.error(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.")
443440
return []
444441

445442
except Exception as e:
446-
logging.error(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.")
443+
logger.error(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.")
447444
return []

0 commit comments

Comments
 (0)