diff options
Diffstat (limited to 'pylog/onaplogging/marker')
-rw-r--r-- | pylog/onaplogging/marker/__init__.py | 27 | ||||
-rw-r--r-- | pylog/onaplogging/marker/marker.py | 142 | ||||
-rw-r--r-- | pylog/onaplogging/marker/markerFactory.py | 74 | ||||
-rw-r--r-- | pylog/onaplogging/marker/markerFilter.py | 32 | ||||
-rw-r--r-- | pylog/onaplogging/marker/markerHandler.py | 51 |
5 files changed, 326 insertions, 0 deletions
diff --git a/pylog/onaplogging/marker/__init__.py b/pylog/onaplogging/marker/__init__.py new file mode 100644 index 0000000..a1b3d89 --- /dev/null +++ b/pylog/onaplogging/marker/__init__.py @@ -0,0 +1,27 @@ +# 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. + +from __future__ import absolute_import + +from marker.marker import ( + Marker, MARKER_TAG, + BaseMarker, matchMarkerHelp) + +from marker.markerFactory import MarkerFactory +from marker.markerHandler import MarkerNotifyHandler +from marker.markerFilter import MarkerFilter + +__all__ = ("Marker", "MARKER_TAG", "BaseMarker", + "matchMarkerHelp", "MarkerFactory", + "MarkerNotifyHandler", "MarkerFilter") 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 <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 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 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 <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 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 diff --git a/pylog/onaplogging/marker/markerFilter.py b/pylog/onaplogging/marker/markerFilter.py new file mode 100644 index 0000000..4ae5478 --- /dev/null +++ b/pylog/onaplogging/marker/markerFilter.py @@ -0,0 +1,32 @@ +# 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 +from logging import Filter +from marker import matchMarkerHelp + + +class MarkerFilter(Filter): + + def __init__(self, name="", markers=None): + if sys.version_info > (2, 7): + super(MarkerFilter, self).__init__(name) + else: + Filter.__init__(self, name) + + self.markerToMatch = markers + + def filter(self, record): + # compare filter's markers with record's marker + return matchMarkerHelp(record, self.markerToMatch) diff --git a/pylog/onaplogging/marker/markerHandler.py b/pylog/onaplogging/marker/markerHandler.py new file mode 100644 index 0000000..ca5f483 --- /dev/null +++ b/pylog/onaplogging/marker/markerHandler.py @@ -0,0 +1,51 @@ +# 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 +from logging.handlers import SMTPHandler +from marker import matchMarkerHelp + + +class MarkerNotifyHandler(SMTPHandler): + + def __init__(self, mailhost, fromaddr, toaddrs, subject, + credentials=None, secure=None, timeout=5.0, markers=None): + + if sys.version_info > (3, 2): + super(MarkerNotifyHandler, self).__init__( + mailhost, fromaddr, toaddrs, subject, + credentials, secure, timeout) + elif sys.version_info > (2, 7): + super(MarkerNotifyHandler, self).__init__( + mailhost, fromaddr, toaddrs, subject, + credentials, secure) + else: + SMTPHandler.__init__(self, + mailhost, fromaddr, toaddrs, subject, + credentials, secure) + + self.markers = markers + + def handle(self, record): + + if self.markers is None: + return False + + if matchMarkerHelp(record, self.markers): + if sys.version_info > (2, 7): + return super(SMTPHandler, self).handle(record) + else: + return SMTPHandler.handle(self, record) + + return False |