Would it be possible for you to create a Jira issue and attach your sample 
project so I don’t have to reinvent the wheel?  Or you could check it in to 
GitHub so I could clone it.

Ralph

> On Jun 24, 2019, at 11:52 PM, m...@mherrn.de wrote:
> 
> Hi,
> 
> according to https://logging.apache.org/log4j/2.x/performance.html logging
> with location information should be roughly the same performance for JUL
> and Log4j2.
> 
> However I made a few comparisons between Log4j2 and JUL and in this case
> Log4j2 is much faster than JUL when omitting location information, but is
> considerably slower when logging with location information.
> 
> Those are the results:
> 
> JUL without location information   : 32.162s
> JUL with location information      : 21.682s
> Log4j2 without location information:  4.168s
> Log4j2 with location information   : 59.000s
> 
> In each case I logged 1500000 simple log statements (only a fixed string)
> and compared the timestamp of the first and the last generated log
> statement. Above you see the time spent between the first and the last log
> statement.
> I did these tests several times and the results are equal each time.
> 
> In all cases I logged to a RollingFileAppender (or JULs equivalent).
> I assume that JUL with location information is faster than JUL without
> location information is because for JUL with location information I used a
> custom Formatter that doesn't support any configuration whereas I was
> using a SimpleFormatter with a specified formatstring for JUL without log
> information.
> 
> It should be noted that I didn't use the Log4j2 API, but instead used the
> JUL logging API and used the log4j-jul-bridge to actually use Log4j2
> instead of the JUL implementation!
> 
> I want to pay special attention to the difference when logging with
> location information, since I am puzzled that Log4j2 is that much slower
> than JUL in that case.
> 
> The implementation of my custom Formatter is this:
> 
> public class OneLineFormatter extends Formatter {
>  private static final String LINE_SEPARATOR =
> System.getProperty("line.separator");
>  private static final DateFormat DATE_FORMAT= new
> SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS");
> 
> 
>  @Override
>  public String format(final LogRecord record) {
>      final StringBuilder sb = new StringBuilder();
> 
>      final String dateString= DATE_FORMAT.format(new
> Date(record.getMillis()));
> 
>      sb.append(dateString)
>          .append(" ")
>          .append(getLogLevelString(record.getLevel()))
>          .append(" [")
>          .append(record.getSourceClassName())
>          .append("#")
>          .append(record.getSourceMethodName()).append("()")
>          .append("]")
>          .append(" - ")
>          .append(formatMessage(record))
>          .append(LINE_SEPARATOR);
> 
>      if (record.getThrown() != null) {
>          try {
>              StringWriter sw = new StringWriter();
>              PrintWriter pw = new PrintWriter(sw);
>              record.getThrown().printStackTrace(pw);
>              pw.close();
>              sb.append(sw.toString());
>          } catch (Exception ex) {
>              // ignore
>          }
>      }
> 
>      return sb.toString();
>  }
> 
>  private String getLogLevelString(final Level level){
>    return String.format("%1$-7s", level.getName());
>  }
> }
> 
> The log4j2 configuration I used is this:
> 
> <Configuration monitorinterval="30" status="info" strict="true">
>    <Properties>
>        <Property name="filename">logs/log4j2-with-method.log</Property>
>        <Property
> name="filepattern">logs/log4j2-with-method.log.%i.gz</Property>
>    </Properties>
>    <Appenders>
>        <Appender type="RollingFile" name="File" fileName="${filename}"
> filePattern="${filepattern}" bufferedIO="true">
>            <Policies>
>                <OnStartupTriggeringPolicy />
>                <SizeBasedTriggeringPolicy size="100mb"/>
>            </Policies>
>            <DefaultRolloverStrategy max="15" fileIndex="min" />
>            <Layout type="PatternLayout" pattern="%d %-6p [%C#%M] (%t) %m
> %ex%n" />
>        </Appender>
>    </Appenders>
>    <Loggers>
>        <Root level="INFO">
>            <AppenderRef ref="File" />
>        </Root>
>        <Logger name="LPT_SIMPLE" level="ALL" />
>    </Loggers>
> </Configuration>
> 
> 
> I don't think there is anything special. Since when logging without
> location information Log4j2 is much faster than JUL there must be a
> difference between getting the location information. My above mentioned
> custom formatter uses the methods java.util.LogRecord#getSourceClassName()
> and java.util.LogRecord#getSourceMethodName() for obtaining that
> information. I haven't looked into how Log4j2 does it, but it seems to be
> much less efficient.
> 
> Can someone explain why Log4j2 is that much slower in that case?
> Is there another way in Log4j2 to get the location information that
> performs as fast as JUL?
> 
> 
> Best regards
> Marco
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
> For additional commands, e-mail: log4j-user-h...@logging.apache.org
> 
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-user-h...@logging.apache.org

Reply via email to