小编Rem*_*pma的帖子

StringBuilder.setLength(0)怎么可能调用Arrays.fill?

在调查性能测试结果时,我发现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 …

java arrays stringbuilder jvm

12
推荐指数
1
解决办法
612
查看次数

具有子命令支持的Scala命令行解析器

我正在寻找Scala的命令行解析器,支持子命令(类似于Python中的argparse).看起来Scala(Scopt,Argot等)有许多不同的命令行解析器,但它们似乎都不支持子命令解析.我只是错过了这些其他库支持子命令的事实,如果没有,是否存在任何此类库?

parsing scala command-line-arguments picocli

11
推荐指数
0
解决办法
1774
查看次数

Log4j 2.如何获取log4j的调试消息?

据我所知,log4j可以处理系统属性-Dlog4j.debug.如果你用它运行你的应用程序,你将获得log4j的调试输出.

示例:java -Dlog4j.debug -jar test.jar

log4j 2有类似的东西吗?

java logging log4j log4j2

11
推荐指数
2
解决办法
1万
查看次数

NoClassDefFoundError:org/slf4j/Logger

我将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)

java logging log4j slf4j log4j2

11
推荐指数
1
解决办法
4万
查看次数

Log4j2包括stacktrace中的库名

我刚开始使用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 logging spring log4j2 spring-boot

11
推荐指数
1
解决办法
1809
查看次数

Java CLI解析器

我知道这个问题已经被提出,但我正在寻找具有特定功能的Java cli解析器.我希望它能够定义命令行树,从而使用子命令(和多个级别深度).因此,在我到达选项之前,我可以有3-4级命令.这些子命令是互斥的.谢谢

java command-line-interface subcommand picocli

10
推荐指数
3
解决办法
3369
查看次数

什么是get4urrentLoggers在log4j2中的模拟

如何获得log4j2中使用的所有记录器?在log4j中我可以使用如下所述的getCurrentLoggers:使用的记录器数量

java configuration logging log4j log4j2

9
推荐指数
2
解决办法
4858
查看次数

从log4j 1.2迁移到log4j 2 - 如何获取所有appender列表和滚动文件策略

我正在将我的应用程序从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定义的最大值?

java logging log4j log4j2

9
推荐指数
1
解决办法
3537
查看次数

Log4j2在apender中过滤特定级别

我应该使用什么过滤器来定义要使用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)

java logging log4j log4j2

9
推荐指数
3
解决办法
2万
查看次数

log4j2错误无法识别的格式说明符[t]

我有一个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)

java logging log4j log4j2 tomcat8

9
推荐指数
2
解决办法
4646
查看次数