Revision 9a6813ac lib/utils/log.py

b/lib/utils/log.py
27 27
import logging.handlers
28 28

  
29 29
from ganeti import constants
30
from ganeti import compat
30 31

  
31 32

  
32 33
class _ReopenableLogHandler(logging.handlers.BaseRotatingHandler):
......
163 164
  return logging.Formatter("".join(parts))
164 165

  
165 166

  
167
def _ReopenLogFiles(handlers):
168
  """Wrapper for reopening all log handler's files in a sequence.
169

  
170
  """
171
  for handler in handlers:
172
    handler.RequestReopen()
173

  
174

  
166 175
def SetupLogging(logfile, program, debug=0, stderr_logging=False,
167 176
                 multithreaded=False, syslog=constants.SYSLOG_USAGE,
168
                 console_logging=False):
177
                 console_logging=False, root_logger=None):
169 178
  """Configures the logging module.
170 179

  
171 180
  @type logfile: str
......
187 196
  @type console_logging: boolean
188 197
  @param console_logging: if True, will use a FileHandler which falls back to
189 198
      the system console if logging fails
199
  @type root_logger: logging.Logger
200
  @param root_logger: Root logger to use (for unittests)
190 201
  @raise EnvironmentError: if we can't open the log file and
191 202
      syslog/stderr logging is disabled
192 203

  
......
196 207
  formatter = _GetLogFormatter(progname, multithreaded, debug, False)
197 208
  syslog_fmt = _GetLogFormatter(progname, multithreaded, debug, True)
198 209

  
199
  root_logger = logging.getLogger("")
210
  reopen_handlers = []
211

  
212
  if root_logger is None:
213
    root_logger = logging.getLogger("")
200 214
  root_logger.setLevel(logging.NOTSET)
201 215

  
202 216
  # Remove all previously setup handlers
......
245 259
    else:
246 260
      logfile_handler.setLevel(logging.INFO)
247 261
    root_logger.addHandler(logfile_handler)
262

  
263
    reopen_handlers.append(logfile_handler)
264

  
265
  return compat.partial(_ReopenLogFiles, reopen_handlers)

Also available in: Unified diff