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/marker.py | 142 +++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 pylog/onaplogging/marker/marker.py (limited to 'pylog/onaplogging/marker/marker.py') diff --git a/pylog/onaplogging/marker/marker.py b/pylog/onaplogging/marker/marker.py new file mode 100644 index 0000000..5414e21 --- /dev/null +++ b/pylog/onaplogging/marker/marker.py @@ -0,0 +1,142 @@ +# 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 + +MARKER_TAG = "marker" + + +class Marker(object): + + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def getName(self): + raise NotImplementedError() + + @abc.abstractmethod + def contains(self, item=None): + raise NotImplementedError() + + @abc.abstractmethod + def addChild(self, item): + raise NotImplementedError() + + @abc.abstractmethod + def removeChild(self, item): + raise NotImplementedError() + + @abc.abstractmethod + def __eq__(self, other): + raise NotImplementedError() + + @abc.abstractmethod + def __hash__(self): + raise NotImplementedError() + + @abc.abstractmethod + def __iter__(self): + raise NotImplementedError() + + +class BaseMarker(Marker): + + def __init__(self, name): + super(BaseMarker, self).__init__() + if not isinstance(name, str): + raise TypeError("not str type") + if name == "": + raise ValueError("empty value") + self.__name = name + self.__childs = [] + + def getName(self): + return self.__name + + def __iter__(self): + return iter(self.__childs) + + def __eq__(self, other): + + if not isinstance(other, Marker): + return False + if id(self) == id(other): + return True + + return self.__name == other.getName() + + def __hash__(self): + return hash(self.__name) + + def contains(self, item=None): + + if isinstance(item, Marker): + if item == self: + return True + return len(list(filter( + lambda x: x == item, self.__childs))) > 0 + + elif isinstance(item, str): + if item == self.__name: + return True + + return len(list(filter( + lambda x: x.__name == item, self.__childs))) > 0 + + return False + + def addChild(self, item): + if not isinstance(item, Marker): + raise TypeError("can only add (not %s) marker type" + % type(item)) + if self == item: + return + if item not in self.__childs: + self.__childs.append(item) + + def addChilds(self, childs): + try: + iter(childs) + except Exception as e: + raise e + + for item in childs: + self.addChild(item) + + def removeChild(self, item): + if not isinstance(item, Marker): + raise TypeError("can only add (not %s) marker type" + % type(item)) + if item in self.__childs: + self.__childs.remove(item) + + +def matchMarkerHelp(record, markerToMatch): + + marker = getattr(record, MARKER_TAG, None) + + if marker is None or markerToMatch is None: + return False + + if not isinstance(marker, Marker): + return False + + try: + if isinstance(markerToMatch, list): + return len(list(filter( + lambda x: marker.contains(x), markerToMatch))) > 0 + + return marker.contains(markerToMatch) + except Exception as e: + raise e -- cgit 1.2.3-korg