# Copyright 2019 Nokia # # 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 import logging import logging.handlers from dss.api import dss_error class Logger: levels = {'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.error} DEST_CONSOLE = 1 DEST_SYSLOG = 2 dests = {'console': DEST_CONSOLE, 'syslog': DEST_SYSLOG} def __init__(self, dest, verbose, level): self.verbose = verbose self.dest = Logger.str_to_dest(dest) self.level = Logger.str_to_level(level) self.init() def init(self): args = {} if self.level not in Logger.levels.values(): raise dss_error.Error('Invalid level value, possible values are %s' % str(Logger.levels)) if self.dest not in Logger.dests.values(): raise dss_error.Error('Invalid destination value, possible values are %s' % str(Logger.dests)) if self.verbose: if self.dest is Logger.DEST_CONSOLE: args['format'] = '[%(asctime)s %(levelname)7s %(module)s(%(lineno)3s)] %(message)s' else: args['format'] = '[%(module)s(%(lineno)3s)] %(message)s' else: args['format'] = '%(message)s' if self.dest is Logger.DEST_CONSOLE: args['stream'] = sys.stdout elif self.dest is Logger.DEST_SYSLOG: logging.getLogger('').addHandler(logging.handlers.SysLogHandler(address='/dev/log')) args['level'] = self.level logging.basicConfig(**args) def set_level(self, level): self.level = Logger.str_to_level(level) self.init() def set_dest(self, dest): self.dest = Logger.str_to_dest(dest) self.init() @staticmethod def str_to_level(level): ret = None try: ret = Logger.levels[level] except KeyError as exp: raise dss_error.Error('Invalid log level, possible values %s' % str(Logger.levels.keys())) return ret @staticmethod def str_to_dest(dest): ret = None try: ret = Logger.dests[dest] except KeyError as exp: raise dss_error.Error('Invalid destination, possible values %s' % str(Logger.dests.keys())) return ret @staticmethod def level_to_str(level): for key, value in Logger.levels.iteritems(): if value is level: return key return None @staticmethod def dest_to_str(dest): for key, value in Logger.dests.iteritems(): if value is dest: return key return None if __name__ == '__main__': dest = Logger.str_to_dest('console') level = Logger.str_to_level('debug') logger = Logger(dest, True, level) world='world' logging.error('hello %s!' % world) logging.warn('hello %s!' % world) logging.info('hello %s!' % world) logging.debug('hello %s!' % world)