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)