Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76087
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-12 22:31
文章分类

全部博文(26)

文章存档

2016年(26)

我的朋友

分类: Python/Ruby

2016-12-13 17:17:53

一,单文件日志


单文件

  1. import logging
  2. logging.basicConfig(filename="example.log",
  3.                     format="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s", # 定义日志格式
  4.                     datefmt="%Y-%m-%d %H:%M:%S %p", # 定义日期格式
  5.                     level=10) # 也可以这样写,level=logging.DEBUG,至少是这个级别才会写入文件。(尤其注意这一点)
  6. logging.debug('debug')
  7. logging.info('info')
  8. logging.warning('warning')
  9. logging.error('error')
  10. logging.critical('critical')
  11. logging.log(10, 'log')

  12. #日志等级
  13. # CRITICAL = 50
  14. # FATAL = CRITICAL
  15. # ERROR = 40
  16. # WARNING = 30
  17. # WARN = WARNING
  18. # INFO = 20
  19. # DEBUG = 10
  20. # NOTSET = 0
格式如下:



二,多文件操作


对于上述记录日志的功能,只能将日志记录在单文件中,如果想要设置多个日志文件,logging.basicConfig将无法完成,需要自定义文件和日志操作对象。


多文件操作

  1. # 定义文件
  2. file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8')
  3. fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
  4. file_1_1.setFormatter(fmt)

  5. file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8')
  6. fmt = logging.Formatter()
  7. file_1_2.setFormatter(fmt)

  8. # 定义日志
  9. logger1 = logging.Logger('s1', level=logging.ERROR)
  10. logger1.addHandler(file_1_1)
  11. logger1.addHandler(file_1_2)


  12. # 写日志
  13. logger1.critical('1111')

  14. # ------------------------------------------



  15. # 定义文件
  16. file_2_1 = logging.FileHandler('l2_1.log', 'a')
  17. fmt = logging.Formatter()
  18. file_2_1.setFormatter(fmt)

  19. # 定义日志
  20. logger2 = logging.Logger('s2', level=logging.INFO)
  21. logger2.addHandler(file_2_1)

  22. logger2.critical('2222')


三,日志输出的位置

handler

handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象


每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
1) logging.StreamHandler
使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
StreamHandler([strm])
其中strm参数是一个文件对象。默认是sys.stderr


2) logging.FileHandler
和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文件名,必须指定一个文件名。
mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。

3) logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。


4) logging.handlers.TimedRotatingFileHandler
这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
interval是时间间隔。
when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时代表星期一)
midnight 每天凌晨


1,日志输出到屏幕和输出到文件的对比:

  1. import logging
  2. # 如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识 了
  3. # Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:
  4. # logger提供了应用程序可以直接使用的接口;
  5. # handler将(logger创建的)日志记录发送到合适的目的输出;
  6. # filter提供了细度设备来决定输出哪条日志记录;
  7. # formatter决定日志记录的最终输出格式。

  8. logger = logging.getLogger('test_log')
  9. logger.setLevel(logging.DEBUG)

  10. # ---------打印日志到屏幕
  11. stream = logging.StreamHandler()
  12. stream.setLevel(logging.DEBUG)
  13. formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
  14. stream.setFormatter(formatter)
  15. logger.addHandler(stream)

  16. # --------输出日志到文件
  17. file_log = logging.FileHandler("file.log")
  18. file_log.setLevel(logging.DEBUG)
  19. f_formatter = logging.Formatter("%(asctime)s _ %(name)s _ %(levelname)s _ %(message)s")
  20. file_log.setFormatter(f_formatter)
  21. logger.addHandler(file_log)


  22. logger.debug('debug message')
  23. logger.info('info message')
  24. logger.warn('warn message')
  25. logger.error('error message')
  26. logger.critical('critical message')


2,日志轮询,可对日志进行定制。根据时间,大小等,来进行轮询,同时定制保留的日志数量等。

  1. import logging
  2. import time
  3. from logging import handlers

  4. logger = logging.getLogger(__name__)

  5. log_file = "timelog.log"
  6. #fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
  7. fh = handlers.TimedRotatingFileHandler(filename=log_file, when="S", interval=5, backupCount=3)


  8. formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
  9. fh.setFormatter(formatter)
  10. logger.addHandler(fh)


  11. logger.warning("test1")
  12. logger.warning("test12")
  13. time.sleep(5)
  14. logger.warning("test13")
  15. logger.warning("test14")

详细的用法可参考:http://www.cnblogs.com/alex3714/articles/5161349.html

阅读(1392) | 评论(0) | 转发(0) |
0

上一篇:序列化、反序列化模块、时间模块

下一篇:没有了

给主人留下些什么吧!~~