我正在使用SLF4J在我的Java项目中记录消息并使用Gradle构建项目.我正在尝试调试一些东西,我希望能够看到我的Java源代码或单元测试中的日志消息.有没有办法将输出输出到控制台?
我最近在其中一个项目上遇到了一些混乱,Log4j,Slf4j和Commons-Logging的"混合"由于混合了来自不同开源项目的不同JAR.
我看到越来越多的OS项目慢慢转向Slf4j.Logback似乎是Log4j的继承者.我认为它实际上是一个岔路口,但由于没有进一步的发展预期为1.3的Log4j Log4j的和2.0是一个实验性的发展,不知道它是否会永远离开那个状态...我不知道!
Log4j死了吗?
似乎虽然日志级别设置为INFO,但SLF4J仍在评估表达式.
package com.ab.test.slf4j;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleTest {
static final Logger logger = LoggerFactory.getLogger(SimpleTest.class);
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
logger.debug("Test " + testEnter());
logger.debug("Test {}", testEnter());
}
public static String testEnter() {
System.out
.println("If you see this it means your expression is evaluated :(");
return "test";
}
}
Run Code Online (Sandbox Code Playgroud)
Log4J属性文件:
log4j.rootLogger=INFO, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Run Code Online (Sandbox Code Playgroud)
运行输出:
If you see this it means your expression is evaluated :(
If …Run Code Online (Sandbox Code Playgroud) 我正在用Java编写Web应用程序并使用SLF4J进行日志记录.
我已经厌倦了为每个使用日志记录的类编写以下行:
private static final Logger logger = LoggerFactory.getLogger(ThisClassName.class);
Run Code Online (Sandbox Code Playgroud)
为了避免冗余代码,我在想类似的东西
interface Loggable {
Logger logger();
}
Run Code Online (Sandbox Code Playgroud)
并且每个类都可以实现这个接口然后像AOP这样的魔术插入LoggerFactory部件.
有没有人实现这个或知道如何实现这一目标?
谢谢!
是否可以在特定的GlassFish应用程序中使用SLF4J并仅为该应用程序配置SLF4J?我们目前正在努力解决GlassFish本身 安装了Hibernate的GlassFish在其lib目录中包含SLF4J API和记录器绑定这一事实.
我们的团队正在开发Java EE 6 Web应用程序.对于开发,应用程序部署在GlassFish 3.1.2上,尽管它应该尽可能便携.
我们决定使用SLF4J来记录应用程序消息.根据消息级别,应用程序必须以不同方式处理某些日志消息,因此必须能够自己配置日志记录后端 - 而不是在应用程序服务器中配置日志记录.
不幸的是,GlassFish 3.1.2 在其lib文件夹中包含slf4j-api-1.5.8.jar和slf4j-jdk14-1.5.8.jar.这可以防止我们的应用程序使用slf4j-api-1.7.5.jar和slf4j-simple-1.7.5.jar(后者将最终被另一个绑定替换).
有没有办法告诉GlassFish在考虑自己之前考虑应用程序lib(以便使用正确版本的API)以及确保使用提供SLF4J绑定的应用程序的任何方法?
我们正在使用Eclipse进行开发,但我们没有使用Maven.到目前为止,我发现的大多数调整/解决方法都是指Maven中我们无法使用的配置.如果您可以提供任何Eclipse特定提示,那将是很棒的.在Eclipse项目的属性中,我已经配置了构建路径的顺序,以便Web App Libraries位于顶部.但不知何故,这似乎还不够.
非常感谢您的帮助!
更新1:为了让它暂时运行,我刚刚从GlassFish lib目录中删除了SLF4J库.然后,应用程序使用其自己提供的SLF4J库.但我不认为这是部署过程的解决方案,我不确定这是否会破坏GlassFish使用的任何东西(为什么库仍然存在于那里?),这对我们的开发团队来说不是一个实用的解决方案.
更新2:实际上不是 GlassFish,它包括干扰的SLF4J库开箱即用,但我通过更新工具安装的Hibernate JPA包.我们目前不需要Hibernate JPA,但是在某些时候可能会出现更改为Hibernate的要求,我们还希望保持应用程序可以轻松移植到安装了Hibernate JPA或其他包含SLF4J的软件包的应用程序服务器.我相应地更新了问题标题.如何解决干扰应用服务器和应用程序依赖性的一般问题?
我知道slf4j是具有java.util.logging实现的接口.但是如果我使用slf4j并且必须将java.util.logging.Logger传递给某个第三方库呢?是否有slf4j logger的包装器,我可以作为java.util.logging.Logger传递?
我正在使用SLF4J进行日志记录(使用Log4J).使用的appender使用xml配置.
<appender name="business" class="org.apache.log4j.RollingFileAppender">
<param name="maxFileSize" value="10MB" />
<param name="maxBackupIndex" value="10" />
<param name="File" value="${jboss.server.log.dir}/business.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%t] %c - %m%n" />
</layout>
</appender>
<category name="BusinessLogger" additivity="false">
<level value="INFO" />
<appender-ref ref="business" />
</category>
Run Code Online (Sandbox Code Playgroud)
在拦截器中调用日志进程.现在,我正在尝试测试日志的输出.我在运行时使用以下命令调用记录器:
private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger");
Run Code Online (Sandbox Code Playgroud)
为了测试日志(使用junit),日志的输出需要作为变量保存在某处.我有一个创建自定义appender的想法,它将最后一个日志保存到变量中,但我似乎无法添加appender或更改appender,因为slf4j中的Logger类是一个接口.有没有人知道任何解决方法?
如何让hibernate 4通过logback登录?我有一个战斗部署到wildfly 8 final,我正在使用slf4j和logback.日志设置在应用程序中100%工作,控制台appender和文件appender都按预期工作.
以下是我为slf4j + logback工作所做的工作:
使用WEB-INF中的jboss-deployment-structure.xml排除日志记录子系统:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="logging" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)
在pom中包含slf4j和logback依赖项:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
使用org.slf4j.Logger登录应用程序
为logback.xml添加了3个记录器:
<logger name="my.package" level="TRACE"/>
<logger name="org.hibernate.type" level="ALL" />
<logger name="org.hibernate" level="TRACE" />
Run Code Online (Sandbox Code Playgroud)
我没有在日志中看到任何与hibernate相关的内容.
我从hibernate看到的任何东西都是我添加到persistence.xml的时候:
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
Run Code Online (Sandbox Code Playgroud)
但它会记录到服务器日志和控制台,而不是我的logback appender,即使我的根记录器设置为跟踪...
logback ViewStatusMessagesServlet看起来很健康,并显示已注册的hibernate记录器:2014-02-23 19:02:37 INFO LoggerAction将logger [org.hibernate.type]的设置级别设置为ALL
2014-02-23 19:02:37 INFO LoggerAction将记录器[org.hibernate]设置为TRACE
我还可以使用在persistence.xml中注册的hibernate.ejb.interceptor来记录准备好的语句.不幸的是,这也没有提供任何方法来获取查询参数
谁能帮我吗?
我正在使用JUnit 4编写Android测试用例(这些测试不使用模拟器并且作为本机测试运行).在我的代码中,我使用SL4J进行日志记录,但是当我运行单元测试时,我无法看到任何日志记录输出.例如以下语句:
private static final Logger logger = LoggerFactory.getLogger(AClass.class);
logger.warn("log output not visible in unit test");
Run Code Online (Sandbox Code Playgroud)
关于是否可以在单元测试中访问记录器输出的任何想法?
问候,
有没有办法将多个回溯配置文件组合在一起?假设有一个包含多个项目的父项目我希望所有人都有相同的基本配置或基本logback.xml文件,但我想为每个项目添加或更改一些内容.可以这样做吗?
真的不太了解它,但是听说可以在属性的帮助下为log4j做这样的事情.