python改变日志(logging)存放位置的示例
admin
2023-07-31 02:07:18
0

实现了简单版本的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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...