Revision 59f187eb lib/logger.py

b/lib/logger.py
35 35
from ganeti import constants
36 36

  
37 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
38
def SetupLogging(logfile, debug=False, stderr_logging=False, program=""):
39
  """Configures the logging module.
52 40

  
53 41
  """
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)
42
  fmt = "%(asctime)s: " + program + " "
74 43
  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, stderr_logging=False):
88
  """Configures the logging module for daemons
89

  
90
  """
91
  if debug:
92
    fmt = ("%(asctime)s: pid=%(process)d/%(threadName)s %(levelname)s"
44
    fmt += ("pid=%(process)d/%(threadName)s %(levelname)s"
93 45
           " %(module)s:%(lineno)s %(message)s")
94 46
  else:
95
    fmt = "%(asctime)s: pid=%(process)d %(levelname)s %(message)s"
47
    fmt += "pid=%(process)d %(levelname)s %(message)s"
96 48
  formatter = logging.Formatter(fmt)
97 49

  
98
  logfile_handler = logging.FileHandler(logfile)
99
  logfile_handler.setFormatter(formatter)
100

  
101
  stderr_handler = logging.StreamHandler()
102
  stderr_handler.setFormatter(formatter)
103
  if debug:
104
    logfile_handler.setLevel(logging.DEBUG)
105
    stderr_handler.setLevel(logging.NOTSET)
106
  else:
107
    logfile_handler.setLevel(logging.INFO)
108
    stderr_handler.setLevel(logging.CRITICAL)
109

  
110 50
  root_logger = logging.getLogger("")
111 51
  root_logger.setLevel(logging.NOTSET)
112
  root_logger.addHandler(logfile_handler)
52

  
113 53
  if stderr_logging:
54
    stderr_handler = logging.StreamHandler()
55
    stderr_handler.setFormatter(formatter)
56
    if debug:
57
      stderr_handler.setLevel(logging.NOTSET)
58
    else:
59
      stderr_handler.setLevel(logging.CRITICAL)
114 60
    root_logger.addHandler(stderr_handler)
115 61

  
62
  # this can fail, if the logging directories are not setup or we have
63
  # a permisssion problem; in this case, it's best to log but ignore
64
  # the error if stderr_logging is True, and if false we re-raise the
65
  # exception since otherwise we could run but without any logs at all
66
  try:
67
    logfile_handler = logging.FileHandler(logfile)
68
    logfile_handler.setFormatter(formatter)
69
    if debug:
70
      logfile_handler.setLevel(logging.DEBUG)
71
    else:
72
      logfile_handler.setLevel(logging.INFO)
73
    root_logger.addHandler(logfile_handler)
74
  except EnvironmentError, err:
75
    if stderr_logging:
76
      logging.exception("Failed to enable logging to file '%s'", logfile)
77
    else:
78
      # we need to re-raise the exception
79
      raise
80

  
116 81

  
117 82
# Backwards compatibility
118 83
Error = logging.error

Also available in: Unified diff