首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >登录七月附件

登录七月附件
EN

Stack Overflow用户
提问于 2022-06-02 07:16:46
回答 1查看 33关注 0票数 0

是否有重定向到七月(java.util.logging)的Logback附录?

我有一个类似于这个问题的问题。我的应用程序运行在(WebSphere)上并使用Logback,因为我希望将日志消息写入一个单独的日志文件,作为应用程序服务器的默认日志文件的一个附加项。这允许为管理员和开发人员配置不同的日志级别。管理员在各自的日志文件中查看应用服务器日志和开发人员。

WebSphere内部使用7月。因此,常见的解决方案似乎是ConsoleAppender。起初,这似乎解决了这个问题。但不幸的是,日志级别丢失了,而不是有意义的日志级别代码(EWI、.)您总是得到O,正如上面的链接所以问题所指出的那样。这是因为ConsoleAppender只是写信给System.out和System.err。

我所能找到的关于七月号的所有资料要么是过时的,要么是关于七月到七月的桥的。这座桥对我来说不是解决办法。正如它的名称所示,它将JUL消息重定向到slf4j,在那里我们有相反的要求--将slf4j重定向到7月。尽管您可能可以解决桥接器的问题,但是它会在应用服务器环境中引起其他问题,而JUL是由内核管理的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-10 08:52:01

由于似乎没有解决办法,我们制定了自己的解决办法。它是基于这个Log4j解决方案的。

最重要的是,我们甚至可以在WebSphere控制台中启用跟踪。这意味着您可以使用Logback方法isDebugEnabled()isTraceEnabled()来检查WebSphere中是否启用了JUL跟踪级别。

附录:

代码语言:javascript
复制
package com.example.logging;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

import java.util.logging.Level;
import java.util.logging.Logger;

public class JulAppender extends AppenderBase<ILoggingEvent> {

    @Override
    protected void append(ILoggingEvent event) {
        Logger logger = Logger.getLogger(event.getLoggerName());
        if (logger == null) {
            System.out.println("Cannot obtain JUL " + event.getLoggerName() + ".");
            return;
        }

        ch.qos.logback.classic.Level logbackLevel = event.getLevel();
        Level level = JulLogbackEventConverter.convertLogbackToJulLevel(logbackLevel);
        logger.log(level, event.getFormattedMessage());
    }

}

将Logback转换为7月日志级别:

代码语言:javascript
复制
package com.example.logging;

import java.util.logging.Level;

public class JulLogbackEventConverter {

    public static Level convertLogbackToJulLevel(ch.qos.logback.classic.Level level) {
        if (level.equals(ch.qos.logback.classic.Level.OFF)) {
            return Level.OFF;
        } else if (level.equals(ch.qos.logback.classic.Level.ERROR)) {
            return Level.SEVERE;
        } else if (level.equals(ch.qos.logback.classic.Level.WARN)) {
            return Level.WARNING;
        } else if (level.equals(ch.qos.logback.classic.Level.INFO)) {
            return Level.INFO;
        } else if (level.equals(ch.qos.logback.classic.Level.DEBUG)) {
            return Level.FINER;
        } else if (level.equals(ch.qos.logback.classic.Level.TRACE)) {
            return Level.FINEST;
        } else if (level.equals(ch.qos.logback.classic.Level.ALL)) {
            return Level.ALL;
        }
        return Level.FINER;
    }

}

用于isDebugEnabled()等支持的Logback涡轮过滤器

代码语言:javascript
复制
package com.example.logging;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;
import org.slf4j.Marker;

public class JulLogbackFilter extends TurboFilter {
    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String s, Object[] objects,
                              Throwable throwable
    ) {
        java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(logger.getName());
        java.util.logging.Level julLevel = JulLogbackEventConverter.convertLogbackToJulLevel(level);
        if (julLogger.isLoggable(julLevel)) {
            return FilterReply.NEUTRAL;
        }
        return FilterReply.DENY;
    }
}

示例配置。我们使用此配置的目标是在单独的日志文件中写入信息消息,而不是“垃圾邮件”WebSphere的SystemOut.log。警告和错误应出现在SystemOut.log中。如果启用了跟踪,则应该将消息写入WebSphere的trace.log:

代码语言:javascript
复制
<configuration>
    <turboFilter class="com.example.logging.JulLogbackFilter" />
    
    <appender name="julAppender" class="com.example.logging.JulAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/myapp/myapp-web.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/myapp/myapp-web-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>60</maxHistory>
            <totalSizeCap>8GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <root level="TRACE">
        <appender-ref ref="julAppender" />
        <appender-ref ref="file" />
    </root>
</configuration>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72472129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档