diff --git a/config/logger.yaml b/config/logger.yaml new file mode 100644 index 0000000..adbd2e5 --- /dev/null +++ b/config/logger.yaml @@ -0,0 +1,19 @@ +version: 1 +formatters: + simple: + format: '%(asctime)s - %(levelname)-8s - %(name)s - %(message)s' +handlers: + console: + class: logging.StreamHandler + level: DEBUG + formatter: simple + stream: ext://sys.stdout + file: + class : logging.handlers.RotatingFileHandler + formatter: simple + filename: ./logs/app.log + maxBytes: 10000000 + backupCount: 3 +root: + level: DEBUG + handlers: [console, file] \ No newline at end of file diff --git a/modules/action/__init__.py b/modules/action/__init__.py index 715fdaa..55dd3ca 100644 --- a/modules/action/__init__.py +++ b/modules/action/__init__.py @@ -1,8 +1,12 @@ import json +import logging from flask_classy import FlaskView, route from modules.core.core import cbpi + class ActionView(FlaskView): + def __init__(self): + self.logger = logging.getLogger(__name__) @route('/', methods=['POST']) def action(self, action): @@ -15,7 +19,7 @@ class ActionView(FlaskView): 200: description: action invoked """ - print self.cbpi.cache["actions"] + self.logger.info(self.cbpi.cache["actions"]) self.cbpi.cache["actions"][action]["function"](self.cbpi) return ('',204) diff --git a/modules/base_plugins/actor.py b/modules/base_plugins/actor.py index c599de9..59f72f6 100644 --- a/modules/base_plugins/actor.py +++ b/modules/base_plugins/actor.py @@ -1,14 +1,17 @@ +import logging from modules.core.baseapi import Buzzer from modules.core.basetypes import Actor, KettleController, FermenterController from modules.core.core import cbpi + @cbpi.addon.actor.type("Dummy Actor") class Dummy(Actor): - + def __init__(self): + self.logger = logging.getLogger(__name__) @cbpi.addon.actor.action("WOHOO") def myaction(self): - print "HALLO!!!" + self.logger.debug("HALLO!!!") def on(self, power=100): ''' @@ -16,35 +19,41 @@ class Dummy(Actor): :param power: int value between 0 - 100 :return: ''' - print "ON" + self.logger.info("ON") def off(self): - print "OFF" + self.logger.info("OFF") @cbpi.addon.kettle.controller() class MyController(KettleController): + def __init__(self): + self.logger = logging.getLogger(__name__) def run(self): while self.is_running(): - print "HALLO" + self.logger.debug("HALLO") self.sleep(1) @cbpi.addon.fermenter.controller() class MyController2(FermenterController): - + def __init__(self): + self.logger = logging.getLogger(__name__) def run(self): while self.is_running(): - print "HALLO" + self.logger.debug("HALLO") self.sleep(1) @cbpi.addon.core.initializer(order=200) def init(cbpi): class MyBuzzer(Buzzer): + def __init__(self): + self.logger = logging.getLogger(__name__) + def beep(self): - print "BEEEEEEP" + self.logger.info("BEEEEEEP") cbpi.buzzer = MyBuzzer() diff --git a/modules/base_plugins/sensor.py b/modules/base_plugins/sensor.py index ded8ed5..1d5f24d 100644 --- a/modules/base_plugins/sensor.py +++ b/modules/base_plugins/sensor.py @@ -3,10 +3,12 @@ import os from os.path import join -from modules.core.basetypes import Actor, Sensor +from modules.core.basetypes import Sensor from modules.core.core import cbpi from modules.core.proptypes import Property -import random + +import logging + print "INit SENSOR" @cbpi.addon.sensor.type("Dummy Sensor") class Dummy(Sensor): @@ -14,8 +16,10 @@ class Dummy(Sensor): text = Property.Text(label="Text", required=True, description="This is a parameter", configurable=True) p = Property.Select(label="hallo",options=[1,2,3]) - def init(self): + def __init__(self): + self.logger = logging.getLogger(__name__) + def init(self): if self.api.get_config_parameter("unit","C") == "C": self.unit = "°C" else: @@ -23,8 +27,8 @@ class Dummy(Sensor): @cbpi.addon.sensor.action("WOHOO") def myaction(self): - print self.text - print "SENSOR ACTION HALLO!!!" + self.logger.info(self.text) + self.logger.debug("SENSOR ACTION HALLO!!!") def execute(self): while True: diff --git a/modules/base_plugins/steps.py b/modules/base_plugins/steps.py index bb4d404..409429e 100644 --- a/modules/base_plugins/steps.py +++ b/modules/base_plugins/steps.py @@ -1,3 +1,5 @@ +import logging + from modules.core.basetypes import Step from modules.core.core import cbpi from modules.core.proptypes import Property @@ -6,20 +8,23 @@ from modules.core.proptypes import Property @cbpi.addon.step.type("Dummy Step") class Dummy(Step): + def __init__(self): + self.logger = logging.getLogger(__name__) + @cbpi.addon.step.action("WOHOO") def myaction(self): self.stop_timer() self.start_timer(10) - print "HALLO" + self.logger.debug("HALLO") text = Property.Text(label="Text", configurable=True, description="WOHOOO") time = Property.Text(label="Text", configurable=True, description="WOHOOO") def execute(self): - #print self.text + self.logger.debug(self.text) pass def reset(self): - print "RESET STEP!!!" - self.stop_timer() \ No newline at end of file + self.logger.info("RESET STEP!!!") + self.stop_timer() diff --git a/modules/core/baseapi.py b/modules/core/baseapi.py index 9dbffad..38eaa7a 100755 --- a/modules/core/baseapi.py +++ b/modules/core/baseapi.py @@ -1,3 +1,5 @@ +import logging + from proptypes import * class BaseAPI(object): @@ -148,6 +150,8 @@ class CoreAPI(BaseAPI): key = "core" def __init__(self, cbpi): + self.logger = logging.getLogger(__name__) + self.cbpi = cbpi self.cbpi.cache["actions"] = {} self.cbpi.cache["init"] = [] @@ -160,7 +164,7 @@ class CoreAPI(BaseAPI): self.cbpi.cache["init"] = sorted(self.cbpi.cache["init"], key=lambda k: k['order']) for value in self.cbpi.cache.get("init"): - print value + self.logger.debug(value) value["function"](self.cbpi) def job(interval, method): @@ -168,7 +172,7 @@ class CoreAPI(BaseAPI): try: method(self.cbpi) except Exception as e: - print e + self.logger.debug(e) self.cbpi._socketio.sleep(interval) for value in self.cbpi.cache.get("background"): diff --git a/modules/core/basetypes.py b/modules/core/basetypes.py index 4f80b1f..999d221 100755 --- a/modules/core/basetypes.py +++ b/modules/core/basetypes.py @@ -1,3 +1,5 @@ +import logging + from modules.core.proptypes import Property import time @@ -13,6 +15,8 @@ class Base(object): self.__dirty = False class Actor(Base): + def __init__(self): + self.logger = logging.getLogger(__name__) @classmethod def init_global(cls): @@ -26,15 +30,15 @@ class Actor(Base): pass def on(self, power=100): - print "SWITCH ON" + self.logger.info("SWITCH ON") pass def off(self): - print "SWITCH OFF" + self.logger.info("SWITCH OFF") pass def power(self, power): - print "SET POWER", power + self.logger.info("SET POWER TO [%s]", power) pass def state(self): @@ -42,6 +46,8 @@ class Actor(Base): class Sensor(Base): + def __init__(self): + self.logger = logging.getLogger(__name__) unit = "" @@ -65,7 +71,7 @@ class Sensor(Base): self.cbpi.ws_emit("SENSOR_UPDATE", self.cbpi.cache["sensors"][self.id]) def execute(self): - print "EXECUTE" + self.logger.info("EXECUTE") pass @@ -229,7 +235,6 @@ class Timer(object): class Step(Base, Timer): - @classmethod def init_global(cls): pass @@ -251,12 +256,13 @@ class Step(Base, Timer): pass def execute(self): - print "-------------" - print "Step Info" - print "Kettle ID: %s" % self.kettle_id - print "ID: %s" % self.id + self.logger.info("-------------") + self.logger.info("Step Info") + self.logger.info("Kettle ID: %s" % self.kettle_id) + self.logger.info("ID: %s" % self.id) def __init__(self, *args, **kwds): + self.logger = logging.getLogger(__name__) for a in kwds: super(Step, self).__setattr__(a, kwds.get(a)) diff --git a/modules/core/core.py b/modules/core/core.py index 861826c..48fa71a 100755 --- a/modules/core/core.py +++ b/modules/core/core.py @@ -1,8 +1,10 @@ import json import logging +import logging.config import os import sqlite3 import uuid +import yaml from datetime import datetime from functools import wraps, update_wrapper from importlib import import_module @@ -62,6 +64,8 @@ class ActorCore(object): key = "actor_types" def __init__(self, cbpi): + self.logger = logging.getLogger(__name__) + self.cbpi = cbpi self.cbpi.cache["actors"] = {} self.cbpi.cache[self.key] = {} @@ -72,7 +76,7 @@ class ActorCore(object): def init_one(self, id): try: - print "INIT ONE ACTOR", id + self.logger.info("INIT ONE ACTOR [%s]", id) actor = self.cbpi.cache["actors"][id] clazz = self.cbpi.cache[self.key].get(actor.type)["class"] cfg = actor.config.copy() @@ -82,8 +86,7 @@ class ActorCore(object): actor.power = 100 self.cbpi.emit("INIT_ACTOR", id=id) except Exception as e: - print e - self.cbpi._app.logger.error(e) + self.logger.error(e) def stop_one(self, id): self.cbpi.cache["actors"][id]["instance"].stop() @@ -99,7 +102,7 @@ class ActorCore(object): self.cbpi.emit("SWITCH_ACTOR_ON", id=id, power=power) return True except Exception as e: - print e + self.logger.error(e) return False def off(self, id): @@ -111,7 +114,7 @@ class ActorCore(object): self.cbpi.emit("SWITCH_ACTOR_OFF", id=id) return True except Exception as e: - print e + self.logger.error(e) return False def toggle(self, id): @@ -129,7 +132,7 @@ class ActorCore(object): self.cbpi.emit("SWITCH_ACTOR_POWER_CHANGE", id=id, power=power) return True except Exception as e: - print e + self.logger.error(e) return False def action(self, id, method): @@ -147,14 +150,16 @@ class ActorCore(object): job = self.cbpi._socketio.start_background_task(target=toggle, id=id, seconds=seconds) def get_state(self, actor_id): - print actor_id - print self.cbpi + self.logger.debug(actor_id) + self.logger.debug(self.cbpi) class SensorCore(object): key = "sensor_types" def __init__(self, cbpi): + self.logger = logging.getLogger(__name__) + self.cbpi = cbpi self.cbpi.cache["sensors"] = {} self.cbpi.cache["sensor_instances"] = {} @@ -172,7 +177,7 @@ class SensorCore(object): cfg.update(dict(cbpi=self.cbpi, id=id)) self.cbpi.cache["sensors"][id].instance = clazz(**cfg) self.cbpi.cache["sensors"][id].instance.init() - print self.cbpi.cache["sensors"][id].instance + self.logger.debug(self.cbpi.cache["sensors"][id].instance) self.cbpi.emit("INIT_SENSOR", id=id) def job(obj): @@ -182,11 +187,10 @@ class SensorCore(object): self.cbpi.emit("INIT_SENSOR", id=id) except Exception as e: - print "ERROR" - self.cbpi._app.logger.error(e) + self.logger.error(e) def stop_one(self, id): - print "OBJ", self.cbpi.cache["sensors"][id] + self.logger.info("OBJ [%s]", self.cbpi.cache["sensors"][id]) self.cbpi.cache["sensors"][id].instance.stop() self.cbpi.emit("STOP_SENSOR", id=id) @@ -197,8 +201,8 @@ class SensorCore(object): return None def get_state(self, actor_id): - print actor_id - print self.cbpi + self.logger.info("Get state actor id [%s]", actor_id) + self.logger.debug(self.cbpi) def write_log(self, id, value, prefix="sensor"): filename = "./logs/%s_%s.log" % (prefix, str(id)) @@ -277,8 +281,11 @@ class CraftBeerPI(object): eventbus = {} def __init__(self): - FORMAT = '%(asctime)-15s - %(levelname)s - %(message)s' - logging.basicConfig(filename='./logs/app.log', level=logging.INFO, format=FORMAT) + #FORMAT = '%(asctime)-15s - %(levelname)s - %(message)s' + #logging.basicConfig(filename='./logs/app.log', level=logging.INFO, format=FORMAT) + logging.config.dictConfig(yaml.load(open('./config/logger.yaml', 'r'))) + self.logger = logging.getLogger(__name__) + self.cache["messages"] = [] self.cache["version"] = "3.1" self.modules = {} @@ -324,7 +331,7 @@ class CraftBeerPI(object): self._socketio.emit(key, data, namespace='/brew') def __init_db(self, ): - print "INIT DB" + self.logger.info("INIT DB") with self._app.app_context(): db = self.get_db() try: @@ -332,7 +339,7 @@ class CraftBeerPI(object): db.cursor().executescript(f.read()) db.commit() except Exception as e: - print e + self.logger.error(e) pass def nocache(self, view): @@ -383,13 +390,13 @@ class CraftBeerPI(object): def loadPlugins(self): for filename in os.listdir("./modules/plugins"): - print filename + self.logger.info("Loading plugin [%s]", filename) if os.path.isdir("./modules/plugins/" + filename) is False: continue try: self.modules[filename] = import_module("modules.plugins.%s" % (filename)) except Exception as e: - print e + self.logger.error(e) self.notify("Failed to load plugin %s " % filename, str(e), type="danger", timeout=None) diff --git a/modules/fermenter/__init__.py b/modules/fermenter/__init__.py index b6ce4c9..d11b842 100644 --- a/modules/fermenter/__init__.py +++ b/modules/fermenter/__init__.py @@ -1,3 +1,4 @@ +import logging import time from flask import request from flask_classy import route @@ -12,6 +13,8 @@ class FermenterView(BaseView): model = Fermenter cache_key = "fermenter" + def __init__(self): + self.logger = logging.getLogger(__name__) def _post_post_callback(self, m): m.state = False @@ -159,7 +162,7 @@ class FermenterView(BaseView): def toggle(self, id): fermenter = cbpi.cache.get(self.cache_key)[id] try: - print fermenter.state + self.logger.info("Fermenter [%s] is in state [%s]",fermenter.id, fermenter.state) if fermenter.state is False: # Start controller if fermenter.logic is not None: @@ -185,7 +188,7 @@ class FermenterView(BaseView): cbpi.emit("FERMENTER_CONTROLLER_STOPPED", id=id) except Exception as e: - print e + self.logger.error(e) cbpi.notify("Toogle Fementer Controller failed", "Pleae check the %s configuration" % fermenter.name, type="danger", timeout=None) return ('', 500) diff --git a/modules/recipe_import/kbh.py b/modules/recipe_import/kbh.py index 8cdfd4b..e43b57f 100644 --- a/modules/recipe_import/kbh.py +++ b/modules/recipe_import/kbh.py @@ -1,3 +1,5 @@ +import logging + from flask import json, request from flask_classy import FlaskView, route from git import Repo, Git @@ -11,6 +13,8 @@ from modules.step import Step, StepView class KBH(FlaskView): + def __init__(self): + self.logger = logging.getLogger(__name__) @route('/', methods=['GET']) def get(self): @@ -39,7 +43,7 @@ class KBH(FlaskView): result.append({"id": row[0], "name": row[1], "brewed": row[2]}) return json.dumps(result) except Exception as e: - print e + self.logger.error(e) self.api.notify(headline="Failed to load KHB database", message="ERROR", type="danger") return ('', 500) finally: