亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python改變?nèi)罩?logging)存放位置的示例

 更新時(shí)間:2014年03月27日 09:41:23   作者:  
示例主要解決的問(wèn)題是通過(guò)傳入日志文件參數(shù)的方式來(lái)改變?nèi)罩镜拇娣盼恢?需要的朋友可以參考下

實(shí)現(xiàn)了簡(jiǎn)單版本的logging.config,支持一般的通過(guò)config文件進(jìn)行配置。
感覺(jué)還有更好的方法,是直接利用logging.config.fileConfig(log_config_file)方式讀進(jìn)來(lái)之后,通過(guò)修改handler方式來(lái)進(jìn)行修改。

復(fù)制代碼 代碼如下:

"""
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

復(fù)制代碼 代碼如下:

[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

相關(guān)文章

  • python實(shí)現(xiàn)QQ批量登錄功能

    python實(shí)現(xiàn)QQ批量登錄功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)QQ批量登錄功能,以及python3.6批量登陸QQ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn)

    python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn)

    本文主要介紹了python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Python?文檔解析lxml庫(kù)的使用詳解

    Python?文檔解析lxml庫(kù)的使用詳解

    lxml 是 Python 常用的文檔解析庫(kù),能夠高效地解析 HTML/XML 文檔,常用于 Python 爬蟲(chóng),這篇文章主要介紹了Python?文檔解析:lxml庫(kù)的使用,需要的朋友可以參考下
    2022-09-09
  • Python中使用matplotlib庫(kù)繪制各種圖

    Python中使用matplotlib庫(kù)繪制各種圖

    這篇文章主要介紹了Python中使用matplotlib庫(kù)繪制各種圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 最炫Python煙花代碼全解析

    最炫Python煙花代碼全解析

    2022虎年新年即將來(lái)臨,小編為大家?guī)?lái)了一個(gè)利用Python編寫(xiě)的虎年煙花特效,堪稱全網(wǎng)最絢爛,文中的示例代碼簡(jiǎn)潔易懂,感興趣的同學(xué)可以動(dòng)手試一試
    2022-02-02
  • Python判斷Abundant Number的方法

    Python判斷Abundant Number的方法

    這篇文章主要介紹了Python判斷Abundant Number的方法,實(shí)例分析了Python針對(duì)盈數(shù)的判斷技巧,需要的朋友可以參考下
    2015-06-06
  • Python實(shí)現(xiàn)的對(duì)一個(gè)數(shù)進(jìn)行因式分解操作示例

    Python實(shí)現(xiàn)的對(duì)一個(gè)數(shù)進(jìn)行因式分解操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的對(duì)一個(gè)數(shù)進(jìn)行因式分解操作,結(jié)合實(shí)例形式分析了Python因式分解數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • Python淺拷貝與深拷貝用法實(shí)例

    Python淺拷貝與深拷貝用法實(shí)例

    這篇文章主要介紹了Python淺拷貝與深拷貝用法,實(shí)例分析了Python淺拷貝與深拷貝的功能與使用方法,需要的朋友可以參考下
    2015-05-05
  • django 中QuerySet特性功能詳解

    django 中QuerySet特性功能詳解

    這篇文章主要介紹了django 中QuerySet特性功能詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 10個(gè)常用python自動(dòng)化腳本

    10個(gè)常用python自動(dòng)化腳本

    本文主要介紹了10個(gè)常用python自動(dòng)化腳本,這些腳本可以幫助自動(dòng)化完成任務(wù),提高工作效率,文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的可以了解下
    2024-01-01

最新評(píng)論