您好,我正在使用以下版本的 logback 和 Janino :
<dependency org="ch.qos.logback" name="logback-core" rev="1.0.11" conf="runtime"/>
<dependency org="ch.qos.logback" name="logback-classic" rev="1.0.11" conf="runtime"/>
<dependency org="org.codehaus.janino" name="janino" rev="2.6.1" conf="runtime"/>
Run Code Online (Sandbox Code Playgroud)
使用条件记录配置<if>是:
<root level="INFO">
<if condition='property("xxx").contains("dev")'>
<then>
<appender-ref ref="dev" />
</then>
</if>
</root>
Run Code Online (Sandbox Code Playgroud)
我看到的错误如下:
7:38:54,729 |-ch.qos.logback.classic.joran.action.RootLoggerAction 中的 INFO - 将 ROOT 记录器级别设置为 INFO 无法实例化 [ch.qos.logback.classic.LoggerContext] 报告异常:java.lang .NoSuchMethodError: org.codehaus.janino.ClassBodyEvaluator.setImplementedInterfaces([Ljava/lang/Class;)V 位于 ch.qos.logback.core.joran.conditional.PropertyEvalScriptBuilder.build(PropertyEvalScriptBuilder.java:48) 位于 ch.qos。 logback.core.joran.conditional.IfAction.begin(IfAction.java:67) 位于 ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:276) 位于 ch.qos.logback.core。 joran.spi.Interpreter.startElement(Interpreter.java:148) 位于 ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:130) 位于 ch.qos.logback.core.joran.spi。 EventPlayer.play(EventPlayer.java:50) 位于 ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:157) 位于 ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java: 143) 在 ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:106) 在 ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:56) 在 ch.qos.logback .classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75) 在 ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:148) 在 org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java …
考虑Java 的简单日志外观 (SLF4J) 。作为背景,它通过简单的外观模式提供 API ,通过将所需的绑定添加到类路径来在运行时确定底层日志记录后端。它可能是标准的java.util.logging、log4j、logback或tinylog。
客户端应用程序与日志记录后端的巧妙分离减少了特定应用程序与任何特定日志记录框架之间的耦合。这可以更轻松地将新实现的客户端与已选择日志记录后端的其他项目的现有代码集成。
因此,考虑到日志记录 API SLF4J,对于编译,您只需要slf4j-api,并且应避免将任何特定绑定(如slf4j-log4j12)包含为编译依赖项。
因此,slf4j-log4j12是运行时范围依赖项(而不是编译依赖项)的良好候选者,因为这将允许您在运行时在slf4j 绑定之间切换,而无需重新编译应用程序。
当我运行 jar 文件时,出现以下错误:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Run Code Online (Sandbox Code Playgroud)
问题是我没有使用 slf4j,我使用的是 log4j2。它由依赖项使用。Maven 正确地将 org.slf4j:slf4j-api 包含为我正在使用的库的传递依赖项。
我该如何摆脱这个警告?我什至不想记录这种依赖关系的问题。
我将此类LoggerProducer注入到@Statelessbean 中以生成日志条目,如此处所述。
问题是,当CustomerBean调用 时(甚至没有调用logger.info),该@Produces方法(检索 bean 类名)失败并显示NullPointerException。这段代码有什么问题?
@Named
@Singleton
public class LoggerProducer {
@Produces
public Logger produceLogger(InjectionPoint injectionPoint) {
return LoggerFactory.getLogger(
injectionPoint.getBean().getBeanClass()); // <- error here
}
}
Run Code Online (Sandbox Code Playgroud)
注入记录器的bean:
import org.slf4j.Logger;
@Stateless
@LocalBean
@Named
public class CustomerBean {
@Inject
private Logger logger;
......
logger.info("some message");
Run Code Online (Sandbox Code Playgroud) 我正在尝试以 JSON 格式获取日志输出。我通过配置 logback.xml 文件来实现它。是否可以通过YML 文件实现相同的目的?
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
<timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud) 我在 CI 环境中运行 Maven,并希望看到它的一些日志输出 - 但我不想看到有关下载工件等的常规消息。
我可以使用-q,但这也抑制了所有有用的东西。
Maven 使用 slf4j 并且默认情况下使用 slf4j-simple 后端,因此没有logging.properties等等,无论如何我如何找出哪个类生成日志消息?
例如,如果我有
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] XXX JDBC Driver - JDBC 4.2 [bundle]
[INFO] XXX JDBC Driver aggregate [pom]
[INFO]
[INFO] -----------------< XXX:XXX >------------------
[INFO] Building XXX JDBC Driver - JDBC 4.2 XXXX [1/2]
[INFO] -------------------------------[ bundle ]-------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ XXXX-jdbc ---
[INFO] Deleting XXXX/target
[INFO]
[INFO] --- maven-enforcer-plugin:1.3.1:enforce (enforce-java) @ XXX-jdbc …Run Code Online (Sandbox Code Playgroud) 我通过以下方式在 SLF4J 和 Log4j 中使用标记
final Marker marker = MarkerFactory.getMarker("boom");
logger.info(marker, "BLAH BLAH: {}", stuff);
Run Code Online (Sandbox Code Playgroud)
如何在输出的日志消息中包含标记。例如,我希望上面的代码输出如下内容:
INFO - (boom): BLAH BLAH: something
Run Code Online (Sandbox Code Playgroud)
目前标记未显示
INFO: BLAH BLAH: something
Run Code Online (Sandbox Code Playgroud)
我一直在尝试找到一种在 log4j.properties 中配置此功能的方法,但无法找到有关显示标记的任何信息。
我的 logback.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<jmxConfigurator/>
<statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
<property name="LOG_DIR" value="/tmp/logs"/>
<springProperty name="appName" source="spring.application.name"/>
<appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
some pattern
</Pattern>
</layout>
</appender>
<logger additivity="false" level="DEBUG"
name="xyz">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我试图从整个应用程序禁用调试日志,但找不到方法。我想打印 INFO、ERROR 级别的日志。
在我的项目中我使用 slf4j,
该项目包括一个使用的库org.apache.logging.log4j:log4j-api:2.14.0
因此,库通过以下方式获取其记录器org.apache.logging.log4j.LogManager.getLogger(abc.class)
我包含log4j-to-slf4j-2.x在我的项目中。但是,查看 log4j-to-slf4j-2.x 的内容显示该类没有实现。
当然,我的项目在运行时就死掉了NoClassDefFound org/apache/logging/log4j/LogManager
我缺少什么?
这不是重复的是否有一个让 log4j2 在 slf4j 上工作的适配器?因为我有一个特定的问题,需要与链接问题中提出的解决方案不同的解决方案。这个问题需要单独讨论。如果您不明白发生了什么,请停止废话结束!
我引入了spring-boot-starter-web,使用了自带的spring-boot-starter-logging框架,在yaml中指定了配置文件,启动报错yaml:
logging:
level:
root: info
com.felix.flink.tutorial.api: debug
config: classpath:logback-spring.xml
Run Code Online (Sandbox Code Playgroud)
行家:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.felix</groupId>
<artifactId>flink-tutorial-component</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
例外:
23:45:33.009 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@7abaedae
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:293)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:118)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:238)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:220)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:79)
at org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:56)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
at …Run Code Online (Sandbox Code Playgroud)