Python之----日志模块

日志方法,最好是在全局,定义一次,不然会存在多次添加addHandler,导致日志重复打印。

1.简单的将日志打印到屏幕
import logging
logging.debug("this is debug")
logging.info("this is info")
logging.warning("this is warning")
logging.error("this is error")
logging.critical("this is critical")
屏幕打印信息:
WARNING:root:this is warning
ERROR:root:this is error
CRITICAL:root:this is critical
默认打印到屏幕的级别是warning
logging优先级:debug<info<warning<error<critical
2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置
import logging
logging.basicConfig(filename="test.log",
filemode="a",
level=logging.CRITICAL,
format="%(asctime)s %(module)s-[line:%(lineno)d] %(levelname)s %(message)s",
datefmt="%m-%d-%Y %I:%M:%S %p")
logging.debug("this is debug")
logging.info("this is info")
logging.warning("this is warning")
logging.error("this is error")
logging.critical("this is critical")
文件test.log内容:
12-08-2017 12:51:45 PM 1-[line:12] CRITICAL this is critical
filename="test.log":文件名
filemode="a"打开文件的模式,"a"或者"w"
level=logging.CRITICAL:指定日志级别。默认warning
format:指定输出格式和内容,有如下参数:
%(asctime)s:打印日志时间
%(module)s:打印日志输出函数的模块名
%(lineno)d:打印日志输出函数所在代码行
%(levelname)s:打印日志级别名称
%(message)s":打印日志内容
%(levelno)s: 打印日志级别的数值
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名,**.py
%(funcName)s: 打印日志的当前函数
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
datefmt="%m-%d-%Y %I:%M:%S %p":指定时间格式
3.将日志同时输出到文件和屏幕
#创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)#注意:这个地方的日志级别最好调到最低。如果这设置的级别 高于后面引擎设置的日志级别,后面引擎有可能不会记录日志。必须有这一项

#创建两个展示的引擎,ch是屏幕打印,fh是写到文件
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

fh = logging.FileHandler("fh.log",encoding="UTF-8")
fh.setLevel(logging.ERROR)
#创建两种日志存放格式
ch_formater = logging.Formatter("%(asctime)s %(module)s %(levelno)s %(message)s")
fh_formater = logging.Formatter("%(asctime)s %(module)s-[line:%(lineno)d] %(levelno)s %(message)s")
#每种展示引擎,设置不同的存放格式
ch.setFormatter(ch_formater)
fh.setFormatter(fh_formater)
#添加展示引擎
logger.addHandler(ch)
logger.addHandler(fh)
#调用日志。则这个时候会在添加过的展示引擎中展示日志。
logger.info("这是eror")
4.日志截断输出(按大小、时间)
import time,logging
from logging import handlers#与输出到文件不同,这个需要多导入一个
logger = logging.getLogger("TEST")
log_file = "timelog.log"
#fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3,encoding="UTF-8")
fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=4,backupCount=3,encoding="UTF-8")
formatter = logging.Formatter("%(asctime)s %(module)s-[line:%(lineno)d] %(levelname)s %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.warning("log 1 次")
time.sleep(2)
logger.warning("log 2 次")
time.sleep(2)
logger.warning("log 3 次")
5.封装到一个类,再调用
# -*- coding:utf-8 -*-
# Author Yan
#! /usr/bin/env python
#coding=gbk
import logging,os
class Logger:
def __init__(self,path,clevel=logging.DEBUG,Flevel = logging.DEBUG):
self.logger = logging.getLogger(path)
self.logger.setLevel(logging.DEBUG)
fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
#设置CMD日志
sh = logging.StreamHandler()
sh.setFormatter(fmt)
sh.setLevel(clevel)
#设置文件日志
fh = logging.FileHandler(path)
fh.setFormatter(fmt)
fh.setLevel(Flevel)
self.logger.addHandler(sh)
self.logger.addHandler(fh)
def debug(self,message):
self.logger.debug(message)
def info(self,message):
self.logger.info(message)
def war(self, message):
self.logger.warning(message)
def error(self, message):
self.logger.error(message)
def cri(self,message):
self.logger.critical(message)
if __name__ == "__main__":
a = Logger("test.log",logging.ERROR,logging.DEBUG)
a.logger.debug("haha")

转载于:https://www.cnblogs.com/h2o2mno2h2/p/8136228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值