一、通用场景
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.