Python logging

Python logging

1、logging

  • 什么是logging模块

   通俗讲就是:标准接口日志模块,用于记录日志python

  • logging日志级别 - (默认级别是:warning)
    • debug     10 - 调试相信信息
    • info      20 - 信息
    • warning   30 - 警告信息. 出现一些不想出现的错误
    • error     40 - 严重错误. 某些功能出现错误
    • critical  50 - 严重错误. 程序没法运行

     默认级别是warning网络

import logging
   
#   默认是root用户. 可进行修改的
logging.info("Test   info")
logging.debug("Test  debug")
logging.error("Test  error")
logging.warning("user [Harry] attempted wrong password more than 3 times")
logging.critical("server is down")
   
#    ps:以上命令在运行时.其中info and debug未打印出日志.是由于日志级别问题致使的.默认级别是warning.固然能够进行自定义日志级别
   
输出:
ERROR:root:Test  error
WARNING:root:user [Harry] attempted wrong password more than 3 times
CRITICAL:root:server is down  
  • 将日志写入文件中
logging.basicConfig(filename='Harry.log',level=logging.WARNING)
logging.info("Test   info")
logging.debug("Test  debug")
logging.error("Test  error")
logging.warning("user [Harry] attempted wrong password more than 3 times")
logging.critical("server is down") 
  • 当level=logging.WARNING时。 那么info and debug就不会打印,所以得出只会输出大于和自己级别的日志。 小于自己的日志级别是不会打印的,可设置成DEBUG测试
    • filename表示日志名称。 level表示设置日志级别(可进行更改) 
1 INFO:root:Test   info
2 DEBUG:root:Test  debug
3 ERROR:root:Test  error
4 WARNING:root:user [Harry] attempted wrong password more than 3 times
5 CRITICAL:root:server is down
6 ------------
7 ERROR:root:Test  error
8 WARNING:root:user [Harry] attempted wrong password more than 3 times
9 CRITICAL:root:server is down
Harry.log 
  • 日志格式
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger建立以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息

需求一:app

  • 将日志分别记录在日志里面.并按照需求打印格式:【如:日志中加时间、模块、级别等相关信息】
import logging
  
logging.basicConfig(filename='Harry.log',
                    level=logging.WARNING,
                    #   此处分别是什么意思.请查看日志格式中的各类解释
                    format='%(asctime)s %(filename)s:%(lineno)d:%(module)s:%(funcName)s - %(levelname)s: %(message)s',
                    datefmt='%Y/%d/%m %I:%M:%S %p')
logging.info("Test   info")
logging.debug("Test  debug")
logging.error("Test  error")
logging.warning("user [Harry] attempted wrong password more than 3 times")
logging.critical("server is down")
  
  
#   在函数中调用日志模块. 查看日志区别
def Run_start():
    logging.warning("user [Harry] attempted wrong password more than 3 times")
  
Run_start()  
 1 2017/17/08 10:09:38 PM 11_logging_模块.py - ERROR: Test  error
 2 2017/17/08 10:09:38 PM 11_logging_模块.py - WARNING: user [Yuhonglin] attempted wrong password more than 3 times
 3 2017/17/08 10:09:38 PM 11_logging_模块.py - CRITICAL: server is down
 4 2017/17/08 10:12:38 PM 11_logging_模块.py:46 - ERROR: Test  error
 5 2017/17/08 10:12:38 PM 11_logging_模块.py:47 - WARNING: user [Yuhonglin] attempted wrong password more than 3 times
 6 2017/17/08 10:12:38 PM 11_logging_模块.py:48 - CRITICAL: server is down
 7 2017/17/08 10:14:13 PM 11_logging_模块.py:46:11_logging_模块 - ERROR: Test  error
 8 2017/17/08 10:14:13 PM 11_logging_模块.py:47:11_logging_模块 - WARNING: user [Yuhonglin] attempted wrong password more than 3 times
 9 2017/17/08 10:14:13 PM 11_logging_模块.py:48:11_logging_模块 - CRITICAL: server is down
10 2017/17/08 10:15:05 PM 11_logging_模块.py:46:11_logging_模块:<module> - ERROR: Test  error
11 2017/17/08 10:15:05 PM 11_logging_模块.py:47:11_logging_模块:<module> - WARNING: user [Yuhonglin] attempted wrong password more than 3 times
12 2017/17/08 10:15:05 PM 11_logging_模块.py:48:11_logging_模块:<module> - CRITICAL: server is down
13 2017/17/08 10:15:42 PM 11_logging_模块.py:46:11_logging_模块:<module> - ERROR: Test  error
14 2017/17/08 10:15:42 PM 11_logging_模块.py:47:11_logging_模块:<module> - WARNING: user [Yuhonglin] attempted wrong password more than 3 times
15 2017/17/08 10:15:42 PM 11_logging_模块.py:48:11_logging_模块:<module> - CRITICAL: server is down
16 2017/17/08 10:15:42 PM 11_logging_模块.py:52:11_logging_模块:Run_start - WARNING: user [Yuhonglin] attempted wrong password more than 3 times
Harry.log 

需求二:ide

  • 如何同时将log打印在屏幕和文件日志里.?
  • Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的归纳最为合适:    
    • logger:  提供了应用程序能够直接使用的接口;
    • handler: 将(logger建立的)日志记录发送到合适的目的输出;
    • filter:  提供了细度设备来决定输出哪条日志记录;
    • formatter:决定日志记录的最终输出格式。
  • logger

   1.每一个程序在输出信息以前都要得到一个Logger。Logger一般对应了程序的模块名,好比聊天工具的图形界面模块能够这样得到它的Logger:
     LOG=logging.getLogger(”chat.gui”)
   2.而核心模块能够这样:
     LOG=logging.getLogger(”chat.kernel”)函数

     Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
     Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
     Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增长或删除指定的handler
     Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():能够设置的日志级别工具

  • handler

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

  • 每一个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',即添加到文件末尾。ui

   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并不会被改名,而是被删除。spa

   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 天天凌晨

  • 日志屏幕正常打印并写在文件中:
import logging
#   create logger   TEST-LOG表示建立日志的名字.
logger = logging.getLogger('TEST-LOG')
#   设置DEBUG级别.可修改为其余.
logger.setLevel(logging.DEBUG)

#   create console handler and set level to debug
#   建立handler 和设置日志级别.
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING)

#   create file handler and set level to warning
#   建立文件handler 和设置级别
fh = logging.FileHandler("Access.log",encoding="utf-8")
fh.setLevel(logging.ERROR)
#   以上建立了两个handler
#   定义日志格式fh_formatter 输入文件中格式  ch_formatter输入屏幕日志格式
fh_formatter = logging.Formatter('%(asctime)s %(filename)s:%(lineno)d:%(module)s: - %(levelname)s: %(message)s')
ch_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#   add formatter to ch and fh.
fh.setFormatter(fh_formatter)
ch.setFormatter(ch_formatter)

#   add ch and fh to logger
#   告诉log往那里输出.
logger.addHandler(fh)
logger.addHandler(ch)

logger.warning("Warning commint.............")
logger.error("errors  happend...............")  

       

需求三:  

 1 import logging
 2 
 3 from logging import handlers
 4 
 5 logger = logging.getLogger('TEST')
 6 
 7 #   定义日志名称
 8 log_file = "TimeOut.log"
 9 #   maxBytes定义文件中字节数    backupCount最多保留三个
10 fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3,encoding="utf-8")
11 
12 #   定义日志格式
13 formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
14 
15 fh.setFormatter(formatter)
16 
17 logger.addHandler(fh)
18 
19 logger.warning("test1")
20 logger.warning("test12")
21 logger.warning("test13")
22 logger.warning("test14")
23 logger.warning("test15")
24 logger.warning("test16")
25 logger.warning("test17")
日志文件自动截断_运行看效果  
 1 import logging
 2 
 3 from logging import handlers
 4 
 5 logger = logging.getLogger('TEST')
 6 
 7 #   定义日志名称
 8 log_file = "TimeOut.log"
 9 
10 #   按时间生成.when表示秒 对应的S可修改为D等其余的.
11 fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3,encoding="utf-8")
12 
13 #   定义日志格式
14 formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
15 
16 fh.setFormatter(formatter)
17 
18 logger.addHandler(fh)
19 import time
20 
21 logger.warning("test1")
22 time.sleep(2)
23 logger.warning("test12")
24 time.sleep(2)
25 logger.warning("test13")
26 logger.warning("test14")
27 time.sleep(2)
28 logger.warning("test15")
29 logger.warning("test16")
日志文件按时间自动生成_运行看效果
相关文章
相关标签/搜索