python import logging日志(日志封装)

目录

创建日志类并使用

1.初始化一个logger对象

1)引入模块

2)初始化变量,声明logger对象

3) 生成路径

4)指定logger输出格式

5)指定日志文件的输出级别

6) 自动分割日志文件

2.输入日志内容

开源日志实例

多日志输出实例


创建日志类并使用

如何使用python自带的 logging 模块实现日志功能

1.初始化一个logger对象

1)引入模块

import os
import logging
import sys

2)初始化变量,声明logger对象

LOG_PATH = 'logs'   #设置log路径
LOG_FILE = 'text.txt'    #设置log文件名

#设置根路径为起始位置
logger = logging.getLogger(__name__)

3) 生成路径

#生成log指定路径

if os.path.exists(LOG_PATH):
    pass
else:
    os.mkdir(LOG_PATH)

4)指定logger输出格式

    formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
    
    file_handler = logging.FileHandler("%s/%s" % (LOG_PATH, LOG_FILE))
    
    # 可以通过setFormatter指定输出格式
    file_handler.setFormatter(formatter)
    
    logger.addHandler(file_handler)

5)指定日志文件的输出级别

分为如下几个级别:

_nameToLevel = {
    'CRITICAL': CRITICAL,
    'FATAL': FATAL,
    'ERROR': ERROR,
    'WARN': WARNING,
    'WARNING': WARNING,
    'INFO': INFO,
    'DEBUG': DEBUG,
    'NOTSET': NOTSET,
} 

使用setLevel函数指定输出级别 指定之后将只显示级别以上的日志类型

logger.setLevel(logging.DEBUG)

6) 自动分割日志文件

python 提供了两个处理器,方便我们分割文件:

logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件

logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件

TimedRotatingFileHandler(filename='logs/info/' +
                          info_file_name,
                          when='MIDNIGHT',
                          interval=1,
                          backupCount=7,
                          encoding='utf-8')
# filename:日志文件名
# when:日志文件按什么维度切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周
#       这里需要注意,如果选择 D-天,那么这个不是严格意义上的'天',而是从你
#       项目启动开始,过了24小时,才会从新创建一个新的日志文件,
#       如果项目重启,这个时间就会重置。所以这里选择'MIDNIGHT'-是指过了午夜
#       12点,就会创建新的日志。
# interval:是指等待多少个单位 when 的时间后,Logger会自动重建文件。
# backupCount:是保留日志个数。默认的0是不会自动删除掉日志。

when是一个字符串用于描述滚动周期的基本单位,字符串的值及意义如下:

'S': Seconds

'M': Minutes

'H': Hours

'D': Days

'W': Week day (0=Monday)

'midnight': Roll over at midnight

interval: 滚动周期,单位有when指定,比如:when='D',interval=1,表示每天产生一个日志文件;

backupCount: 表示日志文件的保留个数

2.输入日志内容

#输出debug类型日志
logger.debug("debug")

#多参数传递  输入info类型日志
pam= "dshck"
pam2="cxjkdhc"
logger.info("%s%s"%(pam,pam2))

log.py 代码如下

import os
import logging
from logging.handlers import TimedRotatingFileHandler
import datetime
import json

LOG_PATH = "log"
LOG_INFO = '_info.log'
LOG_ERROR = '_error.log'


class logger:
    def __init__(self,prefix_name = "flask"):
        if os.path.exists(LOG_PATH):
            pass
        else:
            os.mkdir(LOG_PATH)
        self.prefix = prefix_name
        self.info_logger = logging.getLogger("info")
        self.error_logger = logging.getLogger("error")
        self.format = logging.Formatter('[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s]\
[%(filename)s:%(lineno)d]' '[%(levelname)s] : %(message)s')
        #指定文件位置文件名以及输出格式
        info_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_INFO))
        info_file_handler.setFormatter(self.format)
        error_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_ERROR))
        error_file_handler.setFormatter(self.format)
        self.info_logger.addHandler(info_file_handler)
        self.error_logger.addHandler(error_file_handler)
        # 指定日志的最低输出级别
        self.info_logger.setLevel(logging.NOTSET)
        self.error_logger.setLevel(logging.ERROR)

    def debug(self, msg, *args, **kwargs):
        self.info_logger.debug(msg, *args, **kwargs)

    def info(self, msg, *args, **kwargs):
        self.info_logger.info(msg, *args, **kwargs)

    def warn(self, msg, *args, **kwargs):
        self.info_logger.warning(msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        self.info_logger.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        self.error_logger.error(msg, *args, **kwargs)

    def fatal(self, msg, *args, **kwargs):
        self.error_logger.fatal(msg, *args, **kwargs)

    def critical(self, msg, *args, **kwargs):
        self.error_logger.critical(msg, *args, **kwargs)


# log =logger()
# log.info("jdshskh")
# log.error("hdskck")
# log.debug("1122debug")
# log.warn("warn")
# log.warning("warning")
# log.critical("critical")
# log.fatal("fatal")

log =logger("celery")
log.info("jdshskh")
log.error("hdskck")
log.debug("1122debug")
log.warn("warn")
log.warning("warning")
log.critical("critical")
log.fatal("fatal")

开源日志实例

import logging


logger = logging.getLogger()


def setup_logging(logfile, verbose):
    """
    设置日志记录到日志文件/控制台。
    :param logfile:要写入日志的文件的路径。
    :param verbose:如果为true,则启用详细日志记录。
    """
    root_logger = logging.getLogger()

    default_formatter = logging.Formatter('%(asctime)-15s (%(name)s) %(filename)s[line:%(lineno)d] : %(message)s')

    if verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO
    root_logger.setLevel(loglevel)

    console_log = logging.StreamHandler()
    console_log.setLevel(loglevel)
    console_log.setFormatter(default_formatter)
    root_logger.addHandler(console_log)

    if logfile in ('/dev/log', '/dev/syslog', '/var/run/syslog', '/var/run/log'):
        file_log = logging.handlers.SysLogHandler(address=logfile, facility='local1')
        syslog_formatter = logging.Formatter('beeswarm[%(process)d]: %(message)s')
        file_log.setFormatter(syslog_formatter)
    else:
        file_log = logging.FileHandler(logfile)
        file_log.setFormatter(default_formatter)
    file_log.setLevel(loglevel)
    root_logger.addHandler(file_log)

    # 日志按天自动创建
    """
    time_rotating_file_handler = handlers.TimedRotatingFileHandler(filename=logfile, when='S')
    #time_rotating_file_handler.setLevel(logging.ERROR)
    time_rotating_file_handler.setLevel(logging.INFO)
    time_rotating_file_handler.setFormatter(default_formatter)
    root_logger.addHandler(time_rotating_file_handler)
    """


if __name__ == '__main__':
    setup_logging(args.logfile, args.verbose)

    logger.info('Initializing BeeSwarm version {0}'.format(beeswarm.version))
    logger.debug('workdir = {0}, config = {1}, customize = {2}, clear_db = {3}, reset_password = {4}, max_sessions = {5}, start_webui = {6}.'.format(args.workdir,
config, args.customize, args.clearsessions, args.resetpw, args.max_sessions, not args.no_webui))
    logger.debug('workdir = {0}'.format())
    logger.error(...)
    logger.warning(...)

多日志输出实例

配置文件log_config.py

# -*- coding: utf-8 -*-
import os
import time
import logging.config

cur_path = os.path.dirname(os.path.realpath(__file__))  # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs')
if not os.path.exists(log_path):
    os.mkdir(log_path)  # 如果不存在这个logs文件夹,就自动创建一个


def setp_log():
    LOGGING_CONFIG = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            # 日志格式
            'simple': {
                'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'},
            # 简单格式
            'standard': {
                #'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'
                'format': '[%(asctime)s] [%(filename)s:%(lineno)s] [%(message)s]'
            },
        },
        # 定义具体处理日志的方式
        'handlers': {
            # 控制台输出
            'console_handler': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            # 默认记录所有日志,按日期滚动输出到文件
            'info_handler': {
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': os.path.join(log_path, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))),  # 按日分类
                'maxBytes': 1024 * 1024 * 5,  # 文件大小
                'backupCount': 5,  # 备份数
                'formatter': 'standard',  # 输出格式
                'encoding': 'utf-8',  # 设置默认编码,否则打印出来汉字乱码
            },
            # 输出错误日志
            #'error_handler': {
            'success_handler': {
                'level': 'CRITICAL',
                #'level': 'ERROR',
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': os.path.join(log_path, 'success-{}.log'.format(time.strftime('%Y-%m'))),  # 按月分类
                'maxBytes': 1024 * 1024 * 5,  # 文件大小
                'backupCount': 5,  # 备份数
                'formatter': 'standard',  # 输出格式
                'encoding': 'utf-8',  # 设置默认编码
            },

        },
        'loggers': {
            'log': {
                'handlers': ['console_handler', 'info_handler', 'success_handler'],
                'level': 'INFO',
                'propagate': True
            },
        }
    }
    logging.config.dictConfig(LOGGING_CONFIG)

测试代码aaa.py

# -*- coding: utf-8 -*-
import logging
from log_config import setp_log
setp_log()
logger = logging.getLogger('log')

logger.info("asdasd")
logger.critical("asd123")
logger.error("asd")
  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python日志模块是标准库中的一个模块,可以用来记录应用程序的日志信息。封装Python日志可以方便地统一管理应用程序的日志信息,使得应用程序的开发和维护更加容易。 以下是一个简单的Python日志封装的例子: ```python import logging class Logger(object): def __init__(self, logger_name): self.logger = logging.getLogger(logger_name) self.logger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_handler.setFormatter(formatter) self.logger.addHandler(console_handler) def info(self, msg): self.logger.info(msg) def error(self, msg): self.logger.error(msg) def warning(self, msg): self.logger.warning(msg) def debug(self, msg): self.logger.debug(msg) ``` 上面的代码定义了一个Logger类,该类封装Pythonlogging模块。在类的构造函数中,我们设置了日志的级别为INFO,并且添加了一个控制台输出的处理器。在类的方法中,我们分别封装了info、error、warning和debug级别的日志输出。在应用程序中,我们可以通过该类来统一管理应用程序的日志信息,例如: ```python logger = Logger('my_logger') logger.info('This is an info message.') logger.error('This is an error message.') logger.warning('This is a warning message.') logger.debug('This is a debug message.') ``` 通过上述代码,我们可以在控制台中看到相应级别的日志信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨痕诉清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值