zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

Python日志 Python 示例 日志 改变 位置 存放
2023-06-13 09:15:24 时间

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

复制代码代码如下:


"""
projecttracesystem
"""
importsys
importConfigParser
importlogging
importlogging.config
importwarnings

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
           }
classLogConfig(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 #forselfapp
   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):
   #checklogger
   self.__check_logger()
   #check handler
   self.__check_handler()
   #checkformatter
   self.__check_formatter()

 def_parse_option(self):
   #parseformatteroption
   forformatter,formatter_infoinself.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)
   #parsehandlers
   forhandler,handler_infoinself.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)
     #onlyFileHandlerhasfilepathparamter.
     ifisinstance(_handler,logging.FileHandler):
       ifself.log_data_file:
         handler_args[0]=self.log_data_file
       else:
         warnings.warn("fileHandlerfound,butlogdatafileisnotspecified")
     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"])
   #parselogger
   forlogger,logger_infoinself.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)
   fork,vintuple_items:
     ifk=="handlers":
       handlers=filter(None,[h.strip()forhinv.split(",")])
       forhinhandlers:
         logger.addHandler(self.handlers[h]["value"])
     ifk=="level":
       logger.setLevel(LEVEL_dic.get(v,LEVEL_dic["INFO"]))
     ifk=="propagate"andv:
       logger.propagate=int(v)
     #hereotherattributescouldbeadded.TODO
   self.loggers[logger_name]["value"]=logger

 def__check_logger(self):
   _loggers=self.log_config.get("loggers","keys").split(",")
   self.loggers={}
   forloggerin_loggers:
     logger=logger.strip()
     iflogger:
       logger_section_name=self.logger_prefix+logger
       ifnotself.log_config.has_section(logger_section_name):
         raiseException(
             "ERROR:nologgersectionname:{0}".format(logger_section_name))
       self.loggers.setdefault(logger,{})
       self.loggers[logger]["section_name"]=logger_section_name
   ifnotself.loggers:
     raiseException(
         "ERROR:Nologgerkeysin{0}".format(self.log_config_file))

 def__check_handler(self):
   _handlers=self.log_config.get("handlers","keys").split(",")
   self.handlers={}
   forhandlerin_handlers:
     handler=handler.strip()
     ifhandler:
       handler_section_name=self.handler_prefix+handler
       ifnotself.log_config.has_section(handler_section_name):
         raiseException("ERROR:nohandlersectionname:{0}".format(handler_section_name))
       self.handlers.setdefault(handler,{})
       self.handlers[handler]["section_name"]=handler_section_name
   ifnotself.handlers:
     raiseException("ERROR:Nohandlerkeysin{0}".format(self.log_config_file))

 def__check_formatter(self):
   _formatters=self.log_config.get("formatters","keys").split(",")
   self.formatters={}
   forformatterin_formatters:
     formatter=formatter.strip()
     ifformatter:
       formatter_section_name=self.formatter_prefix+formatter
       ifnotself.log_config.has_section(formatter_section_name):
         raiseException("ERROR:noformattersectionname:{0}".format(formatter_section_name))
       self.formatters.setdefault(formatter,{})
       self.formatters[formatter]["section_name"]=formatter_section_name
   ifnotself.formatters:
     raiseException("ERROR:Noformatterkeysin{0}".format(self.log_config_file))

 defgetLogger(self,logger_name="root"):
   returnself.loggers[logger_name]["value"]


classTrace(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)

 definfo(self,key,info):
   self.logger.info("[{0}]:{1}".format(key,info))
 deferror(self,key,err_info):
   self.logger.error("[{0}]:{1}".format(key,err_info))
 defwarn(self,key,warn_info):
   self.logger.warn("[{0}]:{1}".format(key,warn_info))


deftest():
 log_key="root"
 t=Trace(log_config_file,log_key,log_data_file)
 t.info("TESTTRACE","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