注册个网站要多少钱wordpress浮动导航菜单
注册个网站要多少钱,wordpress浮动导航菜单,外贸人常用的app,牡丹江网络推广公司Python标准模块--logging参考http://www.cnblogs.com/zhbzz2007/p/5943685.html1 logging模块简介logging模块是Python内置的标准模块#xff0c;主要用于输出运行日志#xff0c;可以设置输出日志的等级、日志保存路径、日志文件回滚等#xff1b;相比print#xff0c;具备…Python标准模块--logging参考http://www.cnblogs.com/zhbzz2007/p/5943685.html1 logging模块简介logging模块是Python内置的标准模块主要用于输出运行日志可以设置输出日志的等级、日志保存路径、日志文件回滚等相比print具备如下优点可以通过设置不同的日志等级在release版本中只输出重要信息而不必显示大量的调试信息print将所有信息都输出到标准输出中严重影响开发者从标准输出中查看其它数据logging则可以由开发者决定将信息输出到什么地方以及怎么输出2 logging模块使用2.1 基本使用配置logging基本的设置然后在控制台输出日志import logging
logging.basicConfig(level logging.INFO,format %(asctime)s - %(name)s - %(levelname)s - %(message)s)
logger logging.getLogger(__name__)logger.info(Start print log)
logger.debug(Do something)
logger.warning(Something maybe fail.)
logger.info(Finish)运行时控制台输出2016-10-09 19:11:19,434 - __main__ - INFO - Start print log
2016-10-09 19:11:19,434 - __main__ - WARNING - Something maybe fail.
2016-10-09 19:11:19,434 - __main__ - INFO - Finishlogging中可以选择很多消息级别如debug、info、warning、error以及critical。通过赋予logger或者handler不同的级别开发者就可以只输出错误信息到特定的记录文件或者在调试时只记录调试信息。例如我们将logger的级别改为DEBUG再观察一下输出结果logging.basicConfig(level logging.DEBUG,format %(asctime)s - %(name)s - %(levelname)s - %(message)s)控制台输出可以发现输出了debug的信息。2016-10-09 19:12:08,289 - __main__ - INFO - Start print log
2016-10-09 19:12:08,289 - __main__ - DEBUG - Do something
2016-10-09 19:12:08,289 - __main__ - WARNING - Something maybe fail.
2016-10-09 19:12:08,289 - __main__ - INFO - Finishlogging.basicConfig函数各参数filename指定日志文件名filemode和file函数意义相同指定日志文件的打开模式w或者aformat指定输出的格式和内容format可以输出很多有用的信息参数作用%(levelno)s打印日志级别的数值
%(levelname)s打印日志级别的名称
%(pathname)s打印当前执行程序的路径其实就是sys.argv[0]
%(filename)s打印当前执行程序名
%(funcName)s打印日志的当前函数
%(lineno)d打印日志的当前行号
%(asctime)s打印日志的时间
%(thread)d打印线程ID
%(threadName)s打印线程名称
%(process)d打印进程ID
%(message)s打印日志信息datefmt指定时间格式同time.strftime()level设置日志级别默认为logging.WARNNINGstream指定将日志的输出流可以指定输出到sys.stderrsys.stdout或者文件默认输出到sys.stderr当stream和filename同时指定时stream被忽略2.2 将日志写入到文件2.2.1 将日志写入到文件设置logging创建一个FileHandler并对输出消息的格式进行设置将其添加到logger然后将日志写入到指定的文件中import logging
logger logging.getLogger(__name__)
logger.setLevel(level logging.INFO)
handler logging.FileHandler(log.txt)
handler.setLevel(logging.INFO)
formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
handler.setFormatter(formatter)
logger.addHandler(handler)logger.info(Start print log)
logger.debug(Do something)
logger.warning(Something maybe fail.)
logger.info(Finish)log.txt中日志数据为2016-10-09 19:01:13,263 - __main__ - INFO - Start print log
2016-10-09 19:01:13,263 - __main__ - WARNING - Something maybe fail.
2016-10-09 19:01:13,263 - __main__ - INFO - Finish2.2.2 将日志同时输出到屏幕和日志文件logger中添加StreamHandler可以将日志输出到屏幕上import logging
logger logging.getLogger(__name__)
logger.setLevel(level logging.INFO)
handler logging.FileHandler(log.txt)
handler.setLevel(logging.INFO)
formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
handler.setFormatter(formatter)console logging.StreamHandler()
console.setLevel(logging.INFO)logger.addHandler(handler)
logger.addHandler(console)logger.info(Start print log)
logger.debug(Do something)
logger.warning(Something maybe fail.)
logger.info(Finish)可以在log.txt文件和控制台中看到2016-10-09 19:20:46,553 - __main__ - INFO - Start print log
2016-10-09 19:20:46,553 - __main__ - WARNING - Something maybe fail.
2016-10-09 19:20:46,553 - __main__ - INFO - Finish可以发现logging有一个日志处理的主对象其他处理方式都是通过addHandler添加进去logging中包含的handler主要有如下几种handler名称位置作用StreamHandlerlogging.StreamHandler日志输出到流可以是sys.stderrsys.stdout或者文件
FileHandlerlogging.FileHandler日志输出到文件
BaseRotatingHandlerlogging.handlers.BaseRotatingHandler基本的日志回滚方式
RotatingHandlerlogging.handlers.RotatingHandler日志回滚方式支持日志文件最大数量和日志文件回滚
TimeRotatingHandlerlogging.handlers.TimeRotatingHandler日志回滚方式在一定时间区域内回滚日志文件
SocketHandlerlogging.handlers.SocketHandler远程输出日志到TCP/IP sockets
DatagramHandlerlogging.handlers.DatagramHandler远程输出日志到UDP sockets
SMTPHandlerlogging.handlers.SMTPHandler远程输出日志到邮件地址
SysLogHandlerlogging.handlers.SysLogHandler日志输出到syslog
NTEventLogHandlerlogging.handlers.NTEventLogHandler远程输出日志到Windows NT/2000/XP的事件日志
MemoryHandlerlogging.handlers.MemoryHandler日志输出到内存中的指定buffer
HTTPHandlerlogging.handlers.HTTPHandler通过GET或者POST远程输出到HTTP服务器2.2.3 日志回滚使用RotatingFileHandler可以实现日志回滚import logging
from logging.handlers import RotatingFileHandler
logger logging.getLogger(__name__)
logger.setLevel(level logging.INFO)
#定义一个RotatingFileHandler最多备份3个日志文件每个日志文件最大1K
rHandler RotatingFileHandler(log.txt,maxBytes 1*1024,backupCount 3)
rHandler.setLevel(logging.INFO)
formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
rHandler.setFormatter(formatter)console logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)logger.addHandler(rHandler)
logger.addHandler(console)logger.info(Start print log)
logger.debug(Do something)
logger.warning(Something maybe fail.)
logger.info(Finish)可以在工程目录中看到备份的日志文件2016/10/09 19:36 732 log.txt
2016/10/09 19:36 967 log.txt.1
2016/10/09 19:36 985 log.txt.2
2016/10/09 19:36 976 log.txt.32.3 设置消息的等级可以设置不同的日志等级用于控制日志的输出日志等级使用范围FATAL致命错误
CRITICAL特别糟糕的事情如内存耗尽、磁盘空间为空一般很少使用
ERROR发生错误时如IO操作失败或者连接问题
WARNING发生很重要的事件但是并不是错误时如用户登录密码错误
INFO处理请求或者状态变化等日常事务
DEBUG调试过程中使用DEBUG等级如算法中每个循环的中间状态2.4 捕获tracebackPython中的traceback模块被用于跟踪异常返回信息可以在logging中记录下traceback代码import logging
logger logging.getLogger(__name__)
logger.setLevel(level logging.INFO)
handler logging.FileHandler(log.txt)
handler.setLevel(logging.INFO)
formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
handler.setFormatter(formatter)console logging.StreamHandler()
console.setLevel(logging.INFO)logger.addHandler(handler)
logger.addHandler(console)logger.info(Start print log)
logger.debug(Do something)
logger.warning(Something maybe fail.)
try:open(sklearn.txt,rb)
except (SystemExit,KeyboardInterrupt):raise
except Exception:logger.error(Faild to open sklearn.txt from logger.error,exc_info True)logger.info(Finish)控制台和日志文件log.txt中输出Start print log
Something maybe fail.
Faild to open sklearn.txt from logger.error
Traceback (most recent call last):File G:\zhb7627\Code\Eclipse WorkSpace\PythonTest\test.py, line 23, in moduleopen(sklearn.txt,rb)
IOError: [Errno 2] No such file or directory: sklearn.txt
Finish也可以使用logger.exception(msg,_args)它等价于logger.error(msg,exc_info True,_args)将logger.error(Faild to open sklearn.txt from logger.error,exc_info True)替换为logger.exception(Failed to open sklearn.txt from logger.exception)控制台和日志文件log.txt中输出Start print log
Something maybe fail.
Failed to open sklearn.txt from logger.exception
Traceback (most recent call last):File G:\zhb7627\Code\Eclipse WorkSpace\PythonTest\test.py, line 23, in moduleopen(sklearn.txt,rb)
IOError: [Errno 2] No such file or directory: sklearn.txt
Finish2.5 多模块使用logging主模块mainModule.pyimport logging
import subModule
logger logging.getLogger(mainModule)
logger.setLevel(level logging.INFO)
handler logging.FileHandler(log.txt)
handler.setLevel(logging.INFO)
formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
handler.setFormatter(formatter)console logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)logger.addHandler(handler)
logger.addHandler(console)logger.info(creating an instance of subModule.subModuleClass)
a subModule.SubModuleClass()
logger.info(calling subModule.subModuleClass.doSomething)
a.doSomething()
logger.info(done with subModule.subModuleClass.doSomething)
logger.info(calling subModule.some_function)
subModule.som_function()
logger.info(done with subModule.some_function)子模块subModule.pyimport loggingmodule_logger logging.getLogger(mainModule.sub)
class SubModuleClass(object):def __init__(self):self.logger logging.getLogger(mainModule.sub.module)self.logger.info(creating an instance in SubModuleClass)def doSomething(self):self.logger.info(do something in SubModule)a []a.append(1)self.logger.debug(list a str(a))self.logger.info(finish something in SubModuleClass)def som_function():module_logger.info(call function some_function)执行之后在控制和日志文件log.txt中输出2016-10-09 20:25:42,276 - mainModule - INFO - creating an instance of subModule.subModuleClass
2016-10-09 20:25:42,279 - mainModule.sub.module - INFO - creating an instance in SubModuleClass
2016-10-09 20:25:42,279 - mainModule - INFO - calling subModule.subModuleClass.doSomething
2016-10-09 20:25:42,279 - mainModule.sub.module - INFO - do something in SubModule
2016-10-09 20:25:42,279 - mainModule.sub.module - INFO - finish something in SubModuleClass
2016-10-09 20:25:42,279 - mainModule - INFO - done with subModule.subModuleClass.doSomething
2016-10-09 20:25:42,279 - mainModule - INFO - calling subModule.some_function
2016-10-09 20:25:42,279 - mainModule.sub - INFO - call function some_function
2016-10-09 20:25:42,279 - mainModule - INFO - done with subModule.some_function首先在主模块定义了loggermainModule并对它进行了配置就可以在解释器进程里面的其他地方通过getLogger(mainModule)得到的对象都是一样的不需要重新配置可以直接使用。定义的该logger的子logger都可以共享父logger的定义和配置所谓的父子logger是通过命名来识别任意以mainModule开头的logger都是它的子logger例如mainModule.sub。实际开发一个application首先可以通过logging配置文件编写好这个application所对应的配置可以生成一个根logger如PythonAPP然后在主函数中通过fileConfig加载logging配置接着在application的其他地方、不同的模块中可以使用根logger的子logger如PythonAPP.CorePythonAPP.Web来进行log而不需要反复的定义和配置各个模块的logger。3 通过JSON或者YAML文件配置logging模块尽管可以在Python代码中配置logging但是这样并不够灵活最好的方法是使用一个配置文件来配置。在Python 2.7及以后的版本中可以从字典中加载logging配置也就意味着可以通过JSON或者YAML文件加载日志的配置。3.1 通过JSON文件配置JSON配置文件{version:1,disable_existing_loggers:false,formatters:{simple:{format:%(asctime)s - %(name)s - %(levelname)s - %(message)s}},handlers:{console:{class:logging.StreamHandler,level:DEBUG,formatter:simple,stream:ext://sys.stdout},info_file_handler:{class:logging.handlers.RotatingFileHandler,level:INFO,formatter:simple,filename:info.log,maxBytes:10485760,backupCount:20,encoding:utf8},error_file_handler:{class:logging.handlers.RotatingFileHandler,level:ERROR,formatter:simple,filename:errors.log,maxBytes:10485760,backupCount:20,encoding:utf8}},loggers:{my_module:{level:ERROR,handlers:[info_file_handler],propagate:no}},root:{level:INFO,handlers:[console,info_file_handler,error_file_handler]}
}通过JSON加载配置文件然后通过logging.dictConfig配置loggingimport json
import logging.config
import osdef setup_logging(default_path logging.json,default_level logging.INFO,env_key LOG_CFG):path default_pathvalue os.getenv(env_key,None)if value:path valueif os.path.exists(path):with open(path,r) as f:config json.load(f)logging.config.dictConfig(config)else:logging.basicConfig(level default_level)def func():logging.info(start func)logging.info(exec func)logging.info(end func)if __name__ __main__:setup_logging(default_path logging.json)func()3.2 通过YAML文件配置通过YAML文件进行配置比JSON看起来更加简介明了version: 1
disable_existing_loggers: False
formatters:simple:format: %(asctime)s - %(name)s - %(levelname)s - %(message)s
handlers:console:class: logging.StreamHandlerlevel: DEBUGformatter: simplestream: ext://sys.stdoutinfo_file_handler:class: logging.handlers.RotatingFileHandlerlevel: INFOformatter: simplefilename: info.logmaxBytes: 10485760backupCount: 20encoding: utf8error_file_handler:class: logging.handlers.RotatingFileHandlerlevel: ERRORformatter: simplefilename: errors.logmaxBytes: 10485760backupCount: 20encoding: utf8
loggers:my_module:level: ERRORhandlers: [info_file_handler]propagate: no
root:level: INFOhandlers: [console,info_file_handler,error_file_handler]通过YAML加载配置文件然后通过logging.dictConfig配置loggingimport yaml
import logging.config
import osdef setup_logging(default_path logging.yaml,default_level logging.INFO,env_key LOG_CFG):path default_pathvalue os.getenv(env_key,None)if value:path valueif os.path.exists(path):with open(path,r) as f:config yaml.load(f)logging.config.dictConfig(config)else:logging.basicConfig(level default_level)def func():logging.info(start func)logging.info(exec func)logging.info(end func)if __name__ __main__:setup_logging(default_path logging.yaml)func()4 Reference每个 Python 程序员都要知道的日志实践Python标准模块loggingpython 的日志logging模块学习分类: Python标签: Python
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91429.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!