Revision 796b5152

b/lib/tools/ensure_dirs.py
201 201
  return paths
202 202

  
203 203

  
204
def SetupLogging(opts):
205
  """Configures the logging module.
206

  
207
  """
208
  formatter = logging.Formatter("%(asctime)s: %(message)s")
209

  
210
  stderr_handler = logging.StreamHandler()
211
  stderr_handler.setFormatter(formatter)
212
  if opts.debug:
213
    stderr_handler.setLevel(logging.NOTSET)
214
  elif opts.verbose:
215
    stderr_handler.setLevel(logging.INFO)
216
  else:
217
    stderr_handler.setLevel(logging.WARNING)
218

  
219
  root_logger = logging.getLogger("")
220
  root_logger.setLevel(logging.NOTSET)
221
  root_logger.addHandler(stderr_handler)
222

  
223

  
224 204
def ParseOptions():
225 205
  """Parses the options passed to the program.
226 206

  
......
246 226
  """
247 227
  (opts, args) = ParseOptions()
248 228

  
249
  SetupLogging(opts)
229
  utils.SetupToolLogging(opts.debug, opts.verbose)
250 230

  
251 231
  if args:
252 232
    logging.error("No arguments are expected")
b/lib/tools/prepare_node_join.py
94 94
  return opts
95 95

  
96 96

  
97
def SetupLogging(opts):
98
  """Configures the logging module.
99

  
100
  """
101
  formatter = logging.Formatter("%(asctime)s: %(message)s")
102

  
103
  stderr_handler = logging.StreamHandler()
104
  stderr_handler.setFormatter(formatter)
105
  if opts.debug:
106
    stderr_handler.setLevel(logging.NOTSET)
107
  elif opts.verbose:
108
    stderr_handler.setLevel(logging.INFO)
109
  else:
110
    stderr_handler.setLevel(logging.WARNING)
111

  
112
  root_logger = logging.getLogger("")
113
  root_logger.setLevel(logging.NOTSET)
114
  root_logger.addHandler(stderr_handler)
115

  
116

  
117 97
def _VerifyCertificate(cert, _noded_cert_file=pathutils.NODED_CERT_FILE):
118 98
  """Verifies a certificate against the local node daemon certificate.
119 99

  
......
319 299
  """
320 300
  opts = ParseOptions()
321 301

  
322
  SetupLogging(opts)
302
  utils.SetupToolLogging(opts.debug, opts.verbose)
323 303

  
324 304
  try:
325 305
    data = LoadData(sys.stdin.read())
b/lib/utils/log.py
25 25
import os.path
26 26
import logging
27 27
import logging.handlers
28
from cStringIO import StringIO
28 29

  
29 30
from ganeti import constants
30 31
from ganeti import compat
......
269 270
        raise
270 271

  
271 272
  return compat.partial(_ReopenLogFiles, reopen_handlers)
273

  
274

  
275
def SetupToolLogging(debug, verbose, threadname=False,
276
                     _root_logger=None, _stream=None):
277
  """Configures the logging module for tools.
278

  
279
  All log messages are sent to stderr.
280

  
281
  @type debug: boolean
282
  @param debug: Disable log message filtering
283
  @type verbose: boolean
284
  @param verbose: Enable verbose log messages
285
  @type threadname: boolean
286
  @param threadname: Whether to include thread name in output
287

  
288
  """
289
  if _root_logger is None:
290
    root_logger = logging.getLogger("")
291
  else:
292
    root_logger = _root_logger
293

  
294
  fmt = StringIO()
295
  fmt.write("%(asctime)s:")
296

  
297
  if threadname:
298
    fmt.write(" %(threadName)s")
299

  
300
  if debug or verbose:
301
    fmt.write(" %(levelname)s")
302

  
303
  fmt.write(" %(message)s")
304

  
305
  formatter = logging.Formatter(fmt.getvalue())
306

  
307
  stderr_handler = logging.StreamHandler(_stream)
308
  stderr_handler.setFormatter(formatter)
309
  if debug:
310
    stderr_handler.setLevel(logging.NOTSET)
311
  elif verbose:
312
    stderr_handler.setLevel(logging.INFO)
313
  else:
314
    stderr_handler.setLevel(logging.WARNING)
315

  
316
  root_logger.setLevel(logging.NOTSET)
317
  root_logger.addHandler(stderr_handler)
b/test/ganeti.utils.log_unittest.py
26 26
import logging
27 27
import tempfile
28 28
import shutil
29
import threading
30
from cStringIO import StringIO
29 31

  
30 32
from ganeti import constants
31 33
from ganeti import errors
34
from ganeti import compat
32 35
from ganeti import utils
33 36

  
34 37
import testutils
......
192 195
    self.assertTrue(utils.ReadFile(logfile2).endswith("This is a test\n"))
193 196

  
194 197

  
198
class TestSetupToolLogging(unittest.TestCase):
199
  def test(self):
200
    error_name = logging.getLevelName(logging.ERROR)
201
    warn_name = logging.getLevelName(logging.WARNING)
202
    info_name = logging.getLevelName(logging.INFO)
203
    debug_name = logging.getLevelName(logging.DEBUG)
204

  
205
    for debug in [False, True]:
206
      for verbose in [False, True]:
207
        logger = logging.Logger("TestLogger")
208
        buf = StringIO()
209

  
210
        utils.SetupToolLogging(debug, verbose, _root_logger=logger, _stream=buf)
211

  
212
        logger.error("level=error")
213
        logger.warning("level=warning")
214
        logger.info("level=info")
215
        logger.debug("level=debug")
216

  
217
        lines = buf.getvalue().splitlines()
218

  
219
        self.assertTrue(compat.all(line.count(":") == 3 for line in lines))
220

  
221
        messages = [line.split(":", 3)[-1].strip() for line in lines]
222

  
223
        if debug:
224
          self.assertEqual(messages, [
225
            "%s level=error" % error_name,
226
            "%s level=warning" % warn_name,
227
            "%s level=info" % info_name,
228
            "%s level=debug" % debug_name,
229
            ])
230
        elif verbose:
231
          self.assertEqual(messages, [
232
            "%s level=error" % error_name,
233
            "%s level=warning" % warn_name,
234
            "%s level=info" % info_name,
235
            ])
236
        else:
237
          self.assertEqual(messages, [
238
            "level=error",
239
            "level=warning",
240
            ])
241

  
242
  def testThreadName(self):
243
    thread_name = threading.currentThread().getName()
244

  
245
    for enable_threadname in [False, True]:
246
      logger = logging.Logger("TestLogger")
247
      buf = StringIO()
248

  
249
      utils.SetupToolLogging(True, True, threadname=enable_threadname,
250
                             _root_logger=logger, _stream=buf)
251

  
252
      logger.debug("test134042376")
253

  
254
      lines = buf.getvalue().splitlines()
255
      self.assertEqual(len(lines), 1)
256

  
257
      if enable_threadname:
258
        self.assertTrue((" %s " % thread_name) in lines[0])
259
      else:
260
        self.assertTrue(thread_name not in lines[0])
261

  
262

  
195 263
if __name__ == "__main__":
196 264
  testutils.GanetiTestProgram()
b/tools/cluster-merge
781 781
    shutil.rmtree(self.work_dir)
782 782

  
783 783

  
784
def SetupLogging(options):
785
  """Setting up logging infrastructure.
786

  
787
  @param options: Parsed command line options
788

  
789
  """
790
  formatter = logging.Formatter("%(asctime)s: %(levelname)s %(message)s")
791

  
792
  stderr_handler = logging.StreamHandler()
793
  stderr_handler.setFormatter(formatter)
794
  if options.debug:
795
    stderr_handler.setLevel(logging.NOTSET)
796
  elif options.verbose:
797
    stderr_handler.setLevel(logging.INFO)
798
  else:
799
    stderr_handler.setLevel(logging.WARNING)
800

  
801
  root_logger = logging.getLogger("")
802
  root_logger.setLevel(logging.NOTSET)
803
  root_logger.addHandler(stderr_handler)
804

  
805

  
806 784
def main():
807 785
  """Main routine.
808 786

  
......
821 799

  
822 800
  (options, args) = parser.parse_args()
823 801

  
824
  SetupLogging(options)
802
  utils.SetupToolLogging(options.debug, options.verbose)
825 803

  
826 804
  if not args:
827 805
    parser.error("No clusters specified")
b/tools/move-instance
719 719
  logging.info("Destination cluster RAPI version: %s", dest_client.GetVersion())
720 720

  
721 721

  
722
def SetupLogging(options):
723
  """Setting up logging infrastructure.
724

  
725
  @param options: Parsed command line options
726

  
727
  """
728
  fmt = "%(asctime)s: %(threadName)s "
729
  if options.debug or options.verbose:
730
    fmt += "%(levelname)s "
731
  fmt += "%(message)s"
732

  
733
  formatter = logging.Formatter(fmt)
734

  
735
  stderr_handler = logging.StreamHandler()
736
  stderr_handler.setFormatter(formatter)
737
  if options.debug:
738
    stderr_handler.setLevel(logging.NOTSET)
739
  elif options.verbose:
740
    stderr_handler.setLevel(logging.INFO)
741
  else:
742
    stderr_handler.setLevel(logging.ERROR)
743

  
744
  root_logger = logging.getLogger("")
745
  root_logger.setLevel(logging.NOTSET)
746
  root_logger.addHandler(stderr_handler)
747

  
748

  
749 722
def ParseOptions():
750 723
  """Parses options passed to program.
751 724

  
......
845 818
  """
846 819
  (parser, options, args) = ParseOptions()
847 820

  
848
  SetupLogging(options)
821
  utils.SetupToolLogging(options.debug, options.verbose, threadname=True)
849 822

  
850 823
  (src_cluster_name, dest_cluster_name, instance_names) = \
851 824
    CheckOptions(parser, options, args)
b/tools/ovfconverter
31 31
from ganeti import constants
32 32
from ganeti import errors
33 33
from ganeti import ovf
34
from ganeti import utils
34 35

  
35 36

  
36 37
IMPORT_MODE = "import"
......
161 162
  return (mode, input_path, options)
162 163

  
163 164

  
164
def SetupLogging(options):
165
  """Setting up logging infrastructure.
166

  
167
  @type options: optparse.Values
168
  @param options: parsed command line options
169

  
170
  """
171
  formatter = logging.Formatter("%(asctime)s: %(levelname)s %(message)s")
172

  
173
  stderr_handler = logging.StreamHandler()
174
  stderr_handler.setFormatter(formatter)
175
  if options.debug:
176
    stderr_handler.setLevel(logging.NOTSET)
177
  elif options.verbose:
178
    stderr_handler.setLevel(logging.INFO)
179
  else:
180
    stderr_handler.setLevel(logging.WARNING)
181

  
182
  root_logger = logging.getLogger("")
183
  root_logger.setLevel(logging.NOTSET)
184
  root_logger.addHandler(stderr_handler)
185

  
186

  
187 165
def main():
188 166
  """Main routine.
189 167

  
190 168
  """
191 169
  (mode, input_path, options) = ParseOptions()
192
  SetupLogging(options)
170

  
171
  utils.SetupToolLogging(options.debug, options.verbose)
172

  
193 173
  logging.info("Chosen %s mode, reading the %s file", mode, input_path)
194 174
  assert mode in (IMPORT_MODE, EXPORT_MODE)
195 175
  converter = None

Also available in: Unified diff