是否有重定向到七月(java.util.logging)的Logback附录?
我有一个类似于这个问题的问题。我的应用程序运行在(WebSphere)上并使用Logback,因为我希望将日志消息写入一个单独的日志文件,作为应用程序服务器的默认日志文件的一个附加项。这允许为管理员和开发人员配置不同的日志级别。管理员在各自的日志文件中查看应用服务器日志和开发人员。
WebSphere内部使用7月。因此,常见的解决方案似乎是ConsoleAppender。起初,这似乎解决了这个问题。但不幸的是,日志级别丢失了,而不是有意义的日志级别代码(E、W、I、.)您总是得到O,正如上面的链接所以问题所指出的那样。这是因为ConsoleAppender只是写信给System.out和System.err。
我所能找到的关于七月号的所有资料要么是过时的,要么是关于七月到七月的桥的。这座桥对我来说不是解决办法。正如它的名称所示,它将JUL消息重定向到slf4j,在那里我们有相反的要求--将slf4j重定向到7月。尽管您可能可以解决桥接器的问题,但是它会在应用服务器环境中引起其他问题,而JUL是由内核管理的。
发布于 2022-11-10 08:52:01
由于似乎没有解决办法,我们制定了自己的解决办法。它是基于这个Log4j解决方案的。
最重要的是,我们甚至可以在WebSphere控制台中启用跟踪。这意味着您可以使用Logback方法isDebugEnabled()或isTraceEnabled()来检查WebSphere中是否启用了JUL跟踪级别。
附录:
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月日志级别:
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涡轮过滤器
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:
<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>https://stackoverflow.com/questions/72472129
复制相似问题