[
https://issues.apache.org/jira/browse/LOG4J2-695?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14055654#comment-14055654
]
Remko Popma edited comment on LOG4J2-695 at 7/9/14 12:43 AM:
-------------------------------------------------------------
Thanks for confirming the configuration. With multi-threaded tests the variance
is always larger, but in your last test the "mean error" (variance) exceeds the
"mean" (average) for throughput, which tells me there was a lot of noise and
unfortunately the numbers don't mean very much...
Your single-threaded results had less variance, which is good, but I don't know
how to explain the results: for simple logging log4j-1.2 is 25% faster, but for
structured logging log4j2 is 50% faster than log4j-1.2 structured logging... I
don't have an explanation for that.
The only thing I can think of is that the machine that was used to run the
tests is a virtual environment or otherwise shared with other processes and got
very busy during some portions of the test, which influenced the result. But
that is just a guess...
Anyway, the JMH microbenchmark performance framework is the most reliable tool
that I know of. So this is the best I can do.
UPDATE: our messages crossed and you just posted another result for (-f 5 -wi
10 -i 20 -t 4). Here the variance is not as large, but you notice that
Log4j2WrapperBenchmark.throughputSimple (122K ops/s) (although faster than
Log4j12Benchmark.throughput's 112K ops/s) is faster than
Log4j2Benchmark.throughput (99K ops/s). I expected Log4j2Benchmark.throughput
to be fastest as it is doing less work. So the "mean error" is important to
understand how unprecise these numbers are. (A large error indicates the
results do not mean very much.)
I hope you now have the tools to do all the experimentation and analysis you
need to make a decision on which logging library and configuration you want to
use.
was (Author: [email protected]):
Thanks for confirming the configuration. With multi-threaded tests the variance
is always larger, but in your last test the "mean error" (variance) exceeds the
"mean" (average) for throughput, which tells me there was a lot of noise and
unfortunately the numbers don't mean very much...
Your single-threaded results had less variance, which is good, but I don't know
how to explain the results: for simple logging log4j-1.2 is 25% faster, but for
structured logging log4j2 is 50% faster than log4j-1.2 structured logging... I
don't have an explanation for that.
The only thing I can think of is that the machine that was used to run the
tests is a virtual environment or otherwise shared with other processes and got
very busy during some portions of the test, which influenced the result. But
that is just a guess...
Anyway, the JMH microbenchmark performance framework is the most reliable tool
that I know of. So this is the best I can do.
UPDATE: our messages crossed and you just posted another result for (-f 5 -wi
10 -i 20 -t 4). Here the variance is not as large, but you notice that
Log4j2WrapperBenchmark.throughputSimple (122K ops/s) (although faster than
Log4j12Benchmark.throughput's 112K ops/s) is faster than
Log4j2Benchmark.throughput (99K ops/s). I expected Log4j2Benchmark.throughput
to be fastest as it is doing less work. So the "mean error" is important to
understand how unprecise these numbers are. (A large error indicates the
results do not mean very much.)
> Custom Logger with restrictions on existing methods
> ---------------------------------------------------
>
> Key: LOG4J2-695
> URL: https://issues.apache.org/jira/browse/LOG4J2-695
> Project: Log4j 2
> Issue Type: Bug
> Components: API
> Reporter: SIBISH BASHEER
> Labels: customlogger
> Fix For: 2.0-rc2
>
> Attachments: AppAsyncMain.java, CustomLogger.java, CustomLogger.java,
> complete project.zip, final code V2 7 2 2014.zip, final code custom
> logger.zip, jmh-based-perf-tests.zip, performance log4j vs log4j2.zip,
> performance log4j vs log4j2.zip, performance log4jvslog4j2 singleclass.zip,
> to Ralph performance code.zip
>
>
> I have been looking at the Custom/Extended logger discussions. But none of
> them seems to fulfil what i am looking for.
> 1) I want custom methods as below:
> {code}
> private static CustomLogger logger =
> CustomLogger.getLogger(AppAsyncMain.class);
>
> logger.info( transaction_id, app_name + event_name +
> "inside the loop" + "inside the loop of
> the sample app" +
> "success" + "looped in" + "loop_count" +
> String.valueOf(i));
> {code}
>
> log:
> {code}
> 2014-06-30 16:09:28,268 log_level="INFO" thread_name="main"
> class_name="com.custom.samplelog4j.AppAsyncMain"
> transaction_id="79ea1071-9565-405a-aa18-75d271694bf2"
> event_id="dd5c69c0-4400-41fd-8a2e-5d538d8e8c9b" app="Sample Logging SDK App"
> event_name="Sample Event" action="start of sample app" desc="start of api"
> result="success" reason="start" token="abcdefg" alias="[email protected]"
> {code}
>
> 2) I want to show warning in existing logger methods so the teams using the
> custom logger doesn't use these methods other than for testing:
> {code}
> logger.info("start of statement");
> {code}
>
> log:
> {code}
> 2014-06-30 16:12:31,065 log_level="INFO" thread_name="main"
> class_name="com.custom.samplelog4j2.AppAsyncMain" start of statement
> customlogger_warning="method not recommended for production use"
> {code}
>
> 3) Custom validations for the fields:
> {code}
> private static String validateFields(String app_name, String event_name,
> String action, String desc, Result result, String
> reason) {
> String validateStatus = "";
> if (!ValidateAppName(app_name)) {
> validateStatus = "app_name";
> } else if (!ValidateEventName(event_name)) {
> validateStatus = "event_name";
> } else if (!ValidateAction(action)) {
> validateStatus = "action";
> } else if (!ValidateDesc(desc)) {
> validateStatus = "desc";
> } else if (!ValidateReason(result, reason)) {
> validateStatus = "reason";
> }
> return validateStatus;
> }
> {code}
> Options tried:
> 1.
> * extended ExtendedLoggerWrapper
> * created the map of the Custom logger
> * This option was failing because of "writing to a closed appender"
> * Attached is the code "CustomLogger.java"
>
> 2. Modified the AbstractLogger in Trunk and added the below methods:
> {code}
> @Override
> public void info(final String message) {
> String updtMessage = message + " amexlogger_error=\"Incorrect method
> used\"";
> logIfEnabled(FQCN, Level.INFO, null, updtMessage, (Throwable) null);
> }
> public void info(final String transactionId, final String app_name, final
> String event_name, final String action, final String desc, final String
> result, final String reason, final String... moreFields) {
> String message = "transaction_id=" + transactionId + " " + "app_name="
> + app_name + " " + "event_name=" + event_name + " " + "action=" + action;
>
> logIfEnabled(FQCN, Level.INFO, null, message, (Throwable) null);
> }
> {code}
> I don't want to modify the methods inside the log4j-api.
>
> Please help me with the correct approach on how to use log4j2 for this
> usecase.
> Thanks
> Sibish
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]