1.创建logger实例
logging模块是依靠调用Logger类的方法来实现的,Logger并不直接创建实例,而是通过调用logging.getLogger([name])创建logger实例,
每个实例都有自己的名字.
logger = logging.getLogger("mylogger")
2.日志的级别
logging模块通过事件的严重程度提供6种不同级别的日志记录,提示日志的重要程度.
Level 数值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0
模块默认设置的级别是WARNING 即当且仅当等于或高于WARNING的事件会被记录下来,
更改logger的默认level
logger.setLevel("INFO") //此时小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出.
例如:
logger.debug("this is debug message") # 不输出
logger.info("this is info message") # 输出
logger.warning("this is warning message") # 输出
3.创建一个handle对象,并为handler设置 level
通过handler对象可以将日志记录(log record)写到不同的地方(destination),比如文件,socket, 控制台.
python提供了十几种实用handler,比较常用有:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。
SocketHandler 用TCP网络连接写LOG
DatagramHandler 用UDP网络连接写LOG
SMTPHandler 把LOG写成EMAIL邮寄出去
RotatingFileHandler 指定了单个log文件的size的最大值和log文件的数量的最大值,
如果文件大于最大值,将分割为多个文件,如果log文件的数量多于最多个数,最老的log文件将被删除
fh = logging.FileHandler(logName) //logName是在某个路径下的log文件名mylogger
fh.setLevel(logLevel) //logLevel是传入的日志级别参数.
ch = logging.StreamHandler()
rh = logging.RotatingFileHandler(logName,maxBytes= ,backupCount= )
4.formatter对象,定义handler 格式化输出
formatter对象 可以指定日志记录的时间格式、进程号、文件名、函数名等信息.
几种常用格式:
%(asctime)s //默认的日期格式精确到微秒,例如‘2016-03-16 8:20:34,896'
%(name)s //logName mylogger
%(levelname)s // logLevel
%(message)s //日志信息logger.debug("this is debug message") this is debug message
%(filename)s //log.py
%(lineno)d //源文件中log日志被调用的行号,logger.info("this is info message")
log_format=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s-[%(filename)s:%(lineno)d]")
为创建的handler对象添加输出格式
fh.setFormatter(log_format)
5.为logger实例添加handler对象
每个logger可以拥有多个handler,通过addHandler()添加
logger.addHandler(fh)
6.调用logger实例对应级别的目志消息输出函数:
logger.debug("debug message")
logger.info(" info message")
logger.warning("warning message")
logger.critical("critical message")
logger.error("error message")
代码如下:
#coding=utf-8
import loggingimport logging.handlers
logDir=r"D:\logs"
def getLog():
#创建一个logger实例
logger = logging.getLogger("mylogger")
llogger.setLevel("DEBUG") #设置级别为DEBUG,覆盖掉默认级别WARNING
#创建一个handler,用于写入日志文件,handler可以把日志内容写到不同的地方
logName = logDir + r"\\" + "test.log"
fh = logging.FileHandler(logName)
fh.setLevel("WARNING")
#再创建一个handler,用于输出控制台
ch = logging.StreamHandler()
ch.setLevel("ERROR")
#定义handler的格式输出
log_format=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s-[%(filename)s:%(lineno)d]")
fh.setFormatter(log_format) #setFormatter() selects a Formatter object for this handler to use
ch.setFormatter(log_format)
#为logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")
if __name__ = "__main__":
getLog()
控制台输出:
2016-03-17 15:02:44,065-mylogger-ERROR-error message-[log.py:26]
2016-03-17 15:02:44,065-mylogger-CRITICAL-critical message-[log.py:27]
test.log文件输出:
2016-03-17 15:02:44,065-mylogger-WARNING-warning message-[log.py:25]
2016-03-17 15:02:44,065-mylogger-ERROR-error message-[log.py:26]
2016-03-17 15:02:44,065-mylogger-CRITICAL-critical message-[log.py:27]
也可以封装成一个类调用
#coding=utf-8
class Logger():
def __init__(self, lognName, logLevel, logger):
# 创建一个logger
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(logName)
fh.setLevel(logLevel)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logLevel)
# 定义handler的输出格式
log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s
-[%(filename)s:%(lineno)d]')
fh.setFormatter(log_format)
ch.setFormatter(log_format)
# 给logger添加handler
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getlog(self):
return self.logger
在另一个test.py文件中调用
from log import Logger
logger = Logger(logname='log.txt', loglevel="INFO", logger="test.py").getlog()
另:logging.basicConfig函数
basicConfig()是为root logger 创建一个句柄(StreamHandler),当未给root logger 创建一个句柄时,logging的debug() info() warning() error()和critical()函数会自动调用系统默认的basicConfig()函数
#coding=utf-8
import logging
LOG_FILENAME="D:\test\log.txt"
logging.basicConfig(logName=LOG_FILENAME,level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
logging.info("info message")
LOG_FILENAME="D:\test\log2.txt"
<pre name="code" class="python">logging.basicConfig(logName=LOG_FILENAME,level=logging.WARNING,format = '%(asctime)s - %(levelname)s: %(message)s')
logging.error("error message")
注:error message不会记录到D:\test\log2.txt,会全部记录到log.txt文件下
因为logger已经有一个句柄了,basicConfig不会创造一个新的句柄了,所以日志信息会输出到第一个日志文件下