Add custom logging setup for daemons
[ganeti-local] / lib / logger.py
1 #
2 #
3
4 # Copyright (C) 2006, 2007 Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 # 02110-1301, USA.
20
21
22 """Logging for Ganeti
23
24 This module abstracts the logging handling away from the rest of the
25 Ganeti code. It offers some utility functions for easy logging.
26
27 """
28
29 # pylint: disable-msg=W0603,C0103
30
31 import sys
32 import logging
33 import os, os.path
34
35 from ganeti import constants
36
37
38 def _CreateFileHandler(name):
39   return logging.FileHandler(os.path.join(constants.LOG_DIR, name))
40
41
42 def SetupLogging(program='ganeti', debug=False):
43   """Setup logging for ganeti
44
45   On failure, a check is made whether process is run by root or not,
46   and an appropriate error message is printed on stderr, then process
47   exits.
48
49   Args:
50     debug: Whether to enable verbose logging
51     program: Program name
52
53   """
54   fmt = "%(asctime)s " + program + ": %(message)s"
55   formatter = logging.Formatter(fmt)
56
57   stderr_fmt = "%(asctime)s: %(message)s"
58   stderr_formatter = logging.Formatter(stderr_fmt)
59
60   info_file = _CreateFileHandler("info")
61   info_file.setLevel(logging.INFO)
62   info_file.setFormatter(formatter)
63
64   errors_file = _CreateFileHandler("errors")
65   errors_file.setLevel(logging.ERROR)
66   errors_file.setFormatter(formatter)
67
68   debug_file = _CreateFileHandler("debug")
69   debug_file.setLevel(logging.DEBUG)
70   debug_file.setFormatter(formatter)
71
72   stderr_file = logging.StreamHandler()
73   stderr_file.setFormatter(stderr_formatter)
74   if debug:
75     stderr_file.setLevel(logging.NOTSET)
76   else:
77     stderr_file.setLevel(logging.ERROR)
78
79   root_logger = logging.getLogger("")
80   root_logger.setLevel(logging.NOTSET)
81   root_logger.addHandler(info_file)
82   root_logger.addHandler(errors_file)
83   root_logger.addHandler(debug_file)
84   root_logger.addHandler(stderr_file)
85
86
87 def SetupDaemon(logfile, debug=False):
88   """Configures the logging module for daemons
89
90   """
91   if debug:
92     fmt = "%(asctime)s: %(levelname)s %(pathname)s:%(lineno)s %(message)s"
93   else:
94     fmt = "%(asctime)s: %(levelname)s %(message)s"
95   formatter = logging.Formatter(fmt)
96
97   logfile_handler = logging.FileHandler(logfile)
98   logfile_handler.setFormatter(formatter)
99
100   stderr_handler = logging.StreamHandler()
101   stderr_handler.setFormatter(formatter)
102   if debug:
103     logfile_handler.setLevel(logging.DEBUG)
104     stderr_handler.setLevel(logging.NOTSET)
105   else:
106     logfile_handler.setLevel(logging.INFO)
107     stderr_handler.setLevel(logging.CRITICAL)
108
109   root_logger = logging.getLogger("")
110   root_logger.setLevel(logging.NOTSET)
111   root_logger.addHandler(logfile_handler)
112   root_logger.addHandler(stderr_handler)
113
114
115 # Backwards compatibility
116 Error = logging.error
117 Info = logging.info
118 Debug = logging.debug
119
120
121 def ToStdout(txt):
122   """Write a message to stdout only, bypassing the logging system
123
124   Parameters:
125     - txt: the message
126
127   """
128   sys.stdout.write(txt + '\n')
129   sys.stdout.flush()
130
131
132 def ToStderr(txt):
133   """Write a message to stderr only, bypassing the logging system
134
135   Parameters:
136     - txt: the message
137
138   """
139   sys.stderr.write(txt + '\n')
140   sys.stderr.flush()