Improved logging mechanism (and a few minor goodies) (#54)

* Improved logging mechanism

* Allow for suppression of any errors regarding failed device updates
This commit is contained in:
Dennis Keitzel
2019-03-03 19:46:38 +01:00
committed by zewelor
parent c6a068f811
commit c9a634870f
14 changed files with 200 additions and 69 deletions
+21 -16
View File
@@ -1,5 +1,14 @@
import importlib
import threading
from functools import partial
import logging
from apscheduler.schedulers.background import BackgroundScheduler
from interruptingcow import timeout
from pytz import utc
from workers_queue import _WORKERS_QUEUE
import logger
from pip import __version__ as pip_version
if int(pip_version.split('.')[0]) >= 10:
@@ -7,12 +16,8 @@ if int(pip_version.split('.')[0]) >= 10:
else:
from pip import main as pip_main
from apscheduler.schedulers.background import BackgroundScheduler
from interruptingcow import timeout
from functools import partial
from logger import _LOGGER
from workers_queue import _WORKERS_QUEUE
from pytz import utc
_LOGGER = logger.get(__name__)
class WorkersManager:
class Command:
@@ -23,10 +28,10 @@ class WorkersManager:
def execute(self):
messages = []
with timeout(35):
with timeout(35, exception=TimeoutError):
messages = self._callback(*self._args)
_LOGGER.debug(messages)
_LOGGER.debug("Command execution result: %s", messages)
return messages
def __init__(self):
@@ -46,7 +51,7 @@ class WorkersManager:
worker_obj = klass(**worker_config['args'])
if hasattr(worker_obj, 'status_update'):
_LOGGER.debug("Added: %s with %d seconds interval" % (worker_name, worker_config['update_interval']))
_LOGGER.debug("Added %s worker with %d seconds interval", repr(worker_obj), worker_config['update_interval'])
command = self.Command(worker_obj.status_update, [])
self._update_commands.append(command)
@@ -61,7 +66,7 @@ class WorkersManager:
partial(self._update_interval_wrapper, command, job_id)
))
elif hasattr(worker_obj, 'run'):
_LOGGER.debug("Registered: %s as daemon" % (worker_name))
_LOGGER.debug("Registered %s as daemon", repr(worker_obj))
self._daemons.append(worker_obj)
else:
raise "%s cannot be initialized, it has to define run or status_update method" % worker_name
@@ -105,21 +110,21 @@ class WorkersManager:
def _pip_install_helper(package_names):
for package in package_names:
pip_main(['install', '-q', package])
logger.reset()
def _update_interval_wrapper(self, command, job_id, client, userdata, c):
_LOGGER.debug("Recieved updated interval for %s with: %s", c.topic, c.payload)
_LOGGER.info("Recieved updated interval for %s with: %s", c.topic, c.payload)
try:
new_interval = int(c.payload)
self._scheduler.remove_job(job_id)
self._scheduler.add_job(
partial(self._queue_command, command), 'interval',
seconds=new_interval, id=job_id
)
partial(self._queue_command, command), 'interval',
seconds=new_interval, id=job_id)
except ValueError:
_LOGGER.info("New interval invalid, recieved: %s", c.payload)
logger.log_exception(_LOGGER, 'Ignoring invalid new interval: %s', c.payload)
def _on_command_wrapper(self, worker_obj, client, userdata, c):
_LOGGER.debug("on command wrapper for with %s: %s", c.topic, c.payload)
_LOGGER.debug("Received command for %s on %s: %s", repr(worker_obj), c.topic, c.payload)
global_topic_prefix = userdata['global_topic_prefix']
topic = c.topic[len(global_topic_prefix+'/'):] if global_topic_prefix is not None else c.topic
self._queue_command(self.Command(worker_obj.on_command, [topic, c.payload]))