在调查性能测试结果时,我发现Java Flight Recorder的"热方法"中报告了以下堆栈跟踪:
Stack Trace Sample Count Percentage(%)
----------- ------------ ----------
java.util.Arrays.rangeCheck(int, int, int) 358 2.212
java.util.Arrays.fill(char[], int, int, char) 358 2.212
java.lang.AbstractStringBuilder.setLength(int) 358 2.212
java.lang.StringBuilder.setLength(int) 358 2.212
org.apache.logging.log4j.core.async.RingBufferLogEvent.getMessageTextForWriting()
201 1.242
org.apache.logging.log4j.core.async.RingBufferLogEvent.setMessage(Message)
201 1.242
Run Code Online (Sandbox Code Playgroud)
从堆栈跟踪中,看起来设置StringBuilder的长度导致Arrays.fill被调用.但是,我不明白为什么会发生这种情况,因为StringBuilder的长度设置为零.
查看Log4j RingBufferLogEvent.getMessageTextForWriting方法的代码,很明显StringBuilder的长度永远不会设置为零以外的任何其他值:
// RingBufferLogEvent.java
private StringBuilder getMessageTextForWriting() {
if (messageText == null) {
messageText = new StringBuilder(Constants.INITIAL_REUSABLE_MESSAGE_SIZE); // 128
}
messageText.setLength(0); // <-- this call. Note: new length is ALWAYS zero.
return messageText;
}
Run Code Online (Sandbox Code Playgroud)
我不明白这是如何导致Arrays.fill被调用的.看一下代码AbstractStringBuilder,Arrays.fill …
我正在寻找Scala的命令行解析器,支持子命令(类似于Python中的argparse).看起来Scala(Scopt,Argot等)有许多不同的命令行解析器,但它们似乎都不支持子命令解析.我只是错过了这些其他库支持子命令的事实,如果没有,是否存在任何此类库?
据我所知,log4j可以处理系统属性-Dlog4j.debug.如果你用它运行你的应用程序,你将获得log4j的调试输出.
示例:java -Dlog4j.debug -jar test.jar
log4j 2有类似的东西吗?
我将Log4J2添加到了我的应用程序中.我将所有Log4J2 .jar文件复制到LIB目录并创建了Log4J2.xml文件以支持它.我的代码已更新,以导入必要的Log Manager和Logger API.然后我添加了静态最终记录器方法,并在我的代码中调用了logger apis.Eclipse中的所有编译文件.我继续在我的DEV机器上启动我的服务器来验证它.启动我的服务器后,我收到以下错误:`
2014-10-19 21:39:31.753:INFO:oejs.Server:jetty-8.1.14.v20131031
2014-10-19 21:39:32.680:WARN:oejuc.AbstractLifeCycle:FAILED FoundationStartup: java.lang.NoClassDefFoundError: org/slf4j/Logger
java.lang.NoClassDefFoundError: org/slf4j/Logger
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:41)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:474)
at com.global.service.FoundationStartup.<clinit>(FoundationStartup.java:19)
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)
at org.eclipse.jetty.servlet.ServletContextHandler$Context.createServlet(ServletContextHandler.java:1075)
at org.eclipse.jetty.servlet.ServletHolder.newInstance(ServletHolder.java:957)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:514)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:344)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:791)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1221)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:454)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95)
at org.eclipse.jetty.server.Server.doStart(Server.java:282)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
at org.eclipse.wst.server.preview.internal.PreviewStarter.run(PreviewStarter.java:72)
at org.eclipse.wst.server.preview.internal.PreviewStarter.main(PreviewStarter.java:29)
Caused by:
java.lang.ClassNotFoundException: org.slf4j.Logger
at java.net.URLClassLoader$1.run(Unknown …Run Code Online (Sandbox Code Playgroud) 我刚开始使用log4j2.但我发现log4j2包含stacktrace中的库名.我怎么能禁用它?
这是一个例子:
java.lang.NullPointerException
at com.sev.controllers.UserController.login(UserController.java:35) ~[UserController.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_31]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_31]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_31]
at java.lang.reflect.Method.invoke(Method.java:483) ~[?:1.8.0_31]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
Run Code Online (Sandbox Code Playgroud)
我在[]括号中谈论这个名字.
这是我的log4j配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.apache.log4j.xml" level="INFO"/>
<Logger name="org.hibernate" level="INFO"/>
<Logger name="org.springframework" level="INFO"/>
<Root level="debug">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
这是我的版本:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.3</version>
</dependency> …Run Code Online (Sandbox Code Playgroud) 我知道这个问题已经被提出,但我正在寻找具有特定功能的Java cli解析器.我希望它能够定义命令行树,从而使用子命令(和多个级别深度).因此,在我到达选项之前,我可以有3-4级命令.这些子命令是互斥的.谢谢
如何获得log4j2中使用的所有记录器?在log4j中我可以使用如下所述的getCurrentLoggers:使用的记录器数量
我正在将我的应用程序从log4j 1.2迁移到log4j 2.0
我有现有的代码:
Enumeration appenders = logger.getAllAppenders();
.
.
.
fileBackupIndex = rollingFileAppender.getMaxBackupIndex();
Run Code Online (Sandbox Code Playgroud)
在log4j 2.0中我找不到替换上面java代码的方法.如何获取所有appender的列表以及如何以编程方式获取为RollingFile appender定义的最大值?
我应该使用什么过滤器来定义要使用apender记录的特定级别?例如:
Java的:
LOGGER.debug("Debug message");
LOGGER.info("Info message");
LOGGER.warn("Warn message");
LOGGER.error("Error message");
LOGGER.fatal("Fatal message");
Run Code Online (Sandbox Code Playgroud)
log4j2.xml:
<Configuration>
<Appenders>
<Console name="info-stdout-message">
<PatternLayout pattern="[%logger{36}] %message %n" />
<ThresholdFilter level="info"/>
</Console>
<Console name="detailed-stdout-message">
<PatternLayout pattern="[%logger{36}] [%level] %message %n" />
</Console>
<File name="file-appender" fileName="logs/debug.log">
<PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" />
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="file-appender" level="debug" />
<AppenderRef ref="info-stdout-message" level="info"/>
<AppenderRef ref="detailed-stdout-message" level="info"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
文件输出很好,但在控制台我有这样的结果:
[application.Main] [INFO] Info message
[application.Main] Info message
[application.Main] [WARN] Warn message
[application.Main] Warn message …Run Code Online (Sandbox Code Playgroud) 我有一个log4j2配置文件,用于在Tomcat 8上运行的Web应用程序,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30" status="trace" strict="true">
<Properties>
<Property name="logdir">/path/to/log/dir</Property>
<Property name="filename">somelogfile.log</Property>
</Properties>
<Loggers>
<Logger name="some.package.name" level="debug" additivity="false">
<AppenderRef ref="RollingFile"/>
</Logger>
</Loggers>
<Appenders>
<RollingFile name="RollingFile" fileName="${logdir}/${filename}" filePattern="${logdir}/${filename}.%d{yyyyMMdd}.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
我看到我的网络应用程序写入日志文件,但我有线程名称的%t模式似乎没有解决,所以我得到像这样的日志语句
2017-06-10 20:34:51,696 DEBUG s.p.n.SomeServlet [%t] some log message
Run Code Online (Sandbox Code Playgroud)
注意我得到%t而不是线程名称
因此,为了解决这个问题,我使用该选项启动了Tomcat
-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE
Run Code Online (Sandbox Code Playgroud)
当webapp正在部署并且log4j2正在初始化时,我看到以下消息在catalina.out中打印.
ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern
2017-06-10 19:51:14,277 localhost-startStop-1 DEBUG …Run Code Online (Sandbox Code Playgroud)