added source to log
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/c3f4501d Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/c3f4501d Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/c3f4501d Branch: refs/heads/ARIA-106-Create-sqla-logging-handler Commit: c3f4501d45006b207211fd8b957f12ca966b395d Parents: f881d0b Author: mxmrlv <mxm...@gmail.com> Authored: Mon Feb 13 23:03:54 2017 +0200 Committer: mxmrlv <mxm...@gmail.com> Committed: Sun Feb 19 10:38:30 2017 +0200 ---------------------------------------------------------------------- aria/logger.py | 14 +++++++------- aria/orchestrator/context/common.py | 17 +++++++++++++++-- aria/orchestrator/context/operation.py | 8 ++++++++ aria/orchestrator/context/workflow.py | 1 + aria/storage/modeling/orchestrator_elements.py | 4 +++- tests/orchestrator/context/test_operation.py | 19 ++++++++++--------- 6 files changed, 44 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/c3f4501d/aria/logger.py ---------------------------------------------------------------------- diff --git a/aria/logger.py b/aria/logger.py index ebe01ba..6940d43 100644 --- a/aria/logger.py +++ b/aria/logger.py @@ -138,7 +138,11 @@ def create_file_log_handler( class SQLAlchemyHandler(logging.Handler): + def __init__(self, session, engine, log_cls, **kwargs): + from aria.storage.modeling import instance_elements + + self._instance_elements = instance_elements self._session = session self._engine = engine self._cls = log_cls @@ -146,10 +150,11 @@ class SQLAlchemyHandler(logging.Handler): def emit(self, record): log = self._cls( + prefix=record.prefix, logger=record.name, level=record.levelname, msg=record.msg, - created_at=datetime.utcnow() + created_at=datetime.utcnow(), ) self._session.add(log) self._session.commit() @@ -163,15 +168,10 @@ class _SQLAlchemyHandlerFactory(object): self._handler = None def __call__(self, session, engine, model_cls=Log, level=logging.DEBUG): - if self._handler is None or not self._is_eq(session, engine, model_cls): + if not self._handler: self._handler = SQLAlchemyHandler(session, engine, model_cls, level=level) return self._handler - def _is_eq(self, session, engine, model_cls): - return all([self._handler._session == session, - self._handler._engine == engine, - self._handler._cls == model_cls]) - create_sqla_log_handler = _SQLAlchemyHandlerFactory() _default_file_formatter = logging.Formatter( http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/c3f4501d/aria/orchestrator/context/common.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/common.py b/aria/orchestrator/context/common.py index d5ef42c..7e84c0c 100644 --- a/aria/orchestrator/context/common.py +++ b/aria/orchestrator/context/common.py @@ -15,6 +15,7 @@ """ A common context for both workflow and operation """ +from functools import partial from uuid import uuid4 import logging @@ -25,6 +26,18 @@ from aria import logger from aria.storage import exceptions +class _Logger(object): + def __init__(self, logger): + self._logger = logger + self._prefix = '' + + def set_prefix(self, prefix): + self._prefix = prefix + + def __getattr__(self, item): + return partial(getattr(self._logger, item), extra={'prefix': self._prefix}) + + class BaseContext(object): """ Base context object for workflow and operation @@ -45,7 +58,7 @@ class BaseContext(object): self._model = model_storage self._resource = resource_storage self._service_instance_id = service_instance_id - self._logger = self._init_logger(ctx_logger) + self._logger = self._init_logger(ctx_logger=ctx_logger) self._workdir = workdir def _init_logger(self, ctx_logger=None): @@ -58,7 +71,7 @@ class BaseContext(object): ctx_logger.setLevel(logging.DEBUG) - return ctx_logger + return _Logger(ctx_logger) def __repr__(self): return ( http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/c3f4501d/aria/orchestrator/context/operation.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/operation.py b/aria/orchestrator/context/operation.py index c5ac8f0..efe62ab 100644 --- a/aria/orchestrator/context/operation.py +++ b/aria/orchestrator/context/operation.py @@ -105,6 +105,10 @@ class NodeOperationContext(BaseOperationContext): """ Context for node based operations. """ + def __init__(self, **kwargs): + super(NodeOperationContext, self).__init__(**kwargs) + self.logger.set_prefix(str(self.node)) + @property def node_template(self): """ @@ -126,6 +130,10 @@ class RelationshipOperationContext(BaseOperationContext): """ Context for relationship based operations. """ + def __init__(self, **kwargs): + super(RelationshipOperationContext, self).__init__(**kwargs) + self.logger.set_prefix(str(self.relationship)) + @property def source_node_template(self): """ http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/c3f4501d/aria/orchestrator/context/workflow.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/workflow.py b/aria/orchestrator/context/workflow.py index 00ed974..297e1bc 100644 --- a/aria/orchestrator/context/workflow.py +++ b/aria/orchestrator/context/workflow.py @@ -46,6 +46,7 @@ class WorkflowContext(BaseContext): # TODO: execution creation should happen somewhere else # should be moved there, when such logical place exists self._execution_id = self._create_execution() if execution_id is None else execution_id + self.logger.set_prefix(str(self.execution)) def __repr__(self): return ( http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/c3f4501d/aria/storage/modeling/orchestrator_elements.py ---------------------------------------------------------------------- diff --git a/aria/storage/modeling/orchestrator_elements.py b/aria/storage/modeling/orchestrator_elements.py index 8efc147..edd40b9 100644 --- a/aria/storage/modeling/orchestrator_elements.py +++ b/aria/storage/modeling/orchestrator_elements.py @@ -475,6 +475,8 @@ class LogBase(ModelMixin): level = Column(String) msg = Column(String) created_at = Column(DateTime, index=True) + prefix = Column(String) def __repr__(self): - return "<Log: {0} - {1}>".format(self.created_at, self.msg[:50]) + return "<Log [{self.prefix}]: {self.created_at} - {msg}>".format( + self=self, msg=self.msg[:50]) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/c3f4501d/tests/orchestrator/context/test_operation.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_operation.py b/tests/orchestrator/context/test_operation.py index 08d360c..c216a16 100644 --- a/tests/orchestrator/context/test_operation.py +++ b/tests/orchestrator/context/test_operation.py @@ -47,7 +47,9 @@ def ctx(tmpdir): @pytest.fixture def executor(): - result = thread.ThreadExecutor() + from aria.orchestrator.workflows.executor import process + result = process.ProcessExecutor() + # result = thread.ThreadExecutor() try: yield result finally: @@ -242,25 +244,24 @@ def test_operation_logging(ctx, executor): execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) - op_start_log = ctx.model.log.list(filters=dict(msg=inputs['op_start'])) + logs = ctx.model.log.list() + assert len(logs) == 6 + + op_start_log = [l for l in logs if inputs['op_start'] in l.msg and l.level.lower() == 'info'] assert len(op_start_log) == 1 op_start_log = op_start_log[0] - assert op_start_log.level.lower() == 'info' - op_end_log = ctx.model.log.list(filters=dict(msg=inputs['op_end'])) + op_end_log = [l for l in logs if inputs['op_end'] in l.msg and l.level.lower() == 'debug'] assert len(op_end_log) == 1 op_end_log = op_end_log[0] - assert op_end_log.level.lower() == 'debug' - wf_start_log = ctx.model.log.list(filters=dict(msg=wf_start)) + wf_start_log = [l for l in logs if wf_start in l.msg and l.level.lower() == 'info'] assert len(wf_start_log) == 1 wf_start_log = wf_start_log[0] - assert wf_start_log.level.lower() == 'info' - wf_end_log = ctx.model.log.list(filters=dict(msg=wf_end)) + wf_end_log = [l for l in logs if wf_end in l.msg and l.level.lower() == 'debug'] assert len(wf_end_log) == 1 wf_end_log = wf_end_log[0] - assert wf_end_log.level.lower() == 'debug' assert (wf_start_log.created_at < wf_end_log.created_at <