Init commit for standalone enodebd

Change-Id: I88eeef5135dd7ba8551ddd9fb6a0695f5325337b
diff --git a/logger.py b/logger.py
new file mode 100644
index 0000000..d0b67ca
--- /dev/null
+++ b/logger.py
@@ -0,0 +1,78 @@
+"""
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+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 logging
+from logging.handlers import RotatingFileHandler
+
+LOG_FILE = './enodebd.log'
+MAX_BYTES = 1024 * 1024 * 10  # 10MB
+BACKUP_COUNT = 5  # 10MB, 5 files, 50MB total
+
+
+class EnodebdLogger:
+    """
+    EnodebdLogger backs up debug logs with a RotatingFileHandler.
+
+    Debug logs will be propagated to root level if the root logger is set to
+    debug level.
+    """
+
+    _LOGGER = logging.getLogger(__name__)  # type: logging.Logger
+
+    @staticmethod
+    def init() -> None:
+        if logging.root.level is not logging.DEBUG:
+            EnodebdLogger._LOGGER.propagate = False
+        handler = RotatingFileHandler(
+            LOG_FILE,
+            maxBytes=MAX_BYTES,
+            backupCount=BACKUP_COUNT,
+        )
+        formatter = logging.Formatter(fmt='%(asctime)s %(levelname)s %(message)s')
+        handler.setFormatter(formatter)
+        EnodebdLogger._LOGGER.addHandler(handler)
+        EnodebdLogger._LOGGER.setLevel(logging.DEBUG)
+
+    @staticmethod
+    def debug(msg, *args, **kwargs):
+        EnodebdLogger._LOGGER.debug(msg, *args, **kwargs)
+
+    @staticmethod
+    def info(msg, *args, **kwargs):
+        if not EnodebdLogger._LOGGER.propagate:
+            logging.info(msg, *args, **kwargs)
+        EnodebdLogger._LOGGER.info(msg, *args, **kwargs)
+
+    @staticmethod
+    def warning(msg, *args, **kwargs):
+        if not EnodebdLogger._LOGGER.propagate:
+            logging.warning(msg, *args, **kwargs)
+        EnodebdLogger._LOGGER.warning(msg, *args, **kwargs)
+
+    @staticmethod
+    def error(msg, *args, **kwargs):
+        if not EnodebdLogger._LOGGER.propagate:
+            logging.error(msg, *args, **kwargs)
+        EnodebdLogger._LOGGER.error(msg, *args, **kwargs)
+
+    @staticmethod
+    def exception(msg, *args, **kwargs):
+        if not EnodebdLogger._LOGGER.propagate:
+            logging.exception(msg, *args, **kwargs)
+        EnodebdLogger._LOGGER.exception(msg, *args, **kwargs)
+
+    @staticmethod
+    def critical(msg, *args, **kwargs):
+        if not EnodebdLogger._LOGGER.propagate:
+            logging.critical(msg, *args, **kwargs)
+        EnodebdLogger._LOGGER.critical(msg, *args, **kwargs)