From a350ca2b4995df6d75c9021dd537589896dccff6 Mon Sep 17 00:00:00 2001 From: liangke Date: Thu, 6 Sep 2018 15:37:38 +0800 Subject: 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 --- pylog/onaplogging/marker/markerFactory.py | 74 +++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 pylog/onaplogging/marker/markerFactory.py (limited to 'pylog/onaplogging/marker/markerFactory.py') diff --git a/pylog/onaplogging/marker/markerFactory.py b/pylog/onaplogging/marker/markerFactory.py new file mode 100644 index 0000000..deb9566 --- /dev/null +++ b/pylog/onaplogging/marker/markerFactory.py @@ -0,0 +1,74 @@ +# Copyright 2018 ke liang . +# +# 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 abc +import threading +from marker import BaseMarker + +lock = threading.RLock() + + +class IMarkerFactory(object): + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def getMarker(self, marker_name=None): + raise NotImplementedError() + + @abc.abstractmethod + def deleteMarker(self, marker_name=None): + raise NotImplementedError() + + @abc.abstractmethod + def exist(self, marker_name=None): + raise NotImplementedError() + + +class MarkerFactory(IMarkerFactory): + + _instance = None + _marker_map = {} + + def __new__(cls, *args, **kwargs): + + if cls._instance is None: + cls._instance = super(MarkerFactory, cls).__new__(cls) + + return cls._instance + + def getMarker(self, marker_name=None): + if marker_name is None: + raise ValueError("not empty") + + marker = self._marker_map.get(marker_name, None) + if marker is None: + lock.acquire() + marker = BaseMarker(name=marker_name) + self._marker_map[marker_name] = marker + lock.release() + + return marker + + def deleteMarker(self, marker_name=None): + lock.acquire() + if self.exist(marker_name): + del self._marker_map[marker_name] + return True + lock.release() + return False + + def exist(self, marker_name=None): + + return self._marker_map.get( + marker_name, None) is not None -- cgit 1.2.3-korg