好了,我很高兴与Solr的,但我似乎无法弄清楚如何调低日志记录级别,使其实际运行足够快,当我做一个巨大的进口运行.
我甚至不确定它正在使用哪个日志框架(因为,你知道,java.util.logging,log4j和commons-logging 都不够,我们需要将slf4j添加到混合中!)好抱歉,不得不让那个轻微的咆哮.:-)
所以我src/main/resources/log4j.properties配置了:
log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n
org.apache.solr.core=WARN
org.apache.solr.update.processor=WARN
Run Code Online (Sandbox Code Playgroud)
然后,我已经src/main/resources/logging.properties配置了以下好的措施:
.level = WARNING
com.gwtstore.level=ALL
com.appgravity.level=ALL
org.apache.solr.core.level=WARNING
org.apache.solr.update.processor.level=WARNING
Run Code Online (Sandbox Code Playgroud)
然而不知何故,我仍然看到以下吨:
INFO: {add=[-7757828706308755634]} 0 0
Feb 21, 2011 6:12:23 PM org.apache.solr.core.SolrCore execute
INFO: [] webapp=null path=/update params={} status=0 QTime=0
Run Code Online (Sandbox Code Playgroud)
这是我的类路径:
src/test/resources
src/test/java
src/main/resources
src/main/java
idea_rt.jar
junit-rt.jar
deploy.jar
dt.jar
javaws.jar
jce.jar
jconsole.jar
management-agent.jar
plugin.jar
sa-jdi.jar
alt-rt.jar
charsets.jar
classes.jar
jsse.jar
ui.jar
apple_provider.jar
dnsns.jar …Run Code Online (Sandbox Code Playgroud) 我总是使用以下模式构建(SLF4J)记录器:
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)
到目前为止这已经奏效了,但我想知道static某些情况下的上下文以及需要一直传递具体的类文字,而不是仅仅使用非静态记录器
private final Logger log = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)
这之前基本上已经问过(并回答)了LOG4J
和这里
我意识到final基本上是强制性的,所以我想知道在非静态环境中使用SLF4J的开销实际上有多高.
问:
使用是否有任何重大的实际开销
private final Logger log = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)
过度
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)
在普通(网络)应用程序?(这里不需要"讨论"高端,重载的webapps)
注意,我最终计划使用更好的方法使用CDI获得SLF4J记录器
@Inject private final Logger log;
Run Code Online (Sandbox Code Playgroud)
如http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection所述,但我需要先了解记录器缓存.
子问题:甚至可以使用?:
@Inject private static final Logger log;
Run Code Online (Sandbox Code Playgroud)
(刚开始用CDI开头)
当与slf4j一起使用时,
String test = blahblahblah;
logger.info("{}",test);
Run Code Online (Sandbox Code Playgroud)
跟踪如下
java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at org.slf4j.impl.JDK14LoggerAdapter.info(JDK14LoggerAdapter.java:304)
Run Code Online (Sandbox Code Playgroud) 我对这三个记录器库有点困惑.看起来他们可以在java日志记录中做类似的事情......
我想摆脱这一批......
public void info(String msg);
public void info(String format, Object arg);
public void info(String format, Object arg1, Object arg2);
public void info(String format, Object[] argArray);
Run Code Online (Sandbox Code Playgroud)
......并用这个替换它......
public void info(String format, Object ... args);
Run Code Online (Sandbox Code Playgroud)
...这样我的日志记录语法就不必根据我想记录的参数数量而改变.似乎有很多讨论和解决方法,但它在哪里?或者我应该包装slf4j的包装器?
在Spring Controller中实例化Logger时,有没有理由将它声明为静态final?LogConger不在MyController.class之外使用.我已经看到两个例子在使用,但不明白为什么我应该使用其中一个.
private Logger logger = LoggerFactory.getLogger(MyController.class);
Run Code Online (Sandbox Code Playgroud)
VS
private static final Logger logger = LoggerFactory.getLogger(MyController.class);
Run Code Online (Sandbox Code Playgroud) 我需要将System.out/err.println输出重定向到slf4j.
我知道这不是正确记录的方法,但有一个外部库,它记录到System.out
如何将java.util.logging中的日志记录级别映射到SLF4J?
SLF4J
java.util.logging中
我找到了一篇有用的文章,解释了如何让泽西使用SLF4J而不是JUL.现在我的单元测试看起来像(并且它完美地工作):
public class FooTest extends JerseyTest {
@BeforeClass
public static void initLogger() {
java.util.logging.Logger rootLogger =
java.util.logging.LogManager.getLogManager().getLogger("");
java.util.logging.Handler[] handlers = rootLogger.getHandlers();
for (int i = 0; i < handlers.length; i++) {
rootLogger.removeHandler(handlers[i]);
}
org.slf4j.bridge.SLF4JBridgeHandler.install();
}
public FooTest() {
super("com.XXX");
}
@Test
public void testSomething() throws Exception {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我pom.xml包括这些依赖项:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我不想在每个单元测试中进行相同的配置.这是一个明显的代码重复,我想避免.我怎样才能更有效地做到这一点?
PS.也许不可能优化上面的代码,我尽我所能?
我正在开发一个简单的桌面应用程序(不是webapp).
这是我的log4j.properties:
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L $$$$ %m%n
log4j.logger.org.springframework=ERROR,stdout
Run Code Online (Sandbox Code Playgroud)
如您所见,为了从控制台中消除Spring日志消息,我尝试了这个解决方案:
当我从我的代码调用log4j logger时,日志消息是根据上面指定的模式(这是好的).
然而,坏的部分是 - 我仍然从春天到达控制台DEBUG级别的消息......它们看起来像这里: 无法禁用日志消息
他们有不同的模式.好像他们忽略了我的设置.
我也尝试应用我在这里找到的建议:
https://spring.io/blog/2009/12/04/logging-dependencies-in-spring
在我的pom文件中:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
而且没有SLF4J.如果我没有错,上述链接中提到此选项是有效选项.
我可能会在这里失踪什么?
输出-Dlog4j.debug = true
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@172aa3f.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@172aa3f class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@172aa3f.
log4j: Using URL …Run Code Online (Sandbox Code Playgroud)