Skip to content

Commit f014df6

Browse files
committed
initial commit
1 parent c2ef46d commit f014df6

File tree

22 files changed

+784
-0
lines changed

22 files changed

+784
-0
lines changed

chronicle-logger/pom.xml

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>com.open-elements.logging</groupId>
9+
<artifactId>java-logger-benchmark</artifactId>
10+
<version>1.0-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>chronicle-logger</artifactId>
14+
<version>1.0-SNAPSHOT</version>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>${groupId}</groupId>
19+
<artifactId>logger-api</artifactId>
20+
<version>${version}</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>net.openhft</groupId>
24+
<artifactId>chronicle-logger-core</artifactId>
25+
<version>4.21.82</version>
26+
</dependency>
27+
<dependency>
28+
<groupId>org.slf4j</groupId>
29+
<artifactId>slf4j-api</artifactId>
30+
<version>1.7.30</version>
31+
</dependency>
32+
</dependencies>
33+
34+
35+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.openelements.logger.chronicle;
2+
3+
import com.openelements.logger.api.Logger;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.stream.IntStream;
7+
import net.openhft.chronicle.logger.ChronicleLogLevel;
8+
import net.openhft.chronicle.logger.ChronicleLogManager;
9+
import net.openhft.chronicle.logger.ChronicleLogWriter;
10+
import org.slf4j.helpers.MessageFormatter;
11+
12+
public class ChronicleLogger implements Logger {
13+
14+
private final ChronicleLogWriter writer;
15+
16+
private Map<String, String> metadata = new HashMap<>();
17+
18+
private final String name;
19+
20+
public ChronicleLogger(Class source) {
21+
this.name = source.getName();
22+
this.writer = ChronicleLogManager.getInstance().getWriter(name);
23+
}
24+
25+
private String addAllAdditionalInfos(String message) {
26+
final String metadataString = metadata.entrySet().stream()
27+
.map(e -> e.getKey() + "=" + e.getValue())
28+
.reduce((a, b) -> a + ", " + b)
29+
.orElse("");
30+
return message + "[" + metadataString + "]";
31+
}
32+
33+
34+
@Override
35+
public void log(String message) {
36+
writer.write(ChronicleLogLevel.INFO, System.currentTimeMillis(), Thread.currentThread().getName(), name,
37+
addAllAdditionalInfos(message), null);
38+
}
39+
40+
@Override
41+
public void log(String message, Throwable throwable) {
42+
writer.write(ChronicleLogLevel.INFO, System.currentTimeMillis(), Thread.currentThread().getName(), name,
43+
addAllAdditionalInfos(message), throwable);
44+
}
45+
46+
@Override
47+
public void log(String message, Object... args) {
48+
writer.write(ChronicleLogLevel.INFO, System.currentTimeMillis(), Thread.currentThread().getName(), name,
49+
addAllAdditionalInfos(MessageFormatter.arrayFormat(message, args).getMessage()), null, null);
50+
}
51+
52+
@Override
53+
public void log(String message, Throwable throwable, Object... args) {
54+
writer.write(ChronicleLogLevel.INFO, System.currentTimeMillis(), Thread.currentThread().getName(), name,
55+
addAllAdditionalInfos(MessageFormatter.arrayFormat(message, args).getMessage()), throwable, null);
56+
}
57+
58+
@Override
59+
public Logger withMetadata(String key, Object value) {
60+
metadata.put(key, value.toString());
61+
return this;
62+
}
63+
64+
@Override
65+
public Logger withMarker(String marker) {
66+
if (metadata.containsKey("marker")) {
67+
final String markerValue = metadata.get("marker") + "&" + marker;
68+
metadata.put("marker", markerValue);
69+
} else {
70+
metadata.put("marker", marker);
71+
}
72+
return this;
73+
}
74+
75+
@Override
76+
public String createMessageWithPlaceholders(int placeholderCount) {
77+
return IntStream.range(0, placeholderCount)
78+
.mapToObj(i -> "{},")
79+
.reduce((a, b) -> a + " " + b)
80+
.orElse("");
81+
}
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module com.openelements.logger.chronicle {
2+
requires com.openelements.logger.api;
3+
requires chronicle.logger.core;
4+
requires org.slf4j;
5+
}

jmh-benchmarks/pom.xml

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>com.open-elements.logging</groupId>
9+
<artifactId>java-logger-benchmark</artifactId>
10+
<version>1.0-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>jmh-benchmarks</artifactId>
14+
<version>1.0-SNAPSHOT</version>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>${groupId}</groupId>
19+
<artifactId>chronicle-logger</artifactId>
20+
<version>${version}</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>${groupId}</groupId>
24+
<artifactId>jul-logger</artifactId>
25+
<version>${version}</version>
26+
</dependency>
27+
<dependency>
28+
<groupId>${groupId}</groupId>
29+
<artifactId>log4j2-logger</artifactId>
30+
<version>${version}</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.openjdk.jmh</groupId>
34+
<artifactId>jmh-core</artifactId>
35+
<version>1.37</version>
36+
<scope>test</scope>
37+
</dependency>
38+
</dependencies>
39+
40+
<build>
41+
<plugins>
42+
<plugin>
43+
<groupId>pw.krejci</groupId>
44+
<artifactId>jmh-maven-plugin</artifactId>
45+
<version>0.2.2</version>
46+
<executions>
47+
<execution>
48+
<id>run-benchmarks</id>
49+
<goals>
50+
<goal>benchmark</goal>
51+
</goals>
52+
<phase>test</phase>
53+
<configuration>
54+
<jvmArgsAppend>
55+
<arg>--add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --illegal-access=permit --add-exports java.base/jdk.internal.ref=ALL-UNNAMED</arg>
56+
</jvmArgsAppend>
57+
</configuration>
58+
</execution>
59+
</executions>
60+
</plugin>
61+
</plugins>
62+
</build>
63+
64+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.openelements.logger.benchmarks;
2+
3+
public class BenchmarkConstants {
4+
5+
public final static int WARMUP_ITERATIONS = 20;
6+
7+
public final static int WARMUP_TIME_IN_SECONDS_PER_ITERATION = 4;
8+
9+
public final static int MEASUREMENT_ITERATIONS = 20;
10+
11+
public final static int MEASUREMENT_TIME_IN_SECONDS_PER_ITERATION = 4;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.openelements.logger.benchmarks;
2+
3+
import static com.openelements.logger.benchmarks.BenchmarkConstants.MEASUREMENT_ITERATIONS;
4+
import static com.openelements.logger.benchmarks.BenchmarkConstants.MEASUREMENT_TIME_IN_SECONDS_PER_ITERATION;
5+
import static com.openelements.logger.benchmarks.BenchmarkConstants.WARMUP_ITERATIONS;
6+
import static com.openelements.logger.benchmarks.BenchmarkConstants.WARMUP_TIME_IN_SECONDS_PER_ITERATION;
7+
8+
import com.openelements.logger.api.Logger;
9+
import com.openelements.logger.chronicle.ChronicleLogger;
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.util.Comparator;
13+
import org.openjdk.jmh.annotations.Benchmark;
14+
import org.openjdk.jmh.annotations.BenchmarkMode;
15+
import org.openjdk.jmh.annotations.Fork;
16+
import org.openjdk.jmh.annotations.Measurement;
17+
import org.openjdk.jmh.annotations.Mode;
18+
import org.openjdk.jmh.annotations.Param;
19+
import org.openjdk.jmh.annotations.Scope;
20+
import org.openjdk.jmh.annotations.Setup;
21+
import org.openjdk.jmh.annotations.State;
22+
import org.openjdk.jmh.annotations.Warmup;
23+
24+
@State(Scope.Benchmark)
25+
public class ChronicleLoggerBenchmark {
26+
27+
@Param({"FILE"})
28+
public String loggingType;
29+
30+
@Setup
31+
public void init() throws Exception {
32+
if (Files.exists(Path.of("target/chronicle-logging"))) {
33+
Files.walk(Path.of("target/chronicle-logging"))
34+
.sorted(Comparator.reverseOrder())
35+
.map(Path::toFile)
36+
.forEach(f -> f.delete());
37+
}
38+
}
39+
40+
@Benchmark
41+
@Fork(1)
42+
@BenchmarkMode(Mode.Throughput)
43+
@Warmup(iterations = WARMUP_ITERATIONS, time = WARMUP_TIME_IN_SECONDS_PER_ITERATION)
44+
@Measurement(iterations = MEASUREMENT_ITERATIONS, time = MEASUREMENT_TIME_IN_SECONDS_PER_ITERATION)
45+
public void run() {
46+
Logger logger = new ChronicleLogger(ChronicleLoggerBenchmark.class);
47+
new LogLikeHell(logger).run();
48+
}
49+
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.openelements.logger.benchmarks;
2+
3+
import static com.openelements.logger.benchmarks.BenchmarkConstants.MEASUREMENT_ITERATIONS;
4+
import static com.openelements.logger.benchmarks.BenchmarkConstants.MEASUREMENT_TIME_IN_SECONDS_PER_ITERATION;
5+
import static com.openelements.logger.benchmarks.BenchmarkConstants.WARMUP_ITERATIONS;
6+
import static com.openelements.logger.benchmarks.BenchmarkConstants.WARMUP_TIME_IN_SECONDS_PER_ITERATION;
7+
8+
import com.openelements.logger.api.Logger;
9+
import com.openelements.logger.jul.JulLogger;
10+
import java.io.InputStream;
11+
import java.net.URL;
12+
import java.nio.file.Files;
13+
import java.nio.file.Path;
14+
import java.util.Objects;
15+
import java.util.logging.LogManager;
16+
import org.openjdk.jmh.annotations.Benchmark;
17+
import org.openjdk.jmh.annotations.BenchmarkMode;
18+
import org.openjdk.jmh.annotations.Fork;
19+
import org.openjdk.jmh.annotations.Measurement;
20+
import org.openjdk.jmh.annotations.Mode;
21+
import org.openjdk.jmh.annotations.Param;
22+
import org.openjdk.jmh.annotations.Scope;
23+
import org.openjdk.jmh.annotations.Setup;
24+
import org.openjdk.jmh.annotations.State;
25+
import org.openjdk.jmh.annotations.Warmup;
26+
27+
@State(Scope.Benchmark)
28+
public class JulLoggerBenchmark {
29+
30+
@Param({"FILE", "CONSOLE", "FILE_AND_CONSOLE"})
31+
public String loggingType;
32+
33+
@Setup
34+
public void init() throws Exception {
35+
Files.deleteIfExists(Path.of("target/jul-benchmark.log"));
36+
if (Objects.equals(loggingType, "FILE")) {
37+
updateLoggingConfig("jul-file-logging.properties");
38+
} else if (Objects.equals(loggingType, "CONSOLE")) {
39+
updateLoggingConfig("jul-console-logging.properties");
40+
} else if (Objects.equals(loggingType, "FILE_AND_CONSOLE")) {
41+
updateLoggingConfig("jul-file-and-console-logging.properties");
42+
}
43+
}
44+
45+
@Benchmark
46+
@Fork(1)
47+
@BenchmarkMode(Mode.Throughput)
48+
@Warmup(iterations = WARMUP_ITERATIONS, time = WARMUP_TIME_IN_SECONDS_PER_ITERATION)
49+
@Measurement(iterations = MEASUREMENT_ITERATIONS, time = MEASUREMENT_TIME_IN_SECONDS_PER_ITERATION)
50+
public void run() {
51+
Logger logger = new JulLogger(JulLoggerBenchmark.class);
52+
new LogLikeHell(logger).run();
53+
}
54+
55+
private static void updateLoggingConfig(final String configFileName) throws Exception {
56+
final URL resource = JulLoggerBenchmark.class.getClassLoader().getResource(configFileName);
57+
try (final InputStream is = resource.openStream()) {
58+
LogManager.getLogManager().updateConfiguration(is, null);
59+
}
60+
}
61+
}

0 commit comments

Comments
 (0)