summaryrefslogtreecommitdiffstats
path: root/pylog/onaplogging/markerFormatter.py
diff options
context:
space:
mode:
authorliangke <lokyse@163.com>2018-09-06 15:37:38 +0800
committerliangke <lokyse@163.com>2018-09-06 16:05:39 +0800
commita350ca2b4995df6d75c9021dd537589896dccff6 (patch)
treecfc501c24990e51a8f18823681ae962c3f9ad464 /pylog/onaplogging/markerFormatter.py
parent0303dc6e5210eee33de05a087a8ea40e80d43fb9 (diff)
Support Marker in python logging
1 Add 'Marker' feature which carry extra contextual information for loggers, can be used to mark a single log statement 2 Make MDC Formatter have "marker" label. Change-Id: I21ac547b97c49190393d57ff290dcbc3ae20da2a Issue-ID: MULTICLOUD-328 Signed-off-by: liangke <lokyse@163.com>
Diffstat (limited to 'pylog/onaplogging/markerFormatter.py')
-rw-r--r--pylog/onaplogging/markerFormatter.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/pylog/onaplogging/markerFormatter.py b/pylog/onaplogging/markerFormatter.py
new file mode 100644
index 0000000..f33bfc2
--- /dev/null
+++ b/pylog/onaplogging/markerFormatter.py
@@ -0,0 +1,72 @@
+# Copyright 2018 ke liang <lokyse@163.com>.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# 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 sys
+import logging
+from marker import MARKER_TAG
+from marker import Marker
+
+
+class MarkerFormatter(logging.Formatter):
+
+ def __init__(self, fmt=None, datefmt=None, style='%'):
+
+ if sys.version_info > (3, 2):
+ super(MarkerFormatter, self).__init__(
+ fmt=fmt, datefmt=datefmt, style=style)
+ elif sys.version_info > (2, 7):
+ super(MarkerFormatter, self).__init__(
+ fmt=fmt, datefmt=datefmt)
+ else:
+ logging.Formatter.__init__(self, fmt, datefmt)
+
+ self.style = style
+ self._marker_tag = "%(marker)s"
+
+ if sys.version_info > (3, 2):
+ if self.style not in logging._STYLES:
+ raise ValueError('Style must be one of: %s' %
+ ','.join(logging._STYLES.keys()))
+ if self.style == "{":
+ self._marker_tag = "{marker}"
+ elif self.style == "$":
+ self._marker_tag = "${marker}"
+
+ self._tmpFmt = self._fmt
+
+ def format(self, record):
+
+ try:
+ if self._fmt.find(self._marker_tag) != -1 \
+ and hasattr(record, MARKER_TAG):
+ marker = getattr(record, MARKER_TAG)
+
+ if isinstance(marker, Marker):
+ self._fmt = self._fmt.replace(
+ self._marker_tag, marker.getName())
+ elif self._fmt.find(self._marker_tag) != -1 \
+ and not hasattr(record, MARKER_TAG):
+
+ self._fmt = self._fmt.replace(self._marker_tag, "")
+
+ if sys.version_info > (3, 2):
+ self._style = logging._STYLES[self.style][0](self._fmt)
+
+ if sys.version_info > (2, 7):
+ return super(MarkerFormatter, self).format(record)
+ else:
+ return logging.Formatter.format(self, record)
+
+ finally:
+ self._fmt = self._tmpFmt