diff --git a/sandbox/logging/CentralLogger.py b/sandbox/logging/CentralLogger.py new file mode 100644 index 0000000000000000000000000000000000000000..adb396ea3c7bb029ba8033ad00253ef11bc598ad --- /dev/null +++ b/sandbox/logging/CentralLogger.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""CentralLogger device server receiving logs from SendingDS server""" +import sys +import time +import logging +from PyTango import server, DeviceProxy, Database, DbDevInfo, DevState, DebugIt, AttrQuality, AttrWriteType, DispLevel +from PyTango.server import Device, DeviceMeta, attribute, command, run, device_property + + +"""CentralLogger device server class""" +class CentralLogger(Device): + __metaclass__ = DeviceMeta + + def init_device(self): + Device.init_device(self) + self.set_state(DevState.STANDBY) + self.info_stream("Init CentralLogger Device.") + + @command(dtype_in='DevVarLongStringArray', dtype_out=None) + def SetCentralLoggingLevel(self, element_devices_and_levels): + CentralLoggingLevel = element_devices_and_levels[0][:] + CentralLoggingDevice = element_devices_and_levels[1][:] + i = 0 + while i < len(CentralLoggingLevel[:]): + self.info_stream("%s,%s", CentralLoggingLevel[i], CentralLoggingDevice[i]) + dev1 = DeviceProxy(CentralLoggingDevice[i]) + dev1.centralLoggingLevel = CentralLoggingLevel[i] + property_names = ["logging_level", + "logging_target", + ] + dev_properties = dev1.get_property(property_names) + dev_properties["logging_level"] = ["DEBUG"] + dev_properties["logging_target"].append("device::central/cdev/cdev1") + dev1.put_property(dev_properties) + dev1.add_logging_target("device::central/cdev/cdev1") + i+=1 + + """Logs are received from all element devices at all levels. + Filtering happens within the log function depending upon + CentralLoggingLevel of each element device. + NOTE : This fiteration logic is still under consideration.""" + @command(dtype_in='DevVarStringArray', dtype_out=None) + def log(self, details): + cmessage = details[3] + clevel = details[1] + tango_log_level = {"FATAL": 1, "ERROR": 2, "WARN": 3, "INFO": 4, "DEBUG": 5} + level_number = tango_log_level[clevel] + clogsource = details[2] + if clogsource == details[2]: + device = DeviceProxy(clogsource) + deviceLogLevel = device.centralLoggingLevel + + if clevel == "FATAL" and level_number <= deviceLogLevel: + self.fatal_stream("%s : %s", clogsource, cmessage) + elif clevel == "ERROR" and level_number <= deviceLogLevel: + self.error_stream("%s : %s", clogsource, cmessage) + elif clevel == "WARN" and level_number <= deviceLogLevel: + self.warn_stream("%s : %s", clogsource, cmessage) + elif clevel == "INFO" and level_number <= deviceLogLevel: + self.info_stream("%s : %s", clogsource, cmessage) + elif clevel == "DEBUG" and level_number <= deviceLogLevel: + self.debug_stream("%s : %s", clogsource, cmessage) + else: + pass + else: + pass + +run((CentralLogger,)) diff --git a/sandbox/logging/ElementLogger.py b/sandbox/logging/ElementLogger.py new file mode 100644 index 0000000000000000000000000000000000000000..3d638533bde3468a362da852e97a01835a1a0f91 --- /dev/null +++ b/sandbox/logging/ElementLogger.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""ElementLogger device server receiving logs from another device server""" +import sys +import time +import logging +from PyTango import server, DeviceProxy, Database, DbDevInfo, DevState, DebugIt, AttrQuality, AttrWriteType, DispLevel +from PyTango.server import Device, DeviceMeta, attribute, command, run, device_property + + +"""ElementLogger device server class""" +class ElementLogger(Device): + __metaclass__ = DeviceMeta + + def init_device(self): + Device.init_device(self) + self.__StorageLoggingLevel = 5 #Storage logging level for ElementLogger(Unused currently) + self.__ElementLoggingLevel = 5 #Element logging level for all Element devices(Unused currently) + self.set_state(DevState.STANDBY) + self.info_stream("Init ElementLogger Device.") + + @command(dtype_in='DevVarLongStringArray', dtype_out=None) + def SetStorageLoggingLevel(self, storages): + StorageLoggingLevel = storages[0][:] + StorageLoggingDevice = storages[1][:] + i = 0 + while i < len(StorageLoggingLevel[:]): + self.info_stream("%s,%s", StorageLoggingLevel[i], StorageLoggingDevice[i]) + dev1 = DeviceProxy(StorageLoggingDevice[i]) + dev1.storageLoggingLevel = StorageLoggingLevel[i] + i+=1 + + @command(dtype_in='DevVarLongStringArray', dtype_out=None) + def SetElementLoggingLevel(self, element_devices_and_levels): + ElementLoggingLevel = element_devices_and_levels[0][:] + ElementLoggingDevice = element_devices_and_levels[1][:] + i = 0 + while i < len(ElementLoggingLevel[:]): + self.info_stream("%s,%s", ElementLoggingLevel[i], ElementLoggingDevice[i]) + dev1 = DeviceProxy(ElementLoggingDevice[i]) + dev1.elementLoggingLevel = ElementLoggingLevel[i] + property_names = ["logging_level", + "logging_target", + ] + dev_properties = dev1.get_property(property_names) + dev_properties["logging_level"] = ["DEBUG"] + dev_properties["logging_target"].append("device::ellogger/elem/elem1") + dev1.put_property(dev_properties) + dev1.add_logging_target("device::ellogger/elem/elem1") + i+=1 + + """Logs are received from all element devices at all levels. + Filtering happens within the log function depending upon + ElementLoggingLevel of each element device. + NOTE : This fiteration logic is still under consideration.""" + @command(dtype_in='DevVarStringArray', dtype_out=None) + def log(self, details): + message = details[3] + level = details[1] + tango_log_level = {"FATAL": 1, "ERROR": 2, "WARN": 3, "INFO": 4, "DEBUG": 5} + level_number = tango_log_level[level] + logsource = details[2] + if logsource == details[2]: + device = DeviceProxy(logsource) + deviceLogLevel = device.elementLoggingLevel + if level == "FATAL" and level_number <= deviceLogLevel: + self.fatal_stream("%s : %s", logsource, message) + elif level == "ERROR" and level_number <= deviceLogLevel: + self.error_stream("%s : %s", logsource, message) + elif level == "WARN" and level_number <= deviceLogLevel: + self.warn_stream("%s : %s", logsource, message) + elif level == "INFO" and level_number <= deviceLogLevel: + self.info_stream("%s : %s", logsource, message) + elif level == "DEBUG" and level_number <= deviceLogLevel: + self.debug_stream("%s : %s", logsource, message) + else: + pass + else: + pass + +run((ElementLogger,)) diff --git a/sandbox/logging/Sending.py b/sandbox/logging/Sending.py new file mode 100644 index 0000000000000000000000000000000000000000..624245b60d8f47b70f189eab3ed0761b4c84a28c --- /dev/null +++ b/sandbox/logging/Sending.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Sending Device server which is logged by ElementLogger and CentralLogger""" +import sys +import time +import logging +import logging.handlers +import syslog +from logging.handlers import SysLogHandler +from PyTango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt, Database, DbDevInfo, DeviceProxy +from PyTango.server import Device, DeviceMeta, attribute, command, run, device_property + +logger = logging.getLogger("Sending") +syslog = SysLogHandler(address='/dev/log', facility='user') +formatter = logging.Formatter('%(name)s: %(levelname)s %(module)s %(message)r') +syslog.setFormatter(formatter) +logger.addHandler(syslog) + +"""Sending Device server class""" +class Sending(Device): + __metaclass__ = DeviceMeta + + """Attributes for setting logging levels for element storage and central""" + elementLoggingLevel = attribute(label="ElementLogginglevel", dtype=int, + fget="get_elementLoggingLevel", + fset="set_elementLoggingLevel", + doc="Sets element logging level") + + storageLoggingLevel = attribute(label="StorgeLoggingLevel", dtype=int, + fget="get_storageLoggingLevel", + fset="set_storageLoggingLevel", + doc="Sets syslog logging level") + + centralLoggingLevel = attribute(label="CentralLoggingLevel", dtype=int, + fget="get_centralLoggingLevel", + fset="set_centralLoggingLevel", + doc="Sets Central logging level") + + def init_device(self): + Device.init_device(self) + self.set_state(DevState.STANDBY) + self.__elementLoggingLevel = 5 + self.__storageLoggingLevel = 5 + self.__centralLoggingLevel = 5 + logger.setLevel(logging.DEBUG) + + def get_elementLoggingLevel(self): + return self.__elementLoggingLevel + + def set_elementLoggingLevel(self, elementLoggingLevel): + self.__elementLoggingLevel = elementLoggingLevel + return elementLoggingLevel + + def get_centralLoggingLevel(self): + return self.__centralLoggingLevel + + def set_centralLoggingLevel(self, centralLoggingLevel): + self.__centralLoggingLevel = centralLoggingLevel + return centralLoggingLevel + + def get_storageLoggingLevel(self): + return self.__storageLoggingLevel + + def set_storageLoggingLevel(self, storageLoggingLevel): + self.debug_stream("In set_StorageLogginglevel") + self.__storageLoggingLevel = storageLoggingLevel + + if self.__storageLoggingLevel == 1: + logger.setLevel(logging.FATAL) + elif self.__storageLoggingLevel == 2: + logger.setLevel(logging.ERROR) + elif self.__storageLoggingLevel == 3: + logger.setLevel(logging.WARNING) + elif self.__storageLoggingLevel == 4: + logger.setLevel(logging.INFO) + elif self.__storageLoggingLevel == 5: + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.DEBUG) + return storageLoggingLevel + + @command + def TurnOn(self): + # turn on the sending device. + self.set_state(DevState.ON) + self.debug_stream("TurnOn Sending DEBUG") + self.info_stream("TurnOn Sending INFO") + self.warn_stream("TurnOn Sending WARNING") + self.error_stream("TurnOn Sending ERROR") + self.fatal_stream("TurnOn Sending FATAL") + + logger.debug("TurnOn Sending debug") + logger.info("TurnOn Sending info") + logger.warning("TurnOn Sending warn") + logger.error("TurnOn Sending error") + logger.fatal("TurnOn Sending fatal") + + @command + def TurnOff(self): + # turn off the sending device + self.set_state(DevState.OFF) + self.debug_stream("TurnOff Sending DEBUG") + self.info_stream("TurnOff Sending INFO") + self.warn_stream("TurnOff Sending WARNING") + self.error_stream("TurnOff Sending ERROR") + self.fatal_stream("TurnOff Sending FATAL") + + logger.debug("TurnOff Sending debug") + logger.info("TurnOff Sending info") + logger.warning("TurnOff Sending warn") + logger.error("TurnOff Sending error") + logger.fatal("TurnOff Sending fatal") + +run([Sending]) diff --git a/sandbox/logging/Verification.pdf b/sandbox/logging/Verification.pdf new file mode 100644 index 0000000000000000000000000000000000000000..23d3739ab7b91eac35de7e37b19f71986c1b685f Binary files /dev/null and b/sandbox/logging/Verification.pdf differ