Leverage logging config and refactor the logger
authorhelenyao <yaohelan@huawei.com>
Thu, 5 Jan 2017 06:57:01 +0000 (01:57 -0500)
committerhelenyao <yaohelan@huawei.com>
Thu, 19 Jan 2017 09:36:48 +0000 (04:36 -0500)
JIRA: FUNCTEST-690

The detailed benefits are listed in the JIRA description.

1. Refactored the functest_logger to make use of configuration file
2. Avoided configuring the logging every time a logger is initialized
3. Applied separate logging configuration fo unit test by removing
saving log to file

Change-Id: I6e27eaba727ae6d704f0301f15359dc3ea7b2f97
Signed-off-by: helenyao <yaohelan@huawei.com>
functest/ci/config_functest.yaml
functest/ci/logging.json [new file with mode: 0644]
functest/tests/unit/cli/commands/test_cli_env.py
functest/tests/unit/core/test_testcase_base.py [changed mode: 0644->0755]
functest/tests/unit/odl/test_odl.py
functest/tests/unit/test_logging.ini [new file with mode: 0644]
functest/tests/unit/utils/test_functest_utils.py
functest/utils/functest_logger.py [changed mode: 0644->0755]
run_unit_tests.sh

index 25be172..f1efd90 100755 (executable)
@@ -30,6 +30,7 @@ general:
         functest:           /home/opnfv/functest
         functest_test:      /home/opnfv/repos/functest/functest/opnfv_tests
         results:            /home/opnfv/functest/results
+        functest_logging_cfg:   /home/opnfv/repos/functest/functest/ci/logging.json
         functest_conf:      /home/opnfv/functest/conf
         functest_data:      /home/opnfv/functest/data
         dir_vIMS_data:      /home/opnfv/functest/data/vIMS/
diff --git a/functest/ci/logging.json b/functest/ci/logging.json
new file mode 100644 (file)
index 0000000..3f454e8
--- /dev/null
@@ -0,0 +1,29 @@
+{\r
+    "version": 1,\r
+    "disable_existing_loggers": false,\r
+    "formatters": {\r
+        "standard": {\r
+            "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"\r
+        }\r
+    },\r
+    "handlers": {\r
+        "console": {\r
+            "level": "INFO",\r
+            "class": "logging.StreamHandler",\r
+            "formatter": "standard"\r
+        },\r
+        "file": {\r
+            "level": "DEBUG",\r
+            "class": "logging.FileHandler",\r
+            "formatter": "standard",\r
+            "filename": "/home/opnfv/functest/results/functest.log"\r
+        }\r
+    },\r
+    "loggers": {\r
+        "": {\r
+            "handlers": ["console", "file"],\r
+            "level": "DEBUG",\r
+            "propagate": "yes"\r
+        }\r
+    }\r
+}\r
index f70761d..4b6ea57 100644 (file)
@@ -11,7 +11,6 @@ import unittest
 from git.exc import NoSuchPathError
 import mock
 
-mock.patch('logging.FileHandler').start()  # noqa
 from functest.cli.commands import cli_env
 from functest.utils.constants import CONST
 from functest.tests.unit import test_utils
old mode 100644 (file)
new mode 100755 (executable)
index 8df524b..94d2e96
@@ -12,8 +12,6 @@ import mock
 import os
 import unittest
 
-mock.patch('logging.FileHandler').start()  # noqa
-
 from functest.core import testcase_base
 
 
index 59ab2c6..568fdc8 100644 (file)
@@ -19,7 +19,6 @@ from robot.errors import DataError, RobotError
 from robot.result import testcase
 from robot.utils.robottime import timestamp_to_secs
 
-mock.patch('logging.FileHandler').start()  # noqa
 from functest.core import testcase_base
 from functest.opnfv_tests.sdn.odl import odl
 
diff --git a/functest/tests/unit/test_logging.ini b/functest/tests/unit/test_logging.ini
new file mode 100644 (file)
index 0000000..3d5b947
--- /dev/null
@@ -0,0 +1,27 @@
+[loggers]\r
+keys=root,functest_logger\r
+\r
+[logger_root]\r
+level=DEBUG\r
+handlers=console\r
+\r
+[logger_functest_logger]\r
+level=DEBUG\r
+handlers=console\r
+qualname=functest.utils.functest_logger\r
+propagate=0\r
+\r
+[handlers]\r
+keys=console\r
+\r
+[handler_console]\r
+class=StreamHandler\r
+level=INFO\r
+formatter=standard\r
+args=(sys.stdout,)\r
+\r
+[formatters]\r
+keys=standard\r
+\r
+[formatter_standard]\r
+format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
\ No newline at end of file
index c4b5666..ce9086a 100644 (file)
@@ -18,7 +18,6 @@ import mock
 import requests
 
 from functest.tests.unit import test_utils
-mock.patch('logging.FileHandler').start()  # noqa
 from functest.utils import functest_utils
 
 
old mode 100644 (file)
new mode 100755 (executable)
index c0fba08..f09f56b
 #  logger = fl.Logger("script_name").getLogger()
 #  logger.info("message to be shown with - INFO - ")
 #  logger.debug("message to be shown with - DEBUG -")
-
 import logging
+import logging.config
 import os
 
+import json
 
-class Logger:
-    def __init__(self, logger_name):
+from functest.utils.constants import CONST
+
+logger = logging.getLogger(__name__)
+
+
+def is_debug():
+    if CONST.CI_DEBUG and CONST.CI_DEBUG.lower() == "true":
+        return True
+    return False
 
-        CI_DEBUG = os.getenv('CI_DEBUG')
 
+def setup_logging(default_path=CONST.dir_functest_logging_cfg,
+                  default_level=logging.INFO,
+                  env_key='LOG_CFG'):
+    path = default_path
+    value = os.getenv(env_key, None)
+    if value:
+        path = value
+    if os.path.exists(path):
+        with open(path, 'rt') as f:
+            config = json.load(f)
+            if (config['handlers'] and
+                    config['handlers']['console']):
+                stream_level = logging.INFO
+                if is_debug():
+                    stream_level = logging.DEBUG
+                config['handlers']['console']['level'] = stream_level
+            logging.config.dictConfig(config)
+    else:
+        logging.basicConfig(level=default_level)
+
+
+setup_logging()
+
+
+class Logger:
+    def __init__(self, logger_name):
         self.logger = logging.getLogger(logger_name)
-        self.logger.propagate = 0
-        self.logger.setLevel(logging.DEBUG)
-
-        ch = logging.StreamHandler()
-        formatter = logging.Formatter('%(asctime)s - %(name)s - '
-                                      '%(levelname)s - %(message)s')
-        ch.setFormatter(formatter)
-        if CI_DEBUG is not None and CI_DEBUG.lower() == "true":
-            ch.setLevel(logging.DEBUG)
-            self.logger.parent.level = logging.DEBUG
-        else:
-            ch.setLevel(logging.INFO)
-            self.logger.parent.level = logging.INFO
-        self.logger.addHandler(ch)
-
-        hdlr = logging.FileHandler('/home/opnfv/functest/results/functest.log')
-        hdlr.setFormatter(formatter)
-        hdlr.setLevel(logging.DEBUG)
-        self.logger.addHandler(hdlr)
 
     def getLogger(self):
         return self.logger
index 79d05d3..5167d78 100755 (executable)
@@ -38,6 +38,7 @@ nosetests --with-xunit \
          --cover-package=functest.utils \
          --cover-xml \
          --cover-html \
+         --log-config=$(pwd)/functest/tests/unit/test_logging.ini \
          functest/tests/unit
 rc=$?