【JAVA】测试“日志输出”的方法

一、通用场景

public abstract class BaseCheckLog {
    
    @Rule
    public TestName name = new TestName();
    
    PrintStream console = System.out;
    PrintStream printStream;
    
    @Before
    public void before() throws FileNotFoundException {
        File f = new File(name.getMethodName());
        f.delete();
        FileOutputStream fileOutputStream = new FileOutputStream(f);
        printStream = new PrintStream(fileOutputStream, true);
        System.setOut(printStream);
    }
    
    @After
    public void after() {
        File f = new File(name.getMethodName());
        f.delete();
    }
    
    protected void containLog(String msg) {
        printStream.close();
        System.setOut(console);
        boolean flag = false;
        
        try {
            BufferedReader reader = new BufferedReader(new FileReader(name.getMethodName()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
                if (line.contains(msg)) {
                    flag = true;
                    break;
                }
            }
            reader.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        
        Assert.assertTrue(flag);
    }
    
}

测试类继承BaseCheckLog, 使用containLog方法测试是否包含相关日志内容。

二、log4j场景

1、 重写org.slf4j.impl.StaticLoggerBinder, 将Log4jLoggerFactory替换成SubstituteLoggerFactory

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache license, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the license for the specific language governing permissions and
 * limitations under the license.
 */
package org.slf4j.impl;

import org.apache.logging.slf4j.Log4jLoggerFactory;
import org.slf4j.ILoggerFactory;
import org.slf4j.helpers.SubstituteLoggerFactory;
import org.slf4j.spi.LoggerFactoryBinder;

/**
 * SLF4J LoggerFactoryBinder implementation using Log4j. This class is part of the required classes used to specify an
 * SLF4J logger provider implementation.
 */
public final class StaticLoggerBinder implements LoggerFactoryBinder {

    /**
     * Declare the version of the SLF4J API this implementation is compiled
     * against. The value of this field is usually modified with each release.
     */
    // to avoid constant folding by the compiler, this field must *not* be final
    public static String REQUESTED_API_VERSION = "1.6"; // !final

    private static final String LOGGER_FACTORY_CLASS_STR = SubstituteLoggerFactory.class.getName();

    /**
     * The unique instance of this class.
     */
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();

    /**
     * The ILoggerFactory instance returned by the {@link #getLoggerFactory}
     * method should always be the same object
     */
    private final ILoggerFactory loggerFactory;

    /**
     * Private constructor to prevent instantiation
     */
    private StaticLoggerBinder() {
        loggerFactory = new SubstituteLoggerFactory();
    }

    /**
     * Returns the singleton of this class.
     *
     * @return the StaticLoggerBinder singleton
     */
    public static StaticLoggerBinder getSingleton() {
        return SINGLETON;
    }

    /**
     * Returns the factory.
     * @return the factor.
     */
    @Override
    public ILoggerFactory getLoggerFactory() {
        return loggerFactory;
    }

    /**
     * Returns the class name.
     * @return the class name;
     */
    @Override
    public String getLoggerFactoryClassStr() {
        return LOGGER_FACTORY_CLASS_STR;
    }
}

2、示例

public class Log4j2Test {
    private static final Logger LOGGER = LoggerFactory.getLogger(Log4j2Test.class);

    private static void printInfo() {
        LOGGER.info("This is a log4j demo.");
    }

    @Test
    public void testLog() {
        SubstituteLoggerFactory loggerFactory = (SubstituteLoggerFactory) LoggerFactory.getILoggerFactory();
        Queue<SubstituteLoggingEvent> logsList = loggerFactory.getEventQueue();
        logsList.clear();

        printInfo();

        assertTrue(logsList.stream().anyMatch(item ->
                item.getMessage().contains("This is a log4j demo.") &&
                        item.getLevel().toString().equalsIgnoreCase("info")));
    }

}

三、logback场景

示例:

public class LogbackTest {
    public static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);

    private static void printLog() {
        LOGGER.info("This is a logback demo.");
    }

    @Test
    public void testLog() {
        ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LogbackTest.class);
        ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
        listAppender.start();
        logger.addAppender(listAppender);

        printLog();

        assertTrue(listAppender.list.stream().anyMatch(item ->
                item.getMessage().contains("This is a logback demo.") &&
                        item.getLevel().toString().equalsIgnoreCase("info")));
    }

}

================================

end.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值