我的scala/sbt项目使用了grizzled-slf4j和logback.第三方依赖项使用Apache Commons Logging.
使用Java/Maven,我会使用jcl-over-slf4j和logback-classic,这样我就可以使用logback作为统一的日志记录后端.
我还将消除第三方库将允许sbt拉入的commons-logging依赖.我在Maven中执行以下操作(由http://www.slf4j.org/faq.html#excludingJCL推荐):
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
问题是,如何与sbt做同样的事情?
我正在尝试运行此处给出的示例切片示例.
下面是我的POM.xml:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-api</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当我试图运行该示例时,抛出以下错误:
Sep 17, 2010 11:59:43 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Error configuring application listener of class org.apache.tiles.web.startup.TilesListener
java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685)
at org.apache.tiles.web.startup.TilesListener.<init>(TilesListener.java:49)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
任何的想法?
我花了30分钟谷歌搜索,但找不到可能的溶剂.
请帮我...
我有一个我想要登录的maven&spring应用程序.我很想使用SLF4J.
我想将所有配置文件放入包含log4j.xml的目录{classpath}/config中,然后使用spring bean将init放入.
例如
<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer"/>
<property name="targetMethod" value="initLogging"/>
<property name="arguments">
<list>
<value>classpath:config/log4j.xml</value>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
但是我收到此警告并且没有记录.
log4j的:警告没有附加目的地可以发现记录器(org.springframework.context.support.ClassPathXmlApplicationContext).log4j:WARN请正确初始化log4j系统.log4j的:WARN见http://logging.apache.org/log4j/1.2/faq.html#noconfig获取更多信息.
我已经google了,找不到一个简单的例子来设置它.有任何想法吗?
我正在使用slf4j登录我的应用程序.我得到了slf4j的目的.我想知道如何找出当前绑定到哪个日志库slf4j.我在引用的库中有log4j.我假设slf4j已经绑定到log4j.
我想知道的是,有没有办法明确确认这种绑定?
我已经阅读了很多帖子和文档(在这个网站和其他地方),指出SFL4J日志记录的推荐模式是:
public class MyClass {
final static Logger logger = LoggerFactory.getLogger(MyClass.class);
public void myMethod() {
//do some stuff
logger.debug("blah blah blah");
}
}
Run Code Online (Sandbox Code Playgroud)
我的老板更喜欢我们只使用一个包装器来拦截日志调用,并避免使用样板代码来声明每个类的记录器:
public class MyLoggerWrapper {
public static void debug(Class clazz, String msg){
LoggerFactory.getLogger(clazz).debug(msg));
}
}
Run Code Online (Sandbox Code Playgroud)
并简单地使用它:
public class MyClass {
public void myMethod() {
//do some stuff
MyLoggerWrapper.debug(this.getClass(), "blah blah blah");
}
}
Run Code Online (Sandbox Code Playgroud)
我假设每次我们记录时实例化一个记录器有点贵,但我一直无法找到支持该假设的任何文件.除此之外他肯定说框架(LogBack或Log4J我们仍在决定)将"缓存"记录器,而且无论如何服务器的运行速度都远低于它们的容量,所以这不是问题.
有任何帮助指出这种方法的潜在问题?
我正在尝试运行GWT RequestFactory并面临此错误:
ClassNotFoundException: org.slf4j.LoggerFactory
Run Code Online (Sandbox Code Playgroud)
我试图下载slf4j-api-1.3.1.jar,但它没有解决问题
知道我需要下载哪个罐子?
我很高兴使用SLF4J进行回溯并使用2个appender作为ROOT记录器.
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
Run Code Online (Sandbox Code Playgroud)
我们怎样才能为两个appender提供不同的日志级别?我仍然需要所有ROOT-logger消息.
所有日志都需要成为输出的一部分(因此需要ROOT记录器).
我对.NET堆栈有些新意,我想知道是否有与.NET平台相同的slf4j.对我来说,记录到Facade并能够根据需要交换日志记录实现是有道理的.此外,当我需要使用针对我没有使用的单个日志记录框架编码的第三方库时,slf4j中可用的包装器API已经多次保存了我.
是否有一个项目作为log4net,nLog和Enterprise Library等记录器之间的外观?是否有包装器允许我快速调用这些库并将它们引导到另一个库?我应该开始一个开源项目来自己做吗?这个问题是否重复,因为我不知道正确的问题?相反,使用面向方面编程的常用方法是什么?
我对SLF4J有依赖性.我收到此错误:
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)
这是我的maven条目:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
问题出在哪儿?
编辑: 没有log4j依赖我得到以下异常
Failed to instantiate SLF4J LoggerFactory
Reported exception:
java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:121)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:268)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254)
at org.apache.bval.jsr303.ConfigurationImpl.<clinit>(ConfigurationImpl.java:50)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:228)
at org.apache.bval.jsr303.ApacheValidationProvider.createGenericConfiguration(ApacheValidationProvider.java:66)
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:173)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:50)
at com.daimler.zv9.basic.entity.AbstractEntity.<clinit>(AbstractEntity.java:73)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:228)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:195) …
Run Code Online (Sandbox Code Playgroud) 所以我今天才发现Log4J 2.0现在正在积极开发中,有一个alpha版本,据说它取代了logback.
现在在我的应用程序中,我有接近4个可能更多的日志框架:
我一直在使用log4j(1.2.x),因为坦率地说我只是不需要新人的功能,但我最近一直试图切换到SLF4J,主要是因为我不想重写我复杂的log4j配置文件到新格式(logback).
现在我的问题是我应该编写的代码是SLF4J,对于未来的log4j 2.0来说是正确的选择.
看起来我应该坚持使用旧的log4j(1.2.x
),因为它是最低的共同点?
更新:在进一步检查log4j 2.0时,看起来非常相似,配置与log4j 1.2不向后兼容.看起来像logback是最好的选择.