openstack日誌模塊

1、簡單的python日誌模塊介紹html

http://www.cnblogs.com/tuzkee/p/3974193.htmlpython

http://blog.csdn.net/jgood/article/details/4340740api

 

2、日誌的配置spa

  openstack服務程序在啓動的時候都會對日誌系統進行設置,這裏以nova-api爲例,在它的的啓動代碼裏:.net

nova/cmd/api.pydebug

def main():
    config.parse_args(sys.argv)
    logging.setup("nova")
    ...

  因爲在/etc/init.d/openstack-nova-api控制腳本里已經傳入參數,因此sys.argv爲['/usr/bin/nova-api', '--logfile', '/var/log/nova/api.log'],即在配置參數裏面設置了日誌系統的文件記錄地址。接着看日誌的設置代碼以下:日誌

nova/openstack/common/log.pycode

def setup(product_name):
    if CONF.log_config:
        _load_log_config(CONF.log_config)
    else:
        _setup_logging_from_conf()
    sys.excepthook = _create_logging_excepthook(product_name)


def _setup_logging_from_conf():
    """
    獲取根logger,此後建立的全部logger都繼承了它的配置,因此此後建立的logger基本不須要配置就能夠直接使用
    """ log_root = getLogger(None).logger    
    for handler in log_root.handlers:
            log_root.removeHandler(handler)

    if CONF.use_syslog:
        facility = _find_facility_from_conf()
        syslog = logging.handlers.SysLogHandler(address='/dev/log',
                                                facility=facility)
        log_root.addHandler(syslog)
    """設置日誌輸出位置"""
    logpath = _get_log_file_path()#獲取剛剛設置的日誌文件路徑
    if logpath:
        filelog = logging.handlers.WatchedFileHandler(logpath)
        log_root.addHandler(filelog)

    if CONF.use_stderr:
        streamlog = ColorHandler()
        log_root.addHandler(streamlog)

    elif not CONF.log_file:
        streamlog = logging.StreamHandler(sys.stdout)
        log_root.addHandler(streamlog)

    if CONF.publish_errors:
        handler = importutils.import_object(
            "nova.openstack.common.log_handler.PublishErrorsHandler",
            logging.ERROR)
        log_root.addHandler(handler)
    """設置日誌格式"""
    datefmt = CONF.log_date_format
    for handler in log_root.handlers:
        if CONF.log_format:
            handler.setFormatter(logging.Formatter(fmt=CONF.log_format,
                                                   datefmt=datefmt))
            log_root.info('Deprecated: log_format is now deprecated and will '
                          'be removed in the next release')
        else:
            handler.setFormatter(ContextFormatter(datefmt=datefmt))
    """設置日誌級別"""
    if CONF.debug:
        log_root.setLevel(logging.DEBUG)
    elif CONF.verbose:
        log_root.setLevel(logging.INFO)
    else:
        log_root.setLevel(logging.WARNING)

    for pair in CONF.default_log_levels:
        mod, _sep, level_name = pair.partition('=')
        level = logging.getLevelName(level_name)
        logger = logging.getLogger(mod)
        logger.setLevel(level)

 

3、日誌的使用orm

  首先導入並獲取loggerhtm

from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__)

  其中的LOG是通過openstack定製的logger,可見以下代碼:

def getLogger(name='unknown', version='unknown'):
    if name not in _loggers:
        _loggers[name] = ContextAdapter(logging.getLogger(name),
                                        name,
                                        version)
    return _loggers[name]

class ContextAdapter(BaseLoggerAdapter):
    warn = logging.LoggerAdapter.warning

    def __init__(self, logger, project_name, version_string):
        self.logger = logger
        self.project = project_name
        self.version = version_string

  接着就能夠使用logger了,例如:

LOG.error(xxx)
相關文章
相關標籤/搜索