# -*- coding: utf-8 -*-
#
# This file is part of the SKALogger project
#
#
#
"""
This module implements SKALogger device, a generic base device for
logging for SKA. It enables to view on-line logs through the TANGO
Logging Services and to store logs using Python logging. It configures
the log levels of remote logging for selected devices.
"""
# PROTECTED REGION ID(SKALogger.additionnal_import) ENABLED START #
# Tango imports
from tango import DebugIt, DeviceProxy, DevFailed
from tango.server import run, command
# SKA specific imports
from ska_tango_base import SKABaseDevice
from ska_tango_base.commands import ResponseCommand, ResultCode
from ska_tango_base.control_model import LoggingLevel
# PROTECTED REGION END # // SKALogger.additionnal_import
__all__ = ["SKALogger", "main"]
[docs]class SKALogger(SKABaseDevice):
"""
A generic base device for Logging for SKA.
"""
# PROTECTED REGION ID(SKALogger.class_variable) ENABLED START #
# PROTECTED REGION END # // SKALogger.class_variable
# -----------------
# Device Properties
# -----------------
# ----------
# Attributes
# ----------
# ---------------
# General methods
# ---------------
[docs] def init_command_objects(self):
"""
Sets up the command objects
"""
super().init_command_objects()
self.register_command_object(
"SetLoggingLevel",
self.SetLoggingLevelCommand(self, self.state_model, self.logger)
)
[docs] def always_executed_hook(self):
# PROTECTED REGION ID(SKALogger.always_executed_hook) ENABLED START #
pass
# PROTECTED REGION END # // SKALogger.always_executed_hook
[docs] def delete_device(self):
# PROTECTED REGION ID(SKALogger.delete_device) ENABLED START #
pass
# PROTECTED REGION END # // SKALogger.delete_device
# ------------------
# Attributes methods
# ------------------
# --------
# Commands
# --------
[docs] class SetLoggingLevelCommand(ResponseCommand):
"""
A class for the SKALoggerDevice's SetLoggingLevel() command.
"""
def __init__(self, target, state_model, logger=None):
"""
Constructor for SetLoggingLevelCommand
:param target: the object that this command acts upon; for
example, the SKASubarray device for which this class
implements the command
:type target: object
:param state_model: the state model that this command uses
to check that it is allowed to run, and that it drives
with actions.
:type state_model: SKABaseClassStateModel or a subclass of
same
:param logger: the logger to be used by this Command. If not
provided, then a default module logger will be used.
:type logger: a logger that implements the standard library
logger interface
"""
super().__init__(target, state_model, logger=logger)
[docs] def do(self, argin):
"""
Stateless hook for SetLoggingLevel() command functionality.
:return: A tuple containing a return code and a string
message indicating status. The message is for
information purpose only.
:rtype: (ResultCode, str)
"""
logging_levels = argin[0][:]
logging_devices = argin[1][:]
for level, device in zip(logging_levels, logging_devices):
try:
new_level = LoggingLevel(level)
self.logger.info("Setting logging level %s for %s", new_level, device)
dev_proxy = DeviceProxy(device)
dev_proxy.loggingLevel = new_level
except DevFailed:
self.logger.exception(
"Failed to set logging level %s for %s", level, device)
message = "SetLoggingLevel command completed OK"
self.logger.info(message)
return (ResultCode.OK, message)
[docs] @command(
dtype_in='DevVarLongStringArray',
doc_in="Logging level for selected devices:"
"(0=OFF, 1=FATAL, 2=ERROR, 3=WARNING, 4=INFO, 5=DEBUG)."
"Example: [[4, 5], ['my/dev/1', 'my/dev/2']].",
dtype_out='DevVarLongStringArray',
doc_out="(ReturnType, 'informational message')",
)
@DebugIt()
def SetLoggingLevel(self, argin):
# PROTECTED REGION ID(SKALogger.SetLoggingLevel) ENABLED START #
"""
Sets logging level of the specified devices.
To modify behaviour for this command, modify the do() method of
the command class.
:param argin: Array consisting of
* argin[0]: list of DevLong. Desired logging level.
* argin[1]: list of DevString. Desired tango device.
:type argin: :py:class:`tango.DevVarLongStringArray`
:returns: None.
"""
command = self.get_command_object("SetLoggingLevel")
(return_code, message) = command(argin)
return [[return_code], [message]]
# PROTECTED REGION END # // SKALogger.SetLoggingLevel
# ----------
# Run server
# ----------
def main(args=None, **kwargs):
# PROTECTED REGION ID(SKALogger.main) ENABLED START #
"""
Main entry point of the module.
"""
return run((SKALogger,), args=args, **kwargs)
# PROTECTED REGION END # // SKALogger.main
if __name__ == '__main__':
main()