希望是一个简单的问题,但我的 google foo 没有让我失望 - 我有一个 maven 项目,我们在其中使用 SLF4J 和 Log4J 1.2 绑定。
我们现在想要迁移到 Log4j 2,特别是为了性能改进 - 但是,我一生都无法找到 log4j 2.0 绑定的 maven 依赖项。我在http://logging.apache.org/log4j/2.x/log4j-slf4j-impl/找到了一些注释,但没有提到任何依赖信息。
我也有点困惑,因为显然有两种方法可以将 slf4j 放在 log4j2(绑定或适配器)之上
将 slf4j 与 log4j2 绑定的正确方法是什么,如何定义 maven 依赖项?
在下面的第一个答案之后编辑添加一些代码,我遇到了异常:
线程“main”中的异常 java.lang.NoSuchMethodError: org/apache/logging/log4j/spi/AbstractLoggerWrapper.(Lorg/apache/logging/log4j/spi/AbstractLogger;Ljava/lang/String;)V 在 org.slf4j。 impl.SLF4JLogger.(SLF4JLogger.java:48)
聚甲醛:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>logging.test</groupId>
<artifactId>logtest2</artifactId>
<version>0.0.1</version>
<name>logtest2</name>
<description>logtest2</description>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j.adapters</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.0-beta3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId> …Run Code Online (Sandbox Code Playgroud) 我在基于 tomcat 的 Web 应用程序中使用 Logback 和 SLF4J。我没有使用任何 logback.xml 文件。一切都以编程方式完成。但是,我不时收到以下错误消息:
java.lang.ClassCastException: org.slf4j.helpers.SubstituteLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext.
Run Code Online (Sandbox Code Playgroud)
这是引发该异常的代码部分:
LoggerContext logCtx = (LoggerContext) LoggerFactory
.getILoggerFactory();
Run Code Online (Sandbox Code Playgroud)
我想知道我是否做错了什么。请协助。
我想在我的应用程序中使用 logback slf4j 实现,但是 activemq-all 通过包含 log4j 实现类破坏了类路径。我不是唯一面临这个问题的人,例如多个 SLF4J 绑定错误与 activemq-all-5.6.0.jar 所见证的那样。根据那篇文章,我必须将 activemq-all 替换为
org.apache.activemq:activemq-camel
org.apache.activemq:activemq-core
org.apache.activemq:activemq-console
org.apache.activemq:activemq-jaas
org.apache.activemq:activemq-optional
org.apache.activemq:kahadb
org.apache.geronimo.specs:geronimo-jms_1.1_spec
org.apache.geronimo.specs:geronimo-jta_1.0.1B_spec
org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec
org.apache.geronimo.specs:geronimo-annotation_1.0_spec.
Run Code Online (Sandbox Code Playgroud)
问题是我没有这些工件的完整 maven 依赖项(组 ID、工件 ID、版本)。有人可以为我提供现成的替代品吗
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud) 我在我的 Android 应用程序中使用 slf4j-android。医生说如果我写log.trace那么它和我写的几乎一样Log.v。但是默认的日志级别似乎是 INFO,而 logcat 只显示log.info及以上,我看不到如何更改默认值。
1) 如何配置 slf4j-android
2)如果我不能:是否还有其他适用于 Android 的 slf4j 实现,更可配置
我有一个 gradle 项目,结构如下所示
>
> main (one project)
> shared (another project)
> api
>> shared2 (another project)
Run Code Online (Sandbox Code Playgroud)
main 项目依赖于 shared 和 shared2 项目。shared 和 shared2 项目在其 src/ test/resources 文件夹中都有一个 logback-test.xml,主项目在其 src/ main/resources 文件夹中有一个 logback.xml 。
当我使用主 Application 类在 Eclipse 中运行主项目时,我期望在类路径中只加载 logback.xml。相反,我看到了发现多个 slf4j 绑定的警告,更重要的是,日志设置是从 logback-test.xml 而不是 logback.xml 应用的。这是进一步说明的文件夹结构
>
> main
> > src/main/resources
> > > logback.xml
> shared
> > src/test/resources
> > > logback-test.xml
> api/shared2
> > src/test/resources
> > > logback-test.xml
Run Code Online (Sandbox Code Playgroud)
在两个 logback-test.xml …
嗨,我在使用 logback 和 slf4j 时遇到问题,我正在编写简单的应用程序,稍后将其打包在 jar 中,我想使用 logback 添加日志记录
我正在使用:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.8.0</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>${commons.pool.version}</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在主要我有:
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
configurator.doConfigure(logbackFile)
Run Code Online (Sandbox Code Playgroud)
它用于在 jar 文件之外加载 logback.xml 配置
最有趣的是这个程序正在本地机器(Windows)上运行(读取 logback.xml,创建文件,写入文件)但是当我将它上传到远程服务器(linux)时我有奇怪的错误 …
我已经实现了一个由几个类组成的算法框架。对于日志记录,我使用 slf4j 和 logback。我的很多课程都有这样的代码:
protected final Logger logger = LoggerFactory.getLogger(Myclass.class);
...
logger.debug("Some debug information");
Run Code Online (Sandbox Code Playgroud)
现在我想打包我的代码并准备好生产。我如何处理日志代码?
所以理想情况下,用户应该能够启用/禁用日志记录。我通常有一个 logback.xml 配置文件,它在每个类的基础上指定日志级别。我应该在包中包含这样的文件吗?或者我应该期望用户自己编写或提供默认配置文件?
我确实有代码来配置算法:
/**
* Read algorithm confirguration from properties file
**/
protected Configuration(Properties properties){...}
Run Code Online (Sandbox Code Playgroud)
此函数读取属性文件并相应地设置许多算法参数。这可以用于启用/禁用各种类的日志记录吗?
我有一个运行基于 Spring 的 servlet 的 Tomcat 服务器。
我已经设置了[project root]/src/log4j.properties如下文件:
# Root logger option
log4j.rootLogger=WARN, stdout
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %d{HH:mm:ss} %m [%c{3}:%L]%n
log4j.logger.com.martincarney.bugTracker=DEBUG
log4j.logger.com.martincarney.bugTracker.controller=ERROR
Run Code Online (Sandbox Code Playgroud)
这正确地记录了我自己的代码,但似乎对我正在使用的各种库中的记录没有任何影响。例如,org.apache.*即使我添加log4j.logger.org.apache=WARN到我的 log4j.properties 中,我仍然会在 Tomcat 启动期间从Eclipse 控制台错误流中获取 INFO 日志。
我正在使用slf4j-api和slf4j-log4jjars,通过 Maven 获得。
如何在自己的代码之外控制日志记录级别和目标?
所以我研究了关于登录 Java(slf4j、log4j、logback 等)的最佳实践,似乎库之间同意记录 API 应该是什么样子。我一直阅读的建议是这样的代码,您可以在其中为每个类创建一个记录器:
class Foo{
Logger logger = Logger.getLogger(Foo.class);
//...
logger.info("my log message");
//...
}
Run Code Online (Sandbox Code Playgroud)
现在我并没有真正受益于为不同的类设置单独的记录器。为什么信息/调试/等。Logger 类中的方法不是静态的?
请不要给出诸如“好处是您可以根据类配置记录器。例如,您可以将各个类的日志级别设置为 DEBUG...”之类的回答,因为我认为这是您可以的也可以使用完全静态的 Logger 类来完成。
如果您环顾四周(例如在 stackoverflow 上:Log4J:创建 Logger 实例的策略),您会发现人们使用这样的习惯用法:
Logger.getLogger(Thread.currentThread().getStackTrace()[2].getClass().getCanonicalName());
Run Code Online (Sandbox Code Playgroud)
现在,您不必为每个类都创建一个记录器,而只需在静态(例如)info() 方法中调用上面的代码,您可以在其中确定调用类并应用所有记录器配置,就像您在其他情况下所做的一样。
那么谁能告诉我为什么有人应该为每个类使用一个记录器而不是使用一个静态记录器的真正原因?纯粹是历史原因吗?我错过了什么吗?我知道这可能会对性能产生影响,但它实际上在内存使用方面是积极的(当然在运行时方面是消极的)......
更新我想你甚至可以在静态信息/调试/等中使用这个代码。方法,它比上面的代码漂亮且性能更高:
Reflection.getCallerClass()
Run Code Online (Sandbox Code Playgroud)
然而,对该方法的支持似乎有问题 >=JDK7
我目前正在研究“log4j 1.x”与“logback”即(slf4j)的性能。
我可以将 async 附加到我的 logback,但我找不到任何可以异步我的 log4j 的链接。
异步仅在 log4j 2.x 中引入?或者有什么方法可以让我的 log4j 1.x 异步工作。
请帮助我。
谢谢你。
slf4j ×10
java ×6
logback ×6
log4j ×3
logging ×3
log4j2 ×2
android ×1
asynchronous ×1
binding ×1
build.gradle ×1
gradle ×1
maven ×1
production ×1
spring-boot ×1
tomcat ×1