一、简单的python日志模块介绍

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

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

二、日志的配置

  openstack服务程序在启动的时候都会对日志系统进行设置,这里以nova-api为例,在它的的启动代码里:

nova/cmd/api.py

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.py

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)

三、日志的使用

  首先导入并获取logger

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)

最新文章

  1. Theano在windows下的安装及GPU加速
  2. SQL Server 临时表的删除
  3. springMVC图片文件上传功能的实现
  4. 【宋红康学习日记1】关于环境变量设置出现的问题——找不到或无法加载主类 java
  5. 以Outlook样式分组和排列数据项
  6. 第一篇、CSS3_transtion的使用
  7. Java6.0中Comparable接口与Comparator接口详解
  8. 将 JSP 中数组传递给 js
  9. R语言集合操作
  10. 正则表达式regex(golang版)
  11. 数字化IT人才与组织
  12. Python读取xlsx文件
  13. P4168 [Violet]蒲公英
  14. JavaScript Array some() 方法
  15. Arch Linux下Visual Stdio Code在格式化C代码时报错
  16. mysql案例~关于linux服务器本身的优化问题
  17. gcc命令中参数c和o混合使用的详解
  18. 万恶之源 - Python基础数据类型一
  19. tf.equal的使用
  20. HDU 1024 最大M字段和

热门文章

  1. java 乐观锁 vs 悲观锁
  2. Arctic Network POJ 2349 (最小生成树思想)
  3. 172322 2018-2019-1 《Java软件结构与数据结构》实验一报告
  4. our team
  5. 404 Note Found· 第七次作业 - 需求分析报告
  6. IT小小鸟读后感言
  7. JSON.parse与eval
  8. 【第二周】关于java.util包下的Random类
  9. 【vue】index.html main.js app.vue index.js怎么结合的? 怎么打包的?搜集的信息
  10. java 基础 --final--008