测试人社区

logs重复输出:对logging进行封装后,再次调用,程序运行时,日志重复打印

各位大佬,请教个问题,对loggin进行简单封装后,再次调用,运行时日志重复打印 3次,debug查看也只看到调用的代码行有日志输出,不明白为啥会重复打印…封装代码如下:

import logging
import logging.handlers
import os
import time
class Logs(object):
    def __init__(self):
        self.logger=logging.getLogger("")

        LEVELS={
            'NOSET': logging.NOTSET,
            'DEBUG': logging.DEBUG,
            'INFO': logging.INFO,
            'WARNING': logging.WARNING,
            'ERROR': logging.ERROR,
            'CRITICAL': logging.CRITICAL
        }

        # 创建文件目录
        logs_dir='logs'
        if os.path.exists(logs_dir) and os.path.isdir(logs_dir):
            pass
        else:
            os.mkdir(logs_dir)
        # 修改log保存位置
        timestamp=time.strftime("%Y-%m-%d", time.localtime())
        logfilename='%s.log' % timestamp
        logfilepath=os.path.join(logs_dir, logfilename)
        rotatingFileHandler=logging.handlers.RotatingFileHandler(filename=logfilepath,
                                                                 maxBytes=1024 * 1024 * 50,
                                                                 backupCount=5,
                                                                 encoding = 'utf-8')
        # 设置输出格式
        formatter=logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
        rotatingFileHandler.setFormatter(formatter)
        # 控制台句柄
        console=logging.StreamHandler()
        console.setLevel(logging.NOTSET)
        console.setFormatter(formatter)
        # 添加内容到日志句柄中
        self.logger.addHandler(rotatingFileHandler)
        self.logger.addHandler(console)
        self.logger.setLevel(logging.NOTSET)

    def info(self, message):
        self.logger.info(message)

    def debug(self, message):
        self.logger.debug(message)

调用的代码(部分):

import socket
import subprocess
import os
import sys
from appium_po.untils.logs_until import Logs
class AppiumServerUntil():

    logs = Logs()
    """"检查端口是否被占用"""
    def check_port(self, host, port):
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # address = host+':'+str(port)
        try:
            s.connect((host,int(port)))
        except:
            self.logs.info('port {} is available!' .format(port))
            print('Unexpected error:',sys.exc_info()[0])
            return True
        else:
            self.logs.info('port {} is uesd!'.format(port))
            return False

运行日志输出:
image

你这个问题解决了吗?我也出现了这个问题

在这个地方加个断点,看看下你执行的过程中有几次会调用到它。

这样的写法会导致并没有真正的初始化,有可能会拿到之前的同名的logger。建议是你传入不同的名字区分下。或者判断下是不是已经存在过了,如果存在过了,就不用重新再去添加各种handler了

根据经验目测应该是这里的问题

每次在创建日志对象的时候,对象的名字都是同一个,那么多次打印日志的时候就会呈现行增加,第二次打印2条,第三次打印3条这种。

最好的办法是可以去判断logger.handlers,如果存在就不去重复生成


在这里加上 if not logger.handlers

或者每次在getlogger的时候给不同的名字