通俗讲就是:标准接口日志模块,用于记录日志python
默认级别是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")
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
%(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
需求二:ide
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():能够设置的日志级别工具
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
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")