|
@@ -1,5 +1,6 @@
|
|
import time
|
|
import time
|
|
import json
|
|
import json
|
|
|
|
+import datetime
|
|
|
|
|
|
class Logger:
|
|
class Logger:
|
|
def __init__(self):
|
|
def __init__(self):
|
|
@@ -8,17 +9,28 @@ class Logger:
|
|
def set_redis(self, redis):
|
|
def set_redis(self, redis):
|
|
self.r = redis
|
|
self.r = redis
|
|
|
|
|
|
|
|
+ def _format_timestamp(self):
|
|
|
|
+ # Local time with milliseconds
|
|
|
|
+ return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
+
|
|
def log(self, priority, message):
|
|
def log(self, priority, message):
|
|
- tolog = {}
|
|
|
|
- tolog['time'] = int(round(time.time()))
|
|
|
|
- tolog['priority'] = priority
|
|
|
|
- tolog['message'] = message
|
|
|
|
- print(message)
|
|
|
|
|
|
+ # build redis-friendly dict
|
|
|
|
+ tolog = {
|
|
|
|
+ 'time': int(round(time.time())), # keep raw timestamp for Redis
|
|
|
|
+ 'priority': priority,
|
|
|
|
+ 'message': message
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # print human-readable message with timestamp
|
|
|
|
+ ts = self._format_timestamp()
|
|
|
|
+ print(f"{ts} {priority.upper()}: {message}", flush=True)
|
|
|
|
+
|
|
|
|
+ # also push JSON to Redis if connected
|
|
if self.r is not None:
|
|
if self.r is not None:
|
|
try:
|
|
try:
|
|
self.r.lpush('NETFILTER_LOG', json.dumps(tolog, ensure_ascii=False))
|
|
self.r.lpush('NETFILTER_LOG', json.dumps(tolog, ensure_ascii=False))
|
|
except Exception as ex:
|
|
except Exception as ex:
|
|
- print('Failed logging to redis: %s' % (ex))
|
|
|
|
|
|
+ print(f'{ts} WARN: Failed logging to redis: {ex}', flush=True)
|
|
|
|
|
|
def logWarn(self, message):
|
|
def logWarn(self, message):
|
|
self.log('warn', message)
|
|
self.log('warn', message)
|
|
@@ -27,4 +39,4 @@ class Logger:
|
|
self.log('crit', message)
|
|
self.log('crit', message)
|
|
|
|
|
|
def logInfo(self, message):
|
|
def logInfo(self, message):
|
|
- self.log('info', message)
|
|
|
|
|
|
+ self.log('info', message)
|