经过粗略的检查后,SLF4J 和 Guice(实际上是任何 DI 框架)似乎是一种相互冲突的理念。SLF4J 采用的方法是“嘿,我们要到运行时才知道要绑定到哪些类,那没关系。 ” 另一方面,Guice 似乎在说“嘿,我们需要在编译时知道”确切地说,我们要绑定到哪些类。 ”
所以我问:是否可以使用 Guice/Spring/任何 DI 框架来配置/注入 SLF4J 绑定?
更重要的是,JavaClassLoader才是真正在运行时使用适当的 Logger/LoggerFactory/等“注入”SLF4J 的东西。对象,所以我不知道如何注入这些类加载器,以便它们org.slf4j.impl.Logger在运行时返回我想要的:
我问这个问题是因为我喜欢 SLF4J 和针对 API 进行日志记录的好处,而且也喜欢 DI 的好处。有办法让这项工作发挥作用吗?提前致谢!
我想知道为什么没有
logger.log(level, ...)
Run Code Online (Sandbox Code Playgroud)
在 slf4j 中。有具体的原因吗?当从 log4j 迁移到 slf4j 并使用 logback 时,这让我头疼!
这或多或少是一个“常见”问题,但是,我还没有找到一个好的答案。所以,再次警告:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/eualin/.m2/repository/org/slf4j/slf4j-jcl/1.6.0/slf4j-jcl-1.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/eualin/.m2/repository/org/slf4j/slf4j-log4j12/1.5.11/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Run Code Online (Sandbox Code Playgroud)
假设它们都为我工作,显然,它们只是黑客,我不确定我是否应该依赖它们中的任何一个。你会推荐我什么?请记住,在终端中不会出现警告;仅当我通过 IntelliJIDEA 运行应用程序时。
任何建议都将受到高度赞赏。
我研究了其他类似的问题,并进行了一些谷歌搜索来找到我的答案,但我的问题仍然没有答案。我仍然不熟悉其中一些是如何工作的,所以请耐心等待。
我们的 maven pom.xml 使用 slf4j 依赖项:

我们的 log4j2.xml 文件如下所示:

我只将其添加到上面的 log4j2.xml 文件中<SMTP name="Mail" ...> </SMTP>,并在我添加的文件的下方<logger name="com.path.class1" ...> <appender ...> </logger>
但由于某种原因,当我调用 log.error("error message") 时,我的电子邮件没有发送给我。我知道 smtp 主机可以工作,因为它用于 .NET 服务。smtp 服务器不需要任何凭据即可使用它。我知道我的 log.error 调用位于正确的目录和文件路径中。我尝试过设置端口,但这没有任何区别。我该如何让电子邮件通知发挥作用?
我什至尝试了 mailAppender,但这也不起作用:
我实现了自己的 Maven 插件 mojo,其中使用了 log4j + slf4j。在插件项目中,我已经包含了正确的 jar,并且可以从代码中看到正确的语句记录。
现在我想在另一个客户端项目中使用这个新的 Maven 插件,但无法使其正常工作。
在插件本身中,我在 src/main/resources 下包含了一个 log4j.properties ,它可以正常工作,如上所述。但是,当我尝试将该插件包含在另一个客户端项目中时,不会创建日志文件。
问题是我还必须尝试或做什么才能使其正常工作?谢谢。
我想org.slf4j.Marker在我的应用程序中使用。我已经有一个 logback.xml 文件,无需标记即可正常工作。Java代码是这样的:
public class SimpleActivitiIntegrationService implements ActivitiIntegrationService {
private static final Marker PROCESS_INTEGRATION_MARKER = MarkerFactory.getMarker("PROCESS_INT");
private static final Logger LOGGER = LoggerFactory.getLogger(SimpleActivitiIntegrationService.class);
...
public void sendRequest(String s) throws RuntimeException {
LOGGER.debug(PROCESS_INTEGRATION_MARKER, "Method started:%s", "sendRequest");
}
}
Run Code Online (Sandbox Code Playgroud)
文件logback.xml是这样的:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${log.file.name}.${log.file.extension}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>
${log.path}/${archieve.dir.name}/${log.file.name}.%d{yyyy-MM-dd}.%i.${log.file.extension}
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 10MB -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 30 days' worth of history -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern> …Run Code Online (Sandbox Code Playgroud) 我正在将一个曾经使用 log4j 的应用程序迁移到 logback/slf4j,并且已经遇到了大约 2 周的问题...我做了一个小项目来测试 logback/slf4j 并且效果很好,但是在应用它时由于某种原因对于实际的应用程序来说,它只是不想工作。
我正在使用 JBoss 6.2 并将 EAR 部署到独立/部署目录并启动服务器(这一切都很好,除了我收到此异常这一事实java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext),但无论如何,回到主要问题。
当我运行应用程序时,我将其打印到我指定的日志文件中
10:51:06.752 [main] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Slf4jLoggerProvider
10:51:06.780 [main] DEBUG o.j.n.r.client.InitialContextFactory - Looking for jboss-naming-client.properties using classloader sun.misc.Launcher$AppClassLoader@194d4313
10:51:06.782 [main] DEBUG o.j.n.r.client.InitialContextFactory - jboss.naming.client.endpoint.create.options. has the following options {}
10:51:06.783 [main] DEBUG o.j.n.r.client.InitialContextFactory - jboss.naming.client.remote.connectionprovider.create.options. has the following options {}
10:51:06.789 [main] INFO org.xnio - XNIO Version 3.0.7.GA-redhat-1
10:51:06.798 [main] INFO org.xnio.nio - XNIO NIO Implementation …Run Code Online (Sandbox Code Playgroud) 将quartz-scheduler添加到项目后,Tomcat的服务器日志会收到以下垃圾邮件:
[INFO] [talledLocalContainer] 12:15:06.319 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - 批量获取0个触发器
我正在尝试禁用该日志消息,该消息每 25 秒左右重复一次。我已经回答过同一问题的许多其他答案,例如:
...建议的方法都不起作用。
我在 中声明了以下依赖项pom.xml:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我已将以下log4j.properties设置添加到我的项目中:
log4j.rootLogger=OFF
log4j.logger.quartz=OFF
log4j.logger.o.quartz=OFF
log4j.logger.org.quartz=OFF
Run Code Online (Sandbox Code Playgroud)
...还有以下内容simplelogger.properties:
org.slf4j.simpleLogger.defaultLogLevel=error
Run Code Online (Sandbox Code Playgroud)
除了尝试链接答案之一建议的编程解决方案之外,该解决方案还应禁用所有日志记录,大致如下:
List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
logger.setLevel(Level.OFF);
}
Run Code Online (Sandbox Code Playgroud)
这似乎禁用了除了石英运行时的日志消息 之外的所有内容。
有没有办法摆脱quartz 中的日志消息,而不需要修改quartz 源代码来删除它?
在我的 Java 应用程序中,我使用 SLF4J + Logback 进行日志记录。我在开发环境中使用调试级别日志记录,在生产环境中使用错误级别日志记录。但有一些消息我想在任何情况下记录,无论日志级别如何(类似于System.out.println("Some Message")但使用记录器)。
有什么实际的方法可以实现这一目标吗?我可以使用错误或更低的级别,但我想做的是提供一些信息,所以logger.error("Some message");在语义上是错误的,它不是错误。
我可以在我的logback.xml类中定义另一个记录器,但这并不方便。
实现这一目标的正确方法是什么?
我正在为该应用程序开发一个应用程序(https://github.com/stirante/RuneChanger)和一个库(https://github.com/stirante/lol-client-java-api)。在库中,我使用 Java-WebSocket,它最近添加了 SLF4J API。在应用程序中,我有 logback 作为依赖项,它也有 SLF4J 作为依赖项。
在编译应用程序时,我有这样的错误:
[ERROR] the unnamed module reads package org.slf4j.spi from both slf4j.api and lol.client.java.api
[ERROR] the unnamed module reads package org.slf4j from both slf4j.api and lol.client.java.api
[ERROR] the unnamed module reads package org.slf4j.helpers from both slf4j.api and lol.client.java.api
[ERROR] the unnamed module reads package org.slf4j.event from both slf4j.api and lol.client.java.api
Run Code Online (Sandbox Code Playgroud)
完整日志在这里:https : //travis-ci.org/github/stirante/RuneChanger/builds/693607053
我尝试移动库中的依赖项(https://github.com/stirante/lol-client-java-api/commit/f62c31f02ace86d50546af113a94fa37f814fb98),但没有运气。
我该如何处理这种情况?
编辑:暂时我转移org.slf4j到另一个包并且它可以工作,但它看起来像一个丑陋的解决方案,因为日志记录可能无法从这个库中工作。