python改变日志(logging)存放位置的示例


Posted in Python onMarch 27, 2014

实现了简单版本的logging.config,支持一般的通过config文件进行配置。
感觉还有更好的方法,是直接利用logging.config.fileConfig(log_config_file)方式读进来之后,通过修改handler方式来进行修改。

"""
project trace system
"""
import sys
import ConfigParser
import logging
import logging.config
import warnings
if __name__ == "__main__":
  log_config_file = "log.conf"
  log_data_file = "logs/run.log"
LEVEL_dic = {
               "DEBUG": logging.DEBUG,
               "INFO": logging.INFO,
               "WARNING": logging.WARNING,
               "ERROR": logging.ERROR,
               "CRITICAL": logging.CRITICAL
            }
class LogConfig(object):
  def __init__(self, log_config_file, log_data_file=None):
    self.log_config_file = log_config_file
    self.log_data_file = log_data_file  # for self app
    self.log_config = ConfigParser.RawConfigParser()
    self.log_config.read(self.log_config_file)
    self.logger_prefix = "logger_"
    self.handler_prefix = "handler_"
    self.formatter_prefix = "formatter_"
    self._check_section()
    self._parse_option()
  def _check_section(self):
    # check logger
    self.__check_logger()
    # check  handler
    self.__check_handler()
    # check formatter
    self.__check_formatter()
  def _parse_option(self):
    # parse formatter option
    for formatter, formatter_info in self.formatters.items():
      section_name = formatter_info["section_name"]
      f = self.log_config.get(section_name, "format")
      datefmt = self.log_config.get(section_name, "datefmt")
      self.formatters[formatter]["value"] = logging.Formatter(f, datefmt)
    # parse handlers
    for handler, handler_info in self.handlers.items():
      section_name = handler_info["section_name"]
      handler_class = self.log_config.get(section_name, "class")
      handler_str = self.log_config.get(section_name, "args")
      handler_args = eval(self.log_config.get(section_name, "args"))
      level = self.log_config.get(section_name, "level")
      formatter = self.log_config.get(section_name, "formatter")
      _handler = eval("logging."+handler_class)
      # only FileHandler has file path paramter.
      if isinstance(_handler, logging.FileHandler):
        if self.log_data_file:
          handler_args[0] = self.log_data_file
        else:
          warnings.warn("fileHandler found, but log data file is not specified")
      self.handlers[handler]["value"] = _handler(*handler_args)
      self.handlers[handler]["value"].setLevel(
          LEVEL_dic.get(level.upper(), LEVEL_dic["INFO"]))
      self.handlers[handler]["value"].setFormatter(
          self.formatters[formatter]["value"])
    # parse logger
    for logger, logger_info in self.loggers.items():
      section_name = logger_info["section_name"]
      self.__parse_logger(logger, section_name)
  def __parse_logger(self, logger_name, section_name):
    """ 
    """
    tuple_items = self.log_config.items(section_name)
    logger = logging.getLogger(logger_name)
    for k, v in tuple_items:
      if k == "handlers":
        handlers = filter(None, [h.strip() for h in v.split(",")])
        for h in handlers:
          logger.addHandler(self.handlers[h]["value"])
      if k == "level":
        logger.setLevel(LEVEL_dic.get(v, LEVEL_dic["INFO"]))
      if k == "propagate" and v:
        logger.propagate = int(v)
      # here other attributes could be added. TODO
    self.loggers[logger_name]['value'] = logger
  def __check_logger(self):
    _loggers = self.log_config.get("loggers", "keys").split(",")
    self.loggers = {}
    for logger in _loggers:
      logger = logger.strip()
      if logger: 
        logger_section_name = self.logger_prefix + logger
        if not self.log_config.has_section(logger_section_name):
          raise Exception(
              "ERROR: no logger section name: {0}".format(logger_section_name))
        self.loggers.setdefault(logger, {})
        self.loggers[logger]["section_name"] = logger_section_name
    if not self.loggers: 
      raise Exception(
          "ERROR: No logger keys in {0}".format(self.log_config_file))
  def __check_handler(self):
    _handlers = self.log_config.get("handlers", "keys").split(",")
    self.handlers = {}
    for handler in _handlers:
      handler = handler.strip()
      if handler:
        handler_section_name = self.handler_prefix + handler
        if not self.log_config.has_section(handler_section_name):
          raise Exception("ERROR: no handler section name: {0}".format(handler_section_name))
        self.handlers.setdefault(handler , {})
        self.handlers[handler]["section_name"] = handler_section_name
    if not self.handlers: 
      raise Exception("ERROR: No handler keys in {0}".format(self.log_config_file)) 
  def __check_formatter(self):
    _formatters = self.log_config.get("formatters", "keys").split(",")
    self.formatters = {}
    for formatter in _formatters:
      formatter = formatter.strip()
      if formatter:
        formatter_section_name = self.formatter_prefix + formatter
        if not self.log_config.has_section(formatter_section_name):
          raise Exception("ERROR: no formatter section name: {0}".format(formatter_section_name))
        self.formatters.setdefault(formatter, {})
        self.formatters[formatter]["section_name"] = formatter_section_name
    if not self.formatters: 
      raise Exception("ERROR: No formatter keys in {0}".format(self.log_config_file)) 
  def getLogger(self, logger_name="root"):
    return self.loggers[logger_name]['value']

class Trace(object):
  def __init__(self, log_config_file, log_key="root", log_data_file=None):
    self.log_config_file = log_config_file
    self.log_data_file   = log_data_file
    self.log_key = log_key
    Log = LogConfig(self.log_config_file, self.log_data_file)
    self.logger = Log.getLogger(self.log_key)
  def info(self, key, info):
    self.logger.info("[{0}]: {1}".format(key, info))
  def error(self, key, err_info):
    self.logger.error("[{0}]: {1}".format(key, err_info))
  def warn(self, key, warn_info):
    self.logger.warn("[{0}]: {1}".format(key, warn_info))

def test():
  log_key = "root"
  t = Trace(log_config_file, log_key, log_data_file)
  t.info("TEST TRACE", "OK")
if __name__ == "__main__":
  test()

log.conf

[loggers]
keys = root, debug
[handlers]
keys=consoleHandler, timedRotatingFileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler, timedRotatingFileHandler
[logger_debug]
level=DEBUG
handlers=consoleHandler
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_timedRotatingFileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=("./run.log", 'midnight', 1, 10)
[formatter_simpleFormatter]
format=[%(asctime)s][%(levelname)s][%(process)d:%(thread)d][%(filename)s:%(lineno)d]:%(message)s
datefmt=%Y-%m-%d %H:%M:%S
Python 相关文章推荐
利用python获得时间的实例说明
Mar 25 Python
使用python实现省市三级菜单效果
Jan 20 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 Python
python实现高斯判别分析算法的例子
Dec 09 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
Python request操作步骤及代码实例
Apr 13 Python
Python实现壁纸下载与轮换
Oct 19 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
使用python删除nginx缓存文件示例(python文件操作)
Mar 26 #Python
python实现ip查询示例
Mar 26 #Python
python fabric实现远程操作和部署示例
Mar 25 #Python
python基础教程之数字处理(math)模块详解
Mar 25 #Python
python操作摄像头截图实现远程监控的例子
Mar 25 #Python
python基础教程之字典操作详解
Mar 25 #Python
python基础教程之元组操作使用详解
Mar 25 #Python
You might like
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
js鼠标悬浮出现遮罩层的方法
2015/01/28 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
详解Python进程间通信之命名管道
2017/08/28 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
Python多项式回归的实现方法
2019/03/11 Python
python中count函数简单用法
2020/01/05 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Python随机数函数代码实例解析
2020/02/09 Python
python自动化办公操作PPT的实现
2021/02/05 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
机械电子工程专业推荐信范文
2013/11/20 职场文书
培训心得体会
2013/12/29 职场文书
《理想》教学反思
2014/02/17 职场文书
会计的岗位职责
2014/03/15 职场文书
青春雷锋观后感
2015/06/10 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Python闭包的定义和使用方法
2022/04/11 Python
优化Mysql查询的示例
2022/04/26 MySQL