Python logging基本使用

1、打印到控制台

import logging


def log_test():
    logging.debug('This is debug message')
    logging.warning('This is warning message')
    logging.info('This is info message')
    logging.error('This is error message')


log_test()

运行结果

PS:可以看到 只有 logging.warning()和logging.error() 能打印输出到控制台,因为logging默认设置的等级是 warning,等级低于warning的都不会打印出来。

等级: https://docs.python.org/zh-cn/3/library/logging.html

2、修改logging等级为DEBUG后,打印到控制台

import logging


def log_test():
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('This is debug message')
    logging.warning('This is warning message')
    logging.info('This is info message')
    logging.error('This is error message')


log_test()

运行结果

PS : 日志级别: debug < info < warning < error < critical

3、保存到日志文件中,通过 logging.basicConfig() 设置

# -*- coding: UTF-8 -*-

import logging
    
def saveToLogFile():
    logging.basicConfig(
                        filename = 'saveMessage.log', #保存文件路径
                        filemode = 'a',#保存方式,有 w 和 a 模式,默认不写为追加 a 模式
                        format = '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s' #日志格式
                        )
    logging.warning('This is warning')
    
saveToLogFile()    

运行结果

2019-08-27 14:00:58,463 - D:\E_DISK\product\eclipse\logFileDemo\src\com\logFileDemo.py[line:24] - WARNING: This is warning

PS : 这是 saveMessage.log 文件中生成的日志信息

     如果在 logging.basicConfig() 设置 filename 和 filemode,则只会保存 log 到文件,不会输出到控制台

4、实现记录日志到文件的同时输出到屏幕,日志文件只有一个。

import logging
import os


def get_logger(filename, logger_name='ROOT', fmt=None):
    if not fmt:
        fmt = '[%(asctime)s][%(levelname)s]%(message)s'

    log = logging.getLogger(logger_name)  # 获取日志logger
    log.setLevel(logging.DEBUG)  # 设置记录日志等级

    if not log.handlers:
        # 如果之前没有该logger的handlers,则添加新的handlers,否则不添加
        # 如果不加该判断,当logger_name相同时会出现日志重复问题
        formatter = logging.Formatter(fmt)  # 记录日志的格式
        stream_handler = logging.StreamHandler()  # 控制台日志句柄
        stream_handler.setLevel(logging.DEBUG)  # 控制台等级
        stream_handler.setFormatter(formatter)  # 控制台输出格式
        log.addHandler(stream_handler)  # 添加控制台句柄

        if filename:  # 如果要输出到屏幕的同时保存到文件
            filename = os.path.abspath(filename)  # 日志文件的绝对路径
            path = os.path.dirname(filename)  # 日志文件的路径
            if not os.path.exists(path):  # 不存在则创建
                os.makedirs(path)
            file_handler = logging.FileHandler(filename)  # 文件句柄
            file_handler.setLevel(logging.DEBUG)  # 文件的记录等级
            file_handler.setFormatter(formatter)  # 文件的记录格式
            log.addHandler(file_handler)  # 添加文件句柄
    return log  # 返回句柄


def debug():
    console_log = get_logger(None)  # 只输出到屏幕
    console_log.debug('debug message')
    console_log.info('info message')
    console_log.warning('warning message')
    console_log.error('error message')

    file_log = get_logger('log.log', 'FILE_HANDLER')  # 输出到屏幕的同时记录到文件
    file_log.debug('debug message1')
    file_log.info('info message1')
    file_log.warning('warning message1')
    file_log.error('error message1')


if __name__ == '__main__':
    debug()

运行截图

5、实现记录日志信息到文件的同时输出到屏幕。日志文件保存十个,且回滚。

import logging
import logging.handlers
import os


def init_logger(log_name='logs/log.log',  # 日志文件的名称
                logger_name='ROOT',  # 日志的logger名称
                max_bytes=1024 * 1024 * 1,  # 每个文件的大小
                backup_count=10,  # 保存的日志文件个数
                mode='a',  # 追加的方式保存
                fmt_string='[%(asctime)s][%(name)s][%(levelname)s]%(message)s',  # 输出日志格式
                record_level=logging.INFO,  # 记录所有日志的等级,大于该等级的日志信息才会被记录
                console_level=logging.INFO,  # 控制台记录日志的等级,大于该等级的日志信息才会被记录
                file_level=logging.INFO):  # 文件记录日志的等级,大于该等级的日志信息才会被记录
    log_name = os.path.abspath(log_name)  # 日志名称的绝对路径
    log_path = os.path.dirname(log_name)  # 日志的路径
    if not os.path.exists(log_path):  # 不存在日志路径则创建
        os.makedirs(log_path)  # 创建路径
    fmt = logging.Formatter(fmt_string)  # 设置日志格式
    logger = logging.getLogger(logger_name)  # 设置logger的名称
    logger.setLevel(record_level)  # 设置记录所有日志的等级,大于该等级的日志信息才会被记录

    if not logger.handlers:  # 如果同名的logger没有handlers才添加handler,有了就不添加,否则会出现日志重复现象
        stream_handler = logging.StreamHandler()  # 控制台日志句柄,设置则可以打印到控制台
        stream_handler.setLevel(console_level)  # 设置打印到控制台日志等级
        stream_handler.setFormatter(fmt)  # 设置日志格式
        logger.addHandler(stream_handler)  # 添加控制台句柄

        # 设置回滚日志句柄
        rollback_handler = logging.handlers.RotatingFileHandler(log_name, mode, max_bytes,
                                                                backup_count)

        rollback_handler.setLevel(file_level)  # 设置回滚日志记录INFO以及以上信息
        rollback_handler.setFormatter(fmt)  # 设置日志格式
        logger.addHandler(rollback_handler)  # 添加回滚日志句柄
    return logger  # 返回句柄,以便于使用


def debug():
    for i in range(5000):
        log = init_logger(max_bytes=1024)
        log.debug('info message')
        log.info('info message')
        log.warning('info message')
        log.error('info message')


if __name__ == '__main__':
    debug()

 运行截图

posted @ 2019-08-27 14:50  南风丶轻语  阅读(1059)  评论(0编辑  收藏  举报