Repository: incubator-ariatosca
Updated Branches:
  refs/heads/ARIA-106-Create-sqla-logging-handler [created] 51c70c86a


wip


Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/51c70c86
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/51c70c86
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/51c70c86

Branch: refs/heads/ARIA-106-Create-sqla-logging-handler
Commit: 51c70c86a92a4614eff858951cfdae7154e6c58a
Parents: 1498ad3
Author: mxmrlv <mxm...@gmail.com>
Authored: Sun Feb 12 14:30:26 2017 +0200
Committer: mxmrlv <mxm...@gmail.com>
Committed: Sun Feb 12 14:30:26 2017 +0200

----------------------------------------------------------------------
 aria/logger.py             | 24 +++++++++++++++++++
 aria/storage/__init__.py   |  2 +-
 aria/storage/base_model.py | 13 +++++++++++
 aria/storage/model.py      |  4 ++++
 tests/storage/__init__.py  |  3 +--
 tests/test_logger.py       | 51 ++++++++++++++++++++++++++++++++++++++++-
 6 files changed, 93 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/51c70c86/aria/logger.py
----------------------------------------------------------------------
diff --git a/aria/logger.py b/aria/logger.py
index 0002cb5..854a8bd 100644
--- a/aria/logger.py
+++ b/aria/logger.py
@@ -135,5 +135,29 @@ def create_file_log_handler(
     return rotating_file
 
 
+def create_sqla_log_handler(session, engine, level=logging.DEBUG):
+    from aria.storage.model import Log
+    return SQLAlchemyHandler(session, engine, Log, level=level)
+
+
 _default_file_formatter = logging.Formatter(
     '%(asctime)s [%(name)s:%(levelname)s] %(message)s 
<%(pathname)s:%(lineno)d>')
+
+
+class SQLAlchemyHandler(logging.Handler):
+    def __init__(self, session, engine, log_cls, **kwargs):
+        self._session = session
+        self._engine = engine
+        self._cls = log_cls
+        super(SQLAlchemyHandler, self).__init__(**kwargs)
+
+    def emit(self, record):
+        import datetime
+        log = self._cls(
+            logger=record.name,
+            level=record.levelname,
+            msg=record.msg,
+            created_at=datetime.datetime.now()
+        )
+        self._session.add(log)
+        self._session.commit()

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/51c70c86/aria/storage/__init__.py
----------------------------------------------------------------------
diff --git a/aria/storage/__init__.py b/aria/storage/__init__.py
index a1c07d7..a51f0b6 100644
--- a/aria/storage/__init__.py
+++ b/aria/storage/__init__.py
@@ -49,7 +49,7 @@ from . import (
     core,
     filesystem_rapi,
     sql_mapi,
-    model
+    model,
 )
 
 __all__ = (

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/51c70c86/aria/storage/base_model.py
----------------------------------------------------------------------
diff --git a/aria/storage/base_model.py b/aria/storage/base_model.py
index f7d0e5b..5d06fea 100644
--- a/aria/storage/base_model.py
+++ b/aria/storage/base_model.py
@@ -50,6 +50,7 @@ from sqlalchemy import (
     String,
     Float,
     orm,
+    func
 )
 from sqlalchemy.ext.orderinglist import ordering_list
 
@@ -755,3 +756,15 @@ class TaskBase(ModelMixin):
     @staticmethod
     def retry(message=None, retry_interval=None):
         raise TaskRetryException(message, retry_interval=retry_interval)
+
+
+class LogBase(ModelMixin):
+    __tablename__ = 'log'
+
+    logger = Column(String)
+    level = Column(String)
+    msg = Column(String)
+    created_at = Column(DateTime)
+
+    def __repr__(self):
+        return "<Log: {0} - {1}>".format(self.created_at, self.msg[:50])

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/51c70c86/aria/storage/model.py
----------------------------------------------------------------------
diff --git a/aria/storage/model.py b/aria/storage/model.py
index afca3e4..23fbb88 100644
--- a/aria/storage/model.py
+++ b/aria/storage/model.py
@@ -108,3 +108,7 @@ class Plugin(DeclarativeBase, base.PluginBase):
 
 class Task(DeclarativeBase, base.TaskBase):
     pass
+
+
+class Log(DeclarativeBase, base.LogBase):
+    pass
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/51c70c86/tests/storage/__init__.py
----------------------------------------------------------------------
diff --git a/tests/storage/__init__.py b/tests/storage/__init__.py
index b798e01..2ba6da9 100644
--- a/tests/storage/__init__.py
+++ b/tests/storage/__init__.py
@@ -12,8 +12,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-import os
-import platform
+
 from tempfile import mkdtemp
 from shutil import rmtree
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/51c70c86/tests/test_logger.py
----------------------------------------------------------------------
diff --git a/tests/test_logger.py b/tests/test_logger.py
index 70f08bb..0a4ab37 100644
--- a/tests/test_logger.py
+++ b/tests/test_logger.py
@@ -20,7 +20,12 @@ from aria.logger import (create_logger,
                          create_file_log_handler,
                          _default_file_formatter,
                          LoggerMixin,
-                         _DefaultConsoleFormat)
+                         _DefaultConsoleFormat,
+                         create_sqla_log_handler)
+from aria import application_model_storage
+from aria.storage import ModelStorage, sql_mapi
+
+from .storage import init_inmemory_model_storage, model
 
 def test_create_logger():
 
@@ -37,6 +42,50 @@ def test_create_logger():
     assert logger.level == logging.INFO
 
 
+def test_create_sqla_log_handler():
+    debug_test_string = 'debug_create_console_test_string'
+    info_test_string = 'info_create_console_test_string'
+
+    storage = ModelStorage(api_cls=sql_mapi.SQLAlchemyModelAPI,
+                           initiator=init_inmemory_model_storage,
+                           items=[model.Log])
+
+    handler = create_sqla_log_handler(**storage._additional_api_kwargs)
+
+    logger = create_logger(handlers=[handler])
+
+    # First logging
+    assert len(storage.log.list()) == 1
+    creation_string = storage.log.list()[0].msg
+    import time
+    time.sleep(2)
+    logger.info(info_test_string)
+    time.sleep(2)
+    logger.debug(debug_test_string)
+
+    logs = storage.log.list()
+
+    assert len(logs) == 3
+    info_logs = filter(lambda l: l.level.lower() == 'info', logs)
+    debugs_logs = filter(lambda l: l.level.lower() == 'debug', logs)
+
+    assert len(info_logs) == 1
+    info_log = info_logs[0]
+    assert info_log.msg == info_test_string
+
+    assert len(debugs_logs) == 2
+    creation_logs = filter(lambda l: l.msg == creation_string, debugs_logs)
+    assert len(creation_logs) == 1
+    debug_creation_log = creation_logs[0]
+
+    debug_logs = filter(lambda l: l.msg == debug_test_string, debugs_logs)
+    assert len(debug_logs) == 1
+    debug_log = debugs_logs[0]
+
+    assert debug_creation_log.created_at < info_log.created_at < 
debug_log.created_at
+
+
+
 def test_create_console_log_handler(capsys):
 
     debug_test_string = 'debug_create_console_test_string'

Reply via email to