Initial commit
[ta/distributed-state-server.git] / src / dss / server / dss_logger.py
1 # Copyright 2019 Nokia
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 #
15
16 import sys
17 import logging
18 import logging.handlers
19
20 from dss.api import dss_error
21
22 class Logger:
23
24     levels = {'debug': logging.DEBUG,
25             'info': logging.INFO,
26             'warning': logging.WARNING,
27             'error': logging.error}
28
29     DEST_CONSOLE = 1
30     DEST_SYSLOG = 2
31     dests = {'console': DEST_CONSOLE,
32             'syslog': DEST_SYSLOG}
33
34     def __init__(self, dest, verbose, level):
35         self.verbose = verbose
36         self.dest = Logger.str_to_dest(dest)
37         self.level = Logger.str_to_level(level)
38         self.init()
39
40     def init(self):
41         args = {}
42
43         if self.level not in Logger.levels.values():
44             raise dss_error.Error('Invalid level value, possible values are %s' % str(Logger.levels))
45
46         if self.dest not in Logger.dests.values():
47             raise dss_error.Error('Invalid destination value, possible values are %s' % str(Logger.dests))
48
49         if self.verbose:
50             if self.dest is Logger.DEST_CONSOLE:
51                 args['format'] = '[%(asctime)s %(levelname)7s %(module)s(%(lineno)3s)] %(message)s'
52             else:
53                 args['format'] = '[%(module)s(%(lineno)3s)] %(message)s'
54         else:
55             args['format'] = '%(message)s'
56
57         if self.dest is Logger.DEST_CONSOLE:
58             args['stream'] = sys.stdout
59         elif self.dest is Logger.DEST_SYSLOG:
60             logging.getLogger('').addHandler(logging.handlers.SysLogHandler(address='/dev/log'))
61
62         args['level'] = self.level
63         logging.basicConfig(**args)
64
65     def set_level(self, level):
66         self.level = Logger.str_to_level(level)
67         self.init()
68
69     def set_dest(self, dest):
70         self.dest = Logger.str_to_dest(dest)
71         self.init()
72
73     @staticmethod
74     def str_to_level(level):
75         ret = None
76         try:
77             ret = Logger.levels[level]
78         except KeyError as exp:
79             raise dss_error.Error('Invalid log level, possible values %s' % str(Logger.levels.keys()))
80         return ret
81
82     @staticmethod
83     def str_to_dest(dest):
84         ret = None
85         try:
86             ret = Logger.dests[dest]
87         except KeyError as exp:
88             raise dss_error.Error('Invalid destination, possible values %s' % str(Logger.dests.keys()))
89         return ret
90
91     @staticmethod
92     def level_to_str(level):
93         for key, value in Logger.levels.iteritems():
94             if value is level:
95                 return key
96         return None
97
98     @staticmethod
99     def dest_to_str(dest):
100         for key, value in Logger.dests.iteritems():
101             if value is dest:
102                 return key
103         return None
104
105 if __name__ == '__main__':
106     dest = Logger.str_to_dest('console')
107     level = Logger.str_to_level('debug')
108     logger = Logger(dest, True, level)
109     world='world'
110     logging.error('hello %s!' % world)
111     logging.warn('hello %s!' % world)
112     logging.info('hello %s!' % world)
113     logging.debug('hello %s!' % world)