Source code for jube2.result_types.syslog

# JUBE Benchmarking Environment
# Copyright (C) 2008-2024
# Forschungszentrum Juelich GmbH, Juelich Supercomputing Centre
# http://www.fz-juelich.de/jsc/jube
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""Syslogtype definition"""

from __future__ import (print_function,
                        unicode_literals,
                        division)

from jube2.result_types.keyvaluesresult import KeyValuesResult
from jube2.result import Result
import xml.etree.ElementTree as ET
import jube2.log
import jube2.conf
import logging.handlers

LOGGER = jube2.log.get_logger(__name__)


[docs]class SysloggedResult(KeyValuesResult): """A result that gets sent to syslog."""
[docs] class SyslogData(KeyValuesResult.KeyValuesData): """Syslog data""" def __init__(self, name_or_other, syslog_address=None, syslog_host=None, syslog_port=None, syslog_fmt_string=None): if type(name_or_other) is KeyValuesResult.KeyValuesData: self._name = name_or_other.name self._keys = name_or_other.keys self._data = name_or_other.data self._benchmark_ids = name_or_other.benchmark_ids else: KeyValuesResult.KeyValuesData.__init__(self, name_or_other) self._syslog_address = syslog_address self._syslog_host = syslog_host self._syslog_port = syslog_port self._syslog_fmt_string = syslog_fmt_string
[docs] def create_result(self, show=True, filename=None, **kwargs): """Create result output""" # If there are multiple benchmarks, add benchmark id information if len(set(self._benchmark_ids)) > 1: self.add_id_information(reverse=kwargs.get("reverse", False)) if self._syslog_address is not None: address = self._syslog_address else: address = (self._syslog_host, self._syslog_port) handler = logging.handlers.SysLogHandler( address=address, facility=logging.handlers.SysLogHandler.LOG_USER ) handler.setFormatter(logging.Formatter( fmt=self._syslog_fmt_string)) # get logger log = logging.getLogger("jube") log.setLevel(logging.INFO) log.addHandler(handler) # create log output for dataset in self.data: entry = list() for i, key in enumerate(self.keys): entry.append("{0}={1}".format(key.name, dataset[i])) # Log result if show: if not jube2.conf.DEBUG_MODE: log.info(" ".join(entry)) LOGGER.debug("Logged: {0}\n".format(" ".join(entry))) # remove handler to avoid double logging log.removeHandler(handler)
def __init__(self, name, syslog_address=None, syslog_host=None, syslog_port=None, syslog_fmt_string=None, sort_names=None, res_filter=None): KeyValuesResult.__init__(self, name, sort_names, res_filter) if (syslog_address is None) and (syslog_host is None) and \ (syslog_port is None): raise IOError("Neither a syslog address nor a hostname port " + "combination specified.") if (syslog_host is not None) and (syslog_address is not None): raise IOError("Please specify a syslog address or a hostname, " + "not both at the same time.") if (syslog_host is not None) and (syslog_port is None): self._syslog_port = 514 self._syslog_address = syslog_address self._syslog_host = syslog_host self._syslog_port = syslog_port if syslog_fmt_string is None: self._syslog_fmt_string = jube2.conf.SYSLOG_FMT_STRING else: self._syslog_fmt_string = syslog_fmt_string
[docs] def create_result_data(self, style=None, select=None, exclude=None): """Create result data""" result_data = KeyValuesResult.create_result_data(self, select, exclude) return SysloggedResult.SyslogData(result_data, self._syslog_address, self._syslog_host, self._syslog_port, self._syslog_fmt_string)
[docs] def etree_repr(self): """Return etree object representation""" result_etree = Result.etree_repr(self) syslog_etree = ET.SubElement(result_etree, "syslog") syslog_etree.attrib["name"] = self._name if self._syslog_address is not None: syslog_etree.attrib["address"] = self._syslog_address if self._syslog_host is not None: syslog_etree.attrib["host"] = self._syslog_host if self._syslog_port is not None: syslog_etree.attrib["port"] = self._syslog_port if self._syslog_fmt_string is not None: syslog_etree.attrib["format"] = self._syslog_fmt_string if self._res_filter is not None: syslog_etree.attrib["filter"] = self._res_filter if len(self._sort_names) > 0: syslog_etree.attrib["sort"] = \ jube2.conf.DEFAULT_SEPARATOR.join(self._sort_names) for key in self._keys: syslog_etree.append(key.etree_repr()) return result_etree