Skip to main content

gflags

import logging
import os
import re
import sys
import time

import gflags
from base import scheduler
from base import thread_util

scheduler.Scheduler.CreateGlobalInstance()


_LOG_LEVELS = ['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG']

gflags.DEFINE_string(
  'log_dir', '/tmp/log',
  '')
# TODO: test None.
gflags.DEFINE_enum(
  'log', 'info', [l.lower() for l in _LOG_LEVELS] + [''],
  'Log level sent to stderr.')
gflags.DEFINE_integer(
  'log_threads_freq', None,
  'If set, stack traces of all active threads are logged, at debug level, '
  'every given number of seconds.')
FLAGS = gflags.FLAGS


def ConfigureLogging():
  logging.root.setLevel(logging.NOTSET)

  if FLAGS.log:
    logging.root.addHandler(
      _CreateStdErrHandler(FLAGS.log.upper()))

  if FLAGS.log_dir:
    if not os.path.isdir(FLAGS.log_dir):
      os.makedirs(FLAGS.log_dir)
    for log_level_name in _LOG_LEVELS:
      logging.root.addHandler(
        _CreateFileHandler(FLAGS.log_dir, log_level_name))

  if FLAGS.log_threads_freq:
    scheduler.Scheduler.INSTANCE.RunEvery(FLAGS.log_threads_freq, lambda: (
      logging.debug('Active threads:\n%s',
                    thread_util.FormatStackTraceOfAllThreads())))


def IsDebug():
  return logging.root.handlers[0].level <= logging.DEBUG


def _CreateStdErrHandler(log_level_name):
  stderr = logging.StreamHandler()
  stderr.setFormatter(_Formatter())
  stderr.setLevel(_LogLevel(log_level_name))
  return stderr


def _CreateFileHandler(log_dir, log_level_name):
  path = os.path.join(log_dir, '%s.%s' % (
    os.path.basename(sys.argv[0]), log_level_name))
  file_handler = logging.FileHandler(path)
  file_handler.setFormatter(_Formatter())
  file_handler.setLevel(_LogLevel(log_level_name))
  return file_handler


def _LogLevel(log_level_name):
  return getattr(logging, (log_level_name))