python 入坑路-logging模块

一、简述

很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误,警告灯信息输出,python的logging模块提供了标准的日志接口,你可以通过它来存储各种格式的日志,logging的日志可以分为,debug,info,warning,error和critical 5个级别, 等级依次递增。。。

二、简单用法

说明:日志级别有五个,分别是:debug,info,warning,error和critical,其中debug级别最低,critical级别最高,

 

 1 import logging
 2 
 3 
 4 logging.debug("logging debug")
 5 
 6 logging.info("logging info")
 7 
 8 logging.warning("user [niubi] attempted  wrong password more than 3 times")
 9 
10 logging.error("logging error")
11 
12 logging.critical("logging critical")

#输出 默认只输出 warning 及以下级别的日志
WARNING:root:user [niubi] attempted  wrong password more than 3 times
ERROR:root:logging error
CRITICAL:root:logging critical

 

日志输出到文件,执行多次,每次文件增加 append

 1 import logging
 2 
 3 
 4 logging.basicConfig(filename="loggin",level=logging.DEBUG)  #filemod="w" 每次覆盖日志,默认“a"  ,级别必须大写
 5 
 6 logging.debug("logging debug")
 7 
 8 logging.info("logging info")
 9 
10 logging.warning("user [niubi] attempted  wrong password more than 3 times")
11 
12 logging.error("logging error")
13 
14 logging.critical("logging critical")

给日志文件添加日期

 1 import logging
 2 
 3 
 4 logging.basicConfig(filename="loggin",filemode="w",level=logging.DEBUG,
 5                     format="%(asctime)s %(module)s %(levelname)s %(message)s",
 6                     datefmt="%m-%d-%Y %H:%M:%S %p")
 7 
 8 logging.debug("logging debug")
 9 
10 logging.info("logging info")
11 
12 logging.warning("user [niubi] attempted  wrong password more than 3 times")
13 
14 logging.error("logging error")
15 
16 logging.critical("logging critical")
#输出结果
01-05-2018 14:10:08 PM logging_tf DEBUG logging debug
01-05-2018 14:10:08 PM logging_tf INFO logging info
01-05-2018 14:10:08 PM logging_tf WARNING user [niubi] attempted wrong password more than 3 times
01-05-2018 14:10:08 PM logging_tf ERROR logging error
01-05-2018 14:10:08 PM logging_tf CRITICAL logging critical

关于format 参数

%(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

用户输出的消息

 

三、复杂日志输出

之前的写法感觉要么就输入在屏幕上,要么就是输入在日志里面,那我们有没有既可以输出在日志上,又输出在日志里面呢?很明显,当然可以。下面我们就来讨论一下,如何使用复杂的日志输出。

1、简介

python使用logging模块记录日志涉及的四个主要类:

①logger:提供了应用程序可以直接使用的接口。

②handler:将(logger创建的)日志记录发送到合适的目的输出。

③filter:提供了细度设备来决定输出哪条日志记录。

④formatter:决定日志记录的最终输出格式。

2、logger

①每个程序在输出信息之前都需要获得一个logger。logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的logger:

import logging

#create logging
logger=logging.getLogger()
logger.setLevel(logging.DEBUG)

#创建Handler
ch =logging.StreamHandler()
ch.setLevel(logging.INFO)

#文件handler
fh = logging.FileHandler("info.log",encoding="utf-8")
fh.setLevel(logging.WARNING)

#分别创建输出格式
ch_formatter= logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-"
                                "%(message)s")
fh_formatter= logging.Formatter("%(asctime)s-%(name)s-%(levelname)s"
                                "%(message)s")
#引用格式
ch.setFormatter(ch_formatter)
fh.setFormatter(fh_formatter)

#添加handler

logger.addHandler(ch)
logger.addHandler(fh)

#app log

logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")

 

posted @ 2018-01-05 16:03  东郭仔  阅读(170)  评论(0)    收藏  举报