diff --git a/logging/pom.xml b/logging/pom.xml index 63a4d4ae..5e7cfe10 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -55,6 +55,16 @@ mockito-all test + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + diff --git a/logging/src/jmh/java/com/facebook/logging/LoggerBenchmark.java b/logging/src/jmh/java/com/facebook/logging/LoggerBenchmark.java new file mode 100644 index 00000000..92a21303 --- /dev/null +++ b/logging/src/jmh/java/com/facebook/logging/LoggerBenchmark.java @@ -0,0 +1,53 @@ +package com.facebook.logging; + +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +@State(Scope.Benchmark) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Fork(value = 1, warmups = 1) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 30, time = 1, timeUnit = TimeUnit.SECONDS) +public class LoggerBenchmark { + + Logger logger; + + @Setup + public void init() { + logger = LoggerImpl.getClassLogger(); + } + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + + @Benchmark + public void benchmarkWithNoArg() { + logger.warn("test"); + } + + @Benchmark + public void benchmarkWithOneArg() { + logger.warn("test with %s", "arg1"); + } + + @Benchmark + public void benchmarkWithTwoArgs() { + logger.warn("test with %s, %s", "arg1", "arg2"); + } + + @Benchmark + public void benchmarkWithThreeArgs() { + logger.warn("test with %s, %s, %s", "arg1", "arg2", "arg3"); + } +} diff --git a/logging/src/jmh/resources/log4j.properties b/logging/src/jmh/resources/log4j.properties new file mode 100644 index 00000000..5a22170d --- /dev/null +++ b/logging/src/jmh/resources/log4j.properties @@ -0,0 +1,32 @@ +# +# Copyright (C) 2012 Facebook, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +log4j.rootLogger=INFO,console + +# Logging Threshold +log4j.threshhold=INFO + +# +# console +# Add "console" to rootlogger above if you want to use this +# +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.target=System.err +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd}T%d{HH:mm:ss} %p %c{2}: %m%n + +log4j.logger.com.facebook.logging=INFO +log4j.logger.org.apache.thrift=INFO \ No newline at end of file diff --git a/logging/src/main/java/com/facebook/logging/CompositeLogger.java b/logging/src/main/java/com/facebook/logging/CompositeLogger.java index 531aed33..e2c72890 100644 --- a/logging/src/main/java/com/facebook/logging/CompositeLogger.java +++ b/logging/src/main/java/com/facebook/logging/CompositeLogger.java @@ -81,6 +81,36 @@ protected boolean getValue(Logger log) { }); } + @Override + public void trace(String message) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.trace(message); + } + }); + } + + @Override + public void trace(String format, Object arg1) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.trace(format, arg1); + } + }); + } + + @Override + public void trace(String format, Object arg1, Object arg2) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.trace(format, arg1, arg2); + } + }); + } + @Override public void trace(String format, Object... args) { logAll( @@ -101,6 +131,36 @@ public void trace(Throwable t, String format, Object... args) { }); } + @Override + public void debug(String message) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.debug(message); + } + }); + } + + @Override + public void debug(String format, Object arg1) { + logAll( + log -> { + if (log.isDebugEnabled()) { + log.debug(format, arg1); + } + }); + } + + @Override + public void debug(String format, Object arg1, Object arg2) { + logAll( + log -> { + if (log.isDebugEnabled()) { + log.debug(format, arg1, arg2); + } + }); + } + @Override public void debug(String format, Object... args) { logAll( @@ -131,6 +191,36 @@ public void debug(String message, Throwable throwable) { }); } + @Override + public void info(String message) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.info(message); + } + }); + } + + @Override + public void info(String format, Object arg1) { + logAll( + log -> { + if (log.isInfoEnabled()) { + log.info(format, arg1); + } + }); + } + + @Override + public void info(String format, Object arg1, Object arg2) { + logAll( + log -> { + if (log.isInfoEnabled()) { + log.info(format, arg1, arg2); + } + }); + } + @Override public void info(String format, Object... args) { logAll( @@ -161,6 +251,36 @@ public void info(String message, Throwable throwable) { }); } + @Override + public void warn(String message) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.warn(message); + } + }); + } + + @Override + public void warn(String format, Object arg1) { + logAll( + log -> { + if (log.isWarnEnabled()) { + log.warn(format, arg1); + } + }); + } + + @Override + public void warn(String format, Object arg1, Object arg2) { + logAll( + log -> { + if (log.isWarnEnabled()) { + log.warn(format, arg1, arg2); + } + }); + } + @Override public void warn(String format, Object... args) { logAll( @@ -191,6 +311,36 @@ public void warn(String message, Throwable throwable) { }); } + @Override + public void error(String message) { + logAll( + log -> { + if (log.isTraceEnabled()) { + log.error(message); + } + }); + } + + @Override + public void error(String format, Object arg1) { + logAll( + log -> { + if (log.isErrorEnabled()) { + log.error(format, arg1); + } + }); + } + + @Override + public void error(String format, Object arg1, Object arg2) { + logAll( + log -> { + if (log.isErrorEnabled()) { + log.error(format, arg1, arg2); + } + }); + } + @Override public void error(String format, Object... args) { logAll( diff --git a/logging/src/main/java/com/facebook/logging/DynamicLogger.java b/logging/src/main/java/com/facebook/logging/DynamicLogger.java index 7955a9e5..4006b611 100644 --- a/logging/src/main/java/com/facebook/logging/DynamicLogger.java +++ b/logging/src/main/java/com/facebook/logging/DynamicLogger.java @@ -51,6 +51,21 @@ public boolean isErrorEnabled() { return getLogger().isErrorEnabled(); } + @Override + public void trace(String message) { + getLogger().trace(message); + } + + @Override + public void trace(String format, Object arg1) { + getLogger().trace(format, arg1); + } + + @Override + public void trace(String format, Object arg1, Object arg2) { + getLogger().trace(format, arg1, arg2); + } + @Override public void trace(String format, Object... args) { getLogger().trace(format, args); @@ -61,6 +76,21 @@ public void trace(Throwable t, String format, Object... args) { getLogger().trace(t, format, args); } + @Override + public void debug(String message) { + getLogger().debug(message); + } + + @Override + public void debug(String format, Object arg1) { + getLogger().debug(format, arg1); + } + + @Override + public void debug(String format, Object arg1, Object arg2) { + getLogger().debug(format, arg1, arg2); + } + @Override public void debug(String format, Object... args) { getLogger().debug(format, args); @@ -77,6 +107,21 @@ public void debug(String message, Throwable throwable) { getLogger().debug(message, throwable); } + @Override + public void info(String message) { + getLogger().info(message); + } + + @Override + public void info(String format, Object arg1) { + getLogger().info(format, arg1); + } + + @Override + public void info(String format, Object arg1, Object arg2) { + getLogger().info(format, arg1, arg2); + } + @Override public void info(String format, Object... args) { getLogger().info(format, args); @@ -93,6 +138,21 @@ public void info(String message, Throwable throwable) { getLogger().info(message, throwable); } + @Override + public void warn(String message) { + getLogger().warn(message); + } + + @Override + public void warn(String format, Object arg1) { + getLogger().warn(format, arg1); + } + + @Override + public void warn(String format, Object arg1, Object arg2) { + getLogger().warn(format, arg1, arg2); + } + @Override public void warn(String format, Object... args) { getLogger().warn(format, args); @@ -109,6 +169,21 @@ public void warn(String message, Throwable throwable) { getLogger().warn(message, throwable); } + @Override + public void error(String message) { + getLogger().error(message); + } + + @Override + public void error(String format, Object arg1) { + getLogger().error(format, arg1); + } + + @Override + public void error(String format, Object arg1, Object arg2) { + getLogger().error(format, arg1, arg2); + } + @Override public void error(String format, Object... args) { getLogger().error(format, args); diff --git a/logging/src/main/java/com/facebook/logging/Logger.java b/logging/src/main/java/com/facebook/logging/Logger.java index f518120f..6134b34d 100644 --- a/logging/src/main/java/com/facebook/logging/Logger.java +++ b/logging/src/main/java/com/facebook/logging/Logger.java @@ -27,10 +27,22 @@ public interface Logger { public boolean isErrorEnabled(); + public void trace(String message); + + public void trace(String format, Object arg1); + + public void trace(String format, Object arg1, Object arg2); + public void trace(String format, Object... args); public void trace(Throwable t, String format, Object... args); + public void debug(String message); + + public void debug(String format, Object arg1); + + public void debug(String format, Object arg1, Object arg2); + public void debug(String format, Object... args); public void debug(Throwable t, String format, Object... args); @@ -39,6 +51,12 @@ public interface Logger { @Deprecated public void debug(String message, Throwable throwable); + public void info(String message); + + public void info(String format, Object arg1); + + public void info(String format, Object arg1, Object arg2); + public void info(String format, Object... args); public void info(Throwable t, String format, Object... args); @@ -47,6 +65,12 @@ public interface Logger { @Deprecated public void info(String message, Throwable throwable); + public void warn(String message); + + public void warn(String format, Object arg1); + + public void warn(String format, Object arg1, Object arg2); + public void warn(String format, Object... args); public void warn(Throwable t, String format, Object... args); @@ -55,6 +79,12 @@ public interface Logger { @Deprecated public void warn(String message, Throwable throwable); + public void error(String message); + + public void error(String format, Object arg1); + + public void error(String format, Object arg1, Object arg2); + public void error(String format, Object... args); public void error(Throwable t, String format, Object... args); diff --git a/logging/src/main/java/com/facebook/logging/LoggerImpl.java b/logging/src/main/java/com/facebook/logging/LoggerImpl.java index 9a658ce2..24ed75aa 100644 --- a/logging/src/main/java/com/facebook/logging/LoggerImpl.java +++ b/logging/src/main/java/com/facebook/logging/LoggerImpl.java @@ -85,6 +85,27 @@ public boolean isErrorEnabled() { return logger.isErrorEnabled(); } + @Override + public void trace(String message) { + if (logger.isTraceEnabled()) { + logger.trace(message); + } + } + + @Override + public void trace(String format, Object arg1) { + if (logger.isTraceEnabled()) { + logger.trace(formatMessage(format, arg1)); + } + } + + @Override + public void trace(String format, Object arg1, Object arg2) { + if (logger.isTraceEnabled()) { + logger.trace(formatMessage(format, arg1, arg2)); + } + } + @Override public void trace(String format, Object... args) { if (logger.isTraceEnabled()) { @@ -99,6 +120,31 @@ public void trace(Throwable t, String format, Object... args) { } } + @Override + public void debug(String message) { + if (logger.isDebugEnabled()) { + logger.debug(message); + } + } + + @Override + public void debug(String format, Object arg1) { + if (logger.isDebugEnabled()) { + String message = formatMessage(format, arg1); + + logger.debug(message); + } + } + + @Override + public void debug(String format, Object arg1, Object arg2) { + if (logger.isDebugEnabled()) { + String message = formatMessage(format, arg1, arg2); + + logger.debug(message); + } + } + @Override public void debug(String format, Object... args) { if (logger.isDebugEnabled()) { @@ -125,6 +171,31 @@ public void debug(String message, Throwable throwable) { } } + @Override + public void info(String message) { + if (logger.isInfoEnabled()) { + logger.info(message); + } + } + + @Override + public void info(String format, Object arg1) { + if (logger.isInfoEnabled()) { + String message = formatMessage(format, arg1); + + logger.info(message); + } + } + + @Override + public void info(String format, Object arg1, Object arg2) { + if (logger.isInfoEnabled()) { + String message = formatMessage(format, arg1, arg2); + + logger.info(message); + } + } + @Override public void info(String format, Object... args) { if (logger.isInfoEnabled()) { @@ -151,6 +222,31 @@ public void info(String message, Throwable throwable) { } } + @Override + public void warn(String message) { + if (logger.isWarnEnabled()) { + logger.warn(message); + } + } + + @Override + public void warn(String format, Object arg1) { + if (logger.isWarnEnabled()) { + String message = formatMessage(format, arg1); + + logger.warn(message); + } + } + + @Override + public void warn(String format, Object arg1, Object arg2) { + if (logger.isWarnEnabled()) { + String message = formatMessage(format, arg1, arg2); + + logger.warn(message); + } + } + @Override public void warn(String format, Object... args) { if (logger.isWarnEnabled()) { @@ -177,6 +273,31 @@ public void warn(String message, Throwable throwable) { } } + @Override + public void error(String message) { + if (logger.isErrorEnabled()) { + logger.error(message); + } + } + + @Override + public void error(String format, Object arg1) { + if (logger.isErrorEnabled()) { + String message = formatMessage(format, arg1); + + logger.error(message); + } + } + + @Override + public void error(String format, Object arg1, Object arg2) { + if (logger.isErrorEnabled()) { + String message = formatMessage(format, arg1, arg2); + + logger.error(message); + } + } + @Override public void error(String format, Object... args) { if (logger.isErrorEnabled()) { @@ -208,6 +329,14 @@ public String getName() { return logger.getName(); } + private String formatMessage(String format, Object arg1) { + return String.format(format, arg1); + } + + private String formatMessage(String format, Object arg1, Object arg2) { + return String.format(format, arg1, arg2); + } + private String formatMessage(String format, Object[] args) { return args.length == 0 ? format : String.format(format, args); } diff --git a/logging/src/main/java/com/facebook/logging/TimeSamplingLogger.java b/logging/src/main/java/com/facebook/logging/TimeSamplingLogger.java index 901742be..08b918e1 100644 --- a/logging/src/main/java/com/facebook/logging/TimeSamplingLogger.java +++ b/logging/src/main/java/com/facebook/logging/TimeSamplingLogger.java @@ -75,6 +75,27 @@ public boolean isErrorEnabled() { return logger.isErrorEnabled(); } + @Override + public void trace(String message) { + if (shouldLog()) { + logger.trace(message); + } + } + + @Override + public void trace(String format, Object arg1) { + if (shouldLog()) { + logger.trace(format, arg1); + } + } + + @Override + public void trace(String format, Object arg1, Object arg2) { + if (shouldLog()) { + logger.trace(format, arg1, arg2); + } + } + @Override public void trace(String format, Object... args) { if (shouldLog()) { @@ -89,6 +110,27 @@ public void trace(Throwable t, String format, Object... args) { } } + @Override + public void debug(String message) { + if (shouldLog()) { + logger.debug(message); + } + } + + @Override + public void debug(String format, Object arg1) { + if (shouldLog()) { + logger.debug(format, arg1); + } + } + + @Override + public void debug(String format, Object arg1, Object arg2) { + if (shouldLog()) { + logger.debug(format, arg1, arg2); + } + } + @Override public void debug(String format, Object... args) { if (shouldLog()) { @@ -111,6 +153,27 @@ public void debug(String message, Throwable throwable) { } } + @Override + public void info(String message) { + if (shouldLog()) { + logger.info(message); + } + } + + @Override + public void info(String format, Object arg1) { + if (shouldLog()) { + logger.info(format, arg1); + } + } + + @Override + public void info(String format, Object arg1, Object arg2) { + if (shouldLog()) { + logger.info(format, arg1, arg2); + } + } + @Override public void info(String format, Object... args) { if (shouldLog()) { @@ -133,6 +196,27 @@ public void info(String message, Throwable throwable) { } } + @Override + public void warn(String message) { + if (shouldLog()) { + logger.warn(message); + } + } + + @Override + public void warn(String format, Object arg1) { + if (shouldLog()) { + logger.warn(format, arg1); + } + } + + @Override + public void warn(String format, Object arg1, Object arg2) { + if (shouldLog()) { + logger.warn(format, arg1, arg2); + } + } + @Override public void warn(String format, Object... args) { if (shouldLog()) { @@ -155,6 +239,27 @@ public void warn(String message, Throwable throwable) { } } + @Override + public void error(String message) { + if (shouldLog()) { + logger.error(message); + } + } + + @Override + public void error(String format, Object arg1) { + if (shouldLog()) { + logger.error(format, arg1); + } + } + + @Override + public void error(String format, Object arg1, Object arg2) { + if (shouldLog()) { + logger.error(format, arg1, arg2); + } + } + @Override public void error(String format, Object... args) { if (shouldLog()) { diff --git a/logging/src/test/java/com/facebook/logging/TestLoggerImpl.java b/logging/src/test/java/com/facebook/logging/TestLoggerImpl.java index 58144965..03e0df6e 100644 --- a/logging/src/test/java/com/facebook/logging/TestLoggerImpl.java +++ b/logging/src/test/java/com/facebook/logging/TestLoggerImpl.java @@ -37,6 +37,15 @@ public void testLocalLoggerGetsClass() throws Exception { Assert.assertEquals(privateLogger.getName(), getClass().getName()); } + @Test(groups = "fast") + public void testLogWithTwoArgs() throws Exception { + Logger privateLogger = LoggerImpl.getClassLogger(); + + privateLogger.info("%s with %d args", "Test", 2); + + Assert.assertEquals(privateLogger.getName(), getClass().getName()); + } + @Test(groups = "fast") public void testMessageWithPercentChar() throws Exception { // A random message with % in it