一、简单使用
def TestLogBasic(): import logging logging.basicConfig(filename = 'log.txt', filemode = 'a', level = logging.NOTSET, format = '%(asctime)s - %(levelname)s: %(message)s') logging.debug('this is a message') logging.info("this is a info") logging.disable(30)#logging.WARNING logging.warning("this is a warnning") logging.critical("this is a critical issue") logging.error("this is a error") logging.addLevelName(88,"MyCustomError") logging.log(88,"this is an my custom error") try: raise Exception('this is a exception') except: logging.exception( 'exception') logging.shutdown()TestLogBasic()
说明:(此实例为最简单的用法,用来将log记录到log文件中)
1)logging.basicConfig()中定义默认的log到log.txt,log文件为append模式,处理所有的level大于logging.NOTSET的logging,log的格式定义为'%(asctime)s - %(levelname)s: %(message)s';
2)使用logging.debug()...等来log相应level的log;
3)使用logging.disable()来disable某个logging level;
4)使用logging.addLevelName增加自定义的logging level;
5)使用logging.log来log自定义的logging level的log;
输出的text的log如下:
2011-01-18 10:02:45,415 - DEBUG: this is a message 2011-01-18 10:02:45,463 - INFO: this is a info 2011-01-18 10:02:45,463 - CRITICAL: this is a critical issue 2011-01-18 10:02:45,463 - ERROR: this is a error 2011-01-18 10:02:45,463 - MyCustomError: this is an my custom error 2011-01-18 10:02:45,463 - ERROR: exception Traceback (most recent call last): File "testlog.py", line 15, in TestLogBasic raise Exception('this is a exception') Exception: this is a exception
二、logging的level
#logging level #logging.NOTSET 0 #logging.DEBUG 10 #logging.INFO 20 #logging.WARNING 30 #logging.ERROR 40 #logging.CRITICAL 50
logging的level对应于一个int,例如10,20...用户可以自定义logging的level。
可以使用logging.setLevel()来指定要处理的logger级别,例如my_logger.setLevel(logging.DEBUG)表示只处理logging的level大于10的logging。
三、Handlers
Handler定义了log的存储和显示方式。
NullHandler不做任何事情。
StreamHandler实例发送错误到流(类似文件的对象)。
FileHandler实例发送错误到磁盘文件。
BaseRotatingHandler是所有轮徇日志的基类,不能直接使用。但是可以使用RotatingFileHandler和TimeRotatingFileHandler。
RotatingFileHandler实例发送信息到磁盘文件,并且限制最大的日志文件大小,并适时轮徇。
TimeRotatingFileHandler实例发送错误信息到磁盘,并在适当的事件间隔进行轮徇。
SocketHandler实例发送日志到TCP/IP socket。
DatagramHandler实例发送错误信息通过UDP协议。
SMTPHandler实例发送错误信息到特定的email地址。
SysLogHandler实例发送日志到UNIX syslog服务,并支持远程syslog服务。
NTEventLogHandler实例发送日志到WindowsNT/2000/XP事件日志。
MemoryHandler实例发送日志到内存中的缓冲区,并在达到特定条件时清空。
HTTPHandler实例发送错误信息到HTTP服务器,通过GET或POST方法。
NullHandler,StreamHandler和FileHandler类都是在核心logging模块中定义的。其他handler定义在各个子模块中,叫做logging.handlers。
当然还有一个logging.config模块提供了配置功能。
四、FileHandler + StreamHandler
def TestHanderAndFormat(): import logging logger = logging.getLogger("simple") logger.setLevel(logging.DEBUG) # create file handler which logs even debug messages fh = logging.FileHandler("simple.log") fh.setLevel(logging.DEBUG) # create console handler with a higher log level ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # create formatter and add it to the handlers formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) fh.setFormatter(formatter) # add the handlers to logger logger.addHandler(ch) logger.addHandler(fh)# "application" code logger.debug("debug message") logger.info("info message") logger.warn("warn message") logger.error("error message") logger.critical("critical message")
TestHanderAndFormat()
说明:(此实例同时使用FileHandler和StreamHandler来实现同时将log写到文件和console)
1)使用logging.getLogger()来新建命名logger;
2)使用logging.FileHandler()来生成FileHandler来将log写入log文件,使用logger.addHandler()将handler与logger绑定;
3)使用logging.StreamHandler()来生成StreamHandler来将log写到console,使用logger.addHandler()将handler与logger绑定;
4)使用logging.Formatter()来构造log格式的实例,使用handler.setFormatter()来将formatter与handler绑定;
运行结果
simple.txt
2011-01-18 11:25:57,026 - simple - DEBUG - debug message 2011-01-18 11:25:57,072 - simple - INFO - info message 2011-01-18 11:25:57,072 - simple - WARNING - warn message 2011-01-18 11:25:57,072 - simple - ERROR - error message 2011-01-18 11:25:57,072 - simple - CRITICAL - critical message
console
2011-01-18 11:25:57,072 - simple - ERROR - error message 2011-01-18 11:25:57,072 - simple - CRITICAL - critical message
五、RotatingFileHandler
def TestRotating(): import glob import logging import logging.handlers LOG_FILENAME = 'logging_rotatingfile_example.out'# Set up a specific logger with our desired output level my_logger = logging.getLogger('MyLogger') my_logger.setLevel(logging.DEBUG)
# Add the log message handler to the logger handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=20, backupCount=5)
my_logger.addHandler(handler)
# Log some messages for i in range(20): my_logger.debug('i = %d' % i)
# See what files are created logfiles = glob.glob('%s*' % LOG_FILENAME)
for filename in logfiles: print(filename) TestRotating()
说明:
RotatingFileHandler指定了单个log文件的size的最大值和log文件的数量的最大值,如果文件大于最大值,将分割为多个文件,如果log文件的数量多于最多个数,最老的log文件将被删除。例如此例中最新的log总是在logging_rotatingfile_example.out,logging_rotatingfile_example.out.5中包含了最老的log。
运行结果:
logging_rotatingfile_example.out logging_rotatingfile_example.out.1 logging_rotatingfile_example.out.2 logging_rotatingfile_example.out.3 logging_rotatingfile_example.out.4 logging_rotatingfile_example.out.5
六、使用fileConfig来使用logger
import logging import logging.configlogging.config.fileConfig("logging.conf")
# create logger logger = logging.getLogger("simpleExample")
# "application" code logger.debug("debug message") logger.info("info message") logger.warn("warn message") logger.error("error message") logger.critical("critical message")
logging.conf文件如下:
[loggers] keys=root,simpleExample[handlers] keys=consoleHandler
[formatters] keys=simpleFormatter
[logger_root] level=DEBUG handlers=consoleHandler
[logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0
[handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,)
[formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=
运行结果:
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message 2005-03-19 15:38:55,979 - simpleExample - INFO - info message 2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message 2005-03-19 15:38:56,055 - simpleExample - ERROR - error message 2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
所有的类库文件存放在system/libraries 文件夹。大多数情况下你需要预先在controller中初始化后才能使用它们:$this->load->library('class name'); class name是你想要使用的类名。例如,要载入“表单验证类”,你可以这样做: $this->load->library('form_validation'); 一旦类库被载入,你就可以按照用户
所有的系统类库都位于 system/libraries/ 目录下,大多数情况下,在使用之前, 你要先在 控制器 中初始化它,使用下面的方法: $this->load->library('class_name'); 'class_name' 是你想要调用的类库名称,例如,要加载 表单验证类库,你可以这样做: $this->load->library('form_validation'); 一旦类
本文向大家介绍php使用GeoIP库实例,包括了php使用GeoIP库实例的使用技巧和注意事项,需要的朋友参考一下 需要注意的是maxmind是geoip数据库的提供方, 同时也提供了很多语言的sample和api说明文档。 比如php,和php的geoip库是有很大区别的,包含使用方式,接口函数。 php官方的geoip需要配置php环境,加载geoip.dll库,并在php.ini中指定GEO
本文向大家介绍使用C#的aforge类库识别验证码实例,包括了使用C#的aforge类库识别验证码实例的使用技巧和注意事项,需要的朋友参考一下 时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈。。。前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会。 这个系列我们玩玩aforge.net,套用官方都话就是一个专门为
本文向大家介绍Java常用类库Apache Commons工具类说明及使用实例详解,包括了Java常用类库Apache Commons工具类说明及使用实例详解的使用技巧和注意事项,需要的朋友参考一下 Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。下面是我这几年做开发过程中自己用过的工具类做简单介绍。 组件 功能介绍 BeanUtils 提供了对于
为了将其上下文化,我试图加载一个.dot文件,我真正关心的是标签,所以我的图将真正由字符串顶点组成,因此边也将是一个(字符串,字符串)结构。它真的很简单,因此我不介意实现自己的图结构来使用它,但我真的想利用DotimPorter。 如果有人能为我提供一些关于如何正确实现EdgeProvider的具体类以及如何使用DefaultEdge类的帮助,我将不胜感激。