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

Glassfish 7中SLF4J/Logback配置问题求助

Glassfish 7 配置SLF4J/Logback 完整解决方案

针对Glassfish 7中SLF4J/Logback配置时JUL日志无法转发、日志缺失的问题,核心解决思路是适配Glassfish 7的类加载器层级变更,以下是可落地的步骤:

1. 部署依赖库到正确位置

Glassfish 7调整了ext类加载器的优先级,禁止使用<DOMAIN_HOME>/lib/ext,改用<DOMAIN_HOME>/lib目录部署全局依赖:

  • 部署以下Jar包到<DOMAIN_HOME>/lib:
    • slf4j-api.jar
    • logback-core.jar
    • logback-classic.jar
    • jul-to-slf4j.jar
  • 确保所有Jar包版本兼容(推荐使用SLF4J 2.x + Logback 1.4.x组合)

2. 修改全局日志配置文件

编辑<DOMAIN_HOME>/config/logging.properties,替换默认日志处理器以启用JUL到SLF4J的桥接:

# 替换默认处理器,仅保留SLF4J桥接器
handlers = org.slf4j.bridge.SLF4JBridgeHandler
# 允许所有级别日志转发
org.slf4j.bridge.SLF4JBridgeHandler.level = ALL
# 关闭Glassfish原生文件处理器,避免日志重复
com.sun.enterprise.server.logging.GFFileHandler.level = OFF
# 全局日志级别设为ALL,确保无遗漏
.level = ALL
# 禁用JUL自身的日志管理器,让桥接器接管
java.util.logging.manager = org.slf4j.bridge.SLF4JBridgeHandler

3. 配置Logback全局规则

在<DOMAIN_HOME>/lib目录下创建logback.xml(该目录下的配置会被全局类加载器读取),示例配置如下:

<configuration scan="true" scanPeriod="30 seconds">
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %X%n</pattern>
        </encoder>
    </appender>

    <!-- 文件滚动输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 使用Glassfish内置变量指定日志目录 -->
        <file>${com.sun.aas.instanceRoot}/logs/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${com.sun.aas.instanceRoot}/logs/application.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %X%n</pattern>
        </encoder>
    </appender>

    <!-- 根日志级别 -->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

4. 应用内依赖配置

如果是单个Web应用,避免将SLF4J/Logback库打包到WAR中(防止类加载冲突),仅在pom.xml中声明provided依赖:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.9</version>
    <scope>provided</scope>
</dependency>
  • 若需要应用单独的Logback配置,可将logback.xml放入应用的src/main/resources目录,会覆盖全局配置。

5. 验证配置有效性

编写测试代码验证JUL日志转发和MDC功能:

@WebServlet("/log-test")
public class LogTestServlet extends HttpServlet {
    private static final Logger slf4jLog = LoggerFactory.getLogger(LogTestServlet.class);
    private static final Logger julLog = Logger.getLogger(LogTestServlet.class.getName());

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 测试MDC
        MDC.put("requestId", UUID.randomUUID().toString());
        slf4jLog.info("SLF4J日志:请求处理中,MDC上下文已添加");
        
        // 测试JUL日志转发
        julLog.info("JUL日志:这是一条普通信息日志");
        julLog.severe("JUL日志:这是一条错误日志");
        
        MDC.clear();
        resp.getWriter().write("日志测试完成");
    }
}

启动Glassfish后访问该Servlet,查看<DOMAIN_HOME>/logs/application.log,应能看到SLF4J和JUL日志统一由Logback格式化,且MDC的requestId出现在SLF4J日志中。

常见问题说明

  • 此前Payara 6的方案不兼容Glassfish 7:Payara的Goodies是定制化扩展,Glassfish 7未继承该机制,需改用原生全局类加载器配置。
  • 应用内打包库导致JUL转发失败:JUL由系统类加载器管理,无法访问应用内的桥接类,必须全局部署桥接库。

内容的提问来源于stack exchange,提问作者Florian Geßner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:29:51