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