python改变日志(logging)存放位置的示例
实现了简单版本的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
相关文章
- Python 编程 | 连载 11 - Python 集合
- mt4 python_一个使用Python自动化交易外汇MT4脚本实现「建议收藏」
- Python 爬虫 NO.2 HTTP 和 HTTPS
- python的进制转换器,Python进制转换[通俗易懂]
- python jieba库_Python jieba库的使用说明「建议收藏」
- python大数据分析实例-用Python整合的大数据分析实例
- 【Python】python文件打开方式详解——a、a+、r+、w+、rb、rt区别[通俗易懂]
- 【说站】python继承的多种类型
- Python招聘岗位信息聚合系统(拥有爬虫爬取、数据分析、可视化、互动等功能)
- Python数组切片_python print数组
- python分析人口出生率代码_国家统计局居然也能用的上Python?人口数据Python脚本了解一下?…[通俗易懂]
- python里面的缩进是什么意思_Python缩进规则(一看即懂)[通俗易懂]
- python中copy.deepcopy_Python eval
- python制作自动交易程序_Python如何实现自动化交易
- python type error是什么意思_Python 报错 TypeError:’DoesNotExist’对象不可调用
- 【视频】随机波动率SV模型原理和Python对标普SP500股票指数预测|数据分享|附代码数据
- Python 强化学习实用指南:11~14
- python 格式化字符详解编程语言
- Linux升级:升级Python到最新版本(linux升级python版本)
- Python实现Oracle数据库连接(python连接oracle数据库)
- 四款后起编程语言能否成功挑战Python的王者地位
- MySQL与Python的协同运行:一种全新的开发体验(mysql与python)
- 树莓派中python获取GY-85九轴模块信息示例