You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Log4j日志展示在Allure报告中?求最优实现方案

将Log4j日志集成到Allure测试报告的最优方案

你当前手动封装AllureLogger的方式是可行的,但存在侵入性强的问题——需要替换项目中所有原有Log4j的日志调用,对于已有大量日志代码的项目来说改造成本很高。下面介绍一种更优雅、无侵入的最优方案:自定义Log4j Appender,让Log4j自动将日志同步到Allure报告。

核心思路

利用Log4j的扩展机制,自定义一个Appender,拦截所有Log4j日志事件,将其自动添加到Allure报告中,完全不需要修改业务代码里的日志调用逻辑。

1. 自定义Log4j2 Appender(推荐,适配Log4j2)

import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import io.qameta.allure.Allure;
import io.qameta.allure.model.Status;
import io.qameta.allure.model.StepResult;

import java.io.Serializable;
import java.util.UUID;

@Plugin(name = "AllureAppender", category = "Core", elementType = "appender", printObject = true)
public class AllureAppender extends AbstractAppender {

    protected AllureAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties) {
        super(name, filter, layout, ignoreExceptions, properties);
    }

    @Override
    public void append(LogEvent event) {
        // 格式化日志内容
        final String logContent = new String(getLayout().toByteArray(event));
        final String logLevel = event.getLevel().name();

        // 方式2:将日志封装为Allure测试步骤(更推荐,日志与测试流程关联更紧密)
        final String stepId = UUID.randomUUID().toString();
        final StepResult step = new StepResult()
                .setName(String.format("Log [%s]", logLevel))
                .setStatus(mapLogLevelToAllureStatus(event.getLevel()))
                .setStart(event.getTimeMillis())
                .setStop(System.currentTimeMillis());

        Allure.getLifecycle().startStep(stepId, step);
        Allure.getLifecycle().addAttachment("日志内容", "text/plain", null, logContent.getBytes());
        Allure.getLifecycle().stopStep(stepId);
    }

    // 映射Log4j日志级别到Allure状态
    private Status mapLogLevelToAllureStatus(org.apache.logging.log4j.Level level) {
        return switch (level) {
            case ERROR, FATAL -> Status.FAILED;
            case WARN -> Status.BROKEN;
            case INFO, DEBUG, TRACE -> Status.PASSED;
            default -> Status.PASSED;
        };
    }

    // Log4j插件工厂方法,用于配置文件加载
    @PluginFactory
    public static AllureAppender createAppender(
            @PluginAttribute("name") String name,
            @PluginElement("Filter") Filter filter,
            @PluginElement("Layout") Layout<? extends Serializable> layout,
            @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) {
        return new AllureAppender(name, filter, layout, ignoreExceptions, null);
    }
}

2. 配置Log4j2.xml

在Log4j2的配置文件中添加自定义的AllureAppender,指定要同步到Allure的日志级别和规则:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <!-- 控制台输出Appender(保留原有配置) -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <!-- 自定义Allure日志Appender -->
        <AllureAppender name="Allure">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <!-- 可选:添加Filter控制只同步指定级别或包的日志 -->
            <!-- <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> -->
        </AllureAppender>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="Allure"/> <!-- 启用Allure日志同步 -->
        </Root>
        <!-- 可选:单独配置某个包的日志是否同步到Allure -->
        <!-- <Logger name="com.yourproject" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="Allure"/>
        </Logger> -->
    </Loggers>
</Configuration>

方案优势

  • 完全无侵入:不需要修改项目中任何原有Log4j日志调用代码,logger.info()/logger.error()等写法保持不变
  • 统一管理:所有符合配置规则的日志都会自动同步到Allure报告,不会遗漏
  • 灵活可控:通过Log4j配置文件可以精准控制哪些级别、哪些包的日志需要同步到Allure
  • 报告可读性强:用步骤方式添加的日志会和测试流程关联,便于定位问题

对比你当前的实现

你的手动封装方式适合小型项目或临时需求,但对于中大型项目,自定义Appender的方式更高效、易维护,避免了大量代码修改的工作。

目前确实没有官方提供的Log4j与Allure集成库,自定义Appender是社区公认的最优解决方案。

内容的提问来源于stack exchange,提问作者abrakadabra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:14:53