加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 20:06:59 所属栏目:Python 来源:网络整理
导读:实现了简单版本的logging.config,支持一般的通过config文件进行配置。 感觉还有更好的方法,是直接利用logging.config.fileConfig(log_config_file)方式读进来之后,通过修改handler方式来进行修改。 复制代码 代码如下: """ project trace system """ impo

实现了简单版本的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",")
    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",")
    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_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,err_info):
    self.logger.error("[{0}]: {1}".format(key,err_info))
  def warn(self,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读