logging模块之输出台和日志处理

Zss 发表于:
1.配置一个最简单的输出台显示,用于平常脚本编写的调试很方便

这就可以解决在平时写脚本总是使用print 标准输出来打印信息来调试了,每次调试完忘了删除print,导致一些不需要的信息也打印出来了

所以使用logging来调试的话,调试信息不会被作为标准输出给输出

#coding:utf-8
from logging import *
basicConfig(level=INFO)

info('嘿嘿')

输出:
INFO:root:嘿嘿
2.配置控制台输出一个格式化的输出调试信息
#coding:utf-8
from logging import *

basicConfig(level=DEBUG,format = '时间:%(asctime)s 用户:%(name)s 文件名:%(filename)s 行数:[line:%(linen\
o)d] 日志级别:%(levelname)s 信息:%(message)s')

info('嘿嘿')
debug('哈哈')

输出:
时间:2018-08-21 22:56:46,289 用户:root 文件名:test.py 行数:[line:8] 日志级别:INFO 信息:嘿嘿
时间:2018-08-21 22:56:46,289 用户:root 文件名:test.py 行数:[line:9] 日志级别:DEBUG 信息:哈哈

logging.basicConfig函数各参数:

filename:指定日志文件名;

filemode:和file函数意义相同,指定日志文件的打开模式,’w’或者’a’;

format:指定输出的格式和内容,format可以输出很多有用的信息,

参数:作用

%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息

datefmt:指定时间格式,同time.strftime();

level:设置日志级别,默认为logging.WARNNING;

stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

3.不在控制台输出,只将输出信息保存到日志中

输出信息将会保存到log.txt中,以追加的方式

#coding:utf-8
from logging import *

basicConfig(level=DEBUG,format = '时间:%(asctime)s 用户:%(name)s 文件名:%(filename)s 行数:[line:%(lineno)d] 日志级别:%(levelname)s 信息:%(message)s',filename='log.txt',filemode='a')

info('嘿嘿')
debug('哈哈')
4.带有开关的控制台输出和日志打印,均可以分开设置
#coding:utf-8
import logging
from logging.handlers import RotatingFileHandler
import threading

class LogSignleton(object):
    def __new__(cls):
        mutex=threading.Lock()
        mutex.acquire() # 上锁,防止多线程下出问题
        if not hasattr(cls, 'instance'):
            cls.instance = super(LogSignleton, cls).__new__(cls)
            cls.instance.log_filename = 'C:\Users\Zss-pc\Desktop\Py\log\log1.txt' #log文件位置
            cls.instance.max_bytes_each = 51200 #单个文件大小
            cls.instance.backup_count = 10 #同一时刻可存留的日志数量
            cls.instance.fmt = '时间:%(asctime)s 用户:%(name)s 文件:%(filename)s 行数:[line:%(lineno)d] \n--> 级别:%(levelname)s 信息:%(message)s' #日志格式
            cls.instance.log_level_in_console = 10 #日志级别:CRITICAL = 50 ERROR = 40 WARNING = 30 INFO = 20 DEBUG = 10 NOTSET = 0
            cls.instance.log_level_in_logfile = 20 #日志级别:CRITICAL = 50 ERROR = 40 WARNING = 30 INFO = 20 DEBUG = 10 NOTSET = 0
            cls.instance.logger_name = 'test_logger' #用户名
            cls.instance.console_log_on = 1 #控制台输出开关
            cls.instance.logfile_log_on = 1 #日志输出开关
            cls.instance.logger = logging.getLogger(cls.instance.logger_name)
            cls.instance.__config_logger()
        mutex.release()
        return cls.instance

    def get_logger(self):
        return  self.logger

    def __config_logger(self):
        # 设置日志格式
        formatter = logging.Formatter(self.instance.fmt)

        if self.console_log_on == 1: # 如果开启控制台日志
            console = logging.StreamHandler()
            console.setFormatter(formatter)
            self.logger.addHandler(console)
            self.logger.setLevel(self.log_level_in_console)

        if self.logfile_log_on == 1: # 如果开启文件日志
            rt_file_handler = RotatingFileHandler(self.log_filename, maxBytes=self.max_bytes_each, backupCount=self.backup_count)
            rt_file_handler.setFormatter(formatter)
            self.logger.addHandler(rt_file_handler)
            self.logger.setLevel(self.log_level_in_logfile)

logsignleton = LogSignleton()
logger = logsignleton.get_logger()
logger.info('嘿嘿')

时间:2018-08-21 23:39:28,292 用户:test_logger 文件:test.py 行数:[line:49] 
--> 级别:INFO 信息:嘿嘿