From ed2058fe67614f4519d7d873d668db6cf9937ae6 Mon Sep 17 00:00:00 2001 From: thinkAfCod Date: Fri, 9 Jun 2023 23:29:25 +0800 Subject: [PATCH] fix: build native image --- docker/Dockerfile | 3 +- hildr-node/build.gradle | 2 +- .../log/LazyInitRollingFileAppender.java | 63 +++++++ .../native-image/logback/reflect-config.json | 167 ++++++++++++++++++ hildr-node/src/main/resources/logback.xml | 2 +- 5 files changed, 234 insertions(+), 3 deletions(-) create mode 100644 hildr-node/src/main/java/io/optimism/log/LazyInitRollingFileAppender.java create mode 100644 hildr-node/src/main/resources/META-INF/native-image/logback/reflect-config.json diff --git a/docker/Dockerfile b/docker/Dockerfile index b17bb137..f0ea4aaf 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,7 +3,8 @@ RUN gu install native-image WORKDIR /root/hildr COPY . . RUN ./gradlew buildJarForDocker -RUN cd /root/hildr/hildr-node/build/docker && native-image -jar hildr-node.jar --static --initialize-at-build-time=ch.qos.logback,org.slf4j,io.opentelemetry,java.io hildr-node +RUN cd /root/hildr/hildr-node/build/docker && \ +native-image -jar hildr-node.jar --no-fallback --static --initialize-at-build-time=java.io.FileDescriptor,org.slf4j.MDC,io.opentelemetry.context,io.opentelemetry.api,io.opentelemetry.context,ch.qos.logback,io.netty.channel.AbstractChannel,org.slf4j.LoggerFactory hildr-node FROM eclipse-temurin:19-jdk diff --git a/hildr-node/build.gradle b/hildr-node/build.gradle index 1e02859a..8dd7e8fa 100644 --- a/hildr-node/build.gradle +++ b/hildr-node/build.gradle @@ -291,7 +291,7 @@ task buildBinary { exec { workingDir buildBinaryDir executable "sh" - args "-c", "native-image -jar ${project.name}.jar --static --initialize-at-build-time=ch.qos.logback,org.slf4j,io.opentelemetry,java.io ${project.name}" + args "-c", "native-image -jar ${project.name}.jar --static --initialize-at-build-time=ch.qos.logback,org.slf4j,io.opentelemetry,java.io,io.netty ${project.name}" standardOutput out } } diff --git a/hildr-node/src/main/java/io/optimism/log/LazyInitRollingFileAppender.java b/hildr-node/src/main/java/io/optimism/log/LazyInitRollingFileAppender.java new file mode 100644 index 00000000..97fc7af8 --- /dev/null +++ b/hildr-node/src/main/java/io/optimism/log/LazyInitRollingFileAppender.java @@ -0,0 +1,63 @@ +package io.optimism.log; + +import ch.qos.logback.core.rolling.RollingFileAppender; + +/** + * lazy init rolling file appender + * + * @author thinkAfCod + * @since 2023.06 + */ +public class LazyInitRollingFileAppender extends RollingFileAppender { + private boolean started = false; + + @Override + public void start() { + if (!inGraalImageBuildtimeCode()) { + super.start(); + this.started = true; + } + + } + + /** + * This method is synchronized to avoid double start from doAppender(). + */ + protected void maybeStart() { + lock.lock(); + try { + if (!started) + this.start(); + } finally { + lock.unlock(); + } + } + + @Override + public void doAppend(E eventObject) { + if (!inGraalImageBuildtimeCode()) { + if (!started) + maybeStart(); + + super.doAppend(eventObject); + } + } + + + //THE BELOW CODE CAN BE SUBSTITUTED BY ImageInfo.inImageBuildtimeCode() if you have it on your classpath + + private static final String PROPERTY_IMAGE_CODE_VALUE_BUILDTIME = "buildtime"; + private static final String PROPERTY_IMAGE_CODE_KEY = "org.graalvm.nativeimage.imagecode"; + + /** + * Returns true if (at the time of the call) code is executing in the context of Graal native image building + * (e.g. in a static initializer of class that will be contained in the image). + * Copy of graal code in org.graalvm.nativeimage.ImageInfo.inImageBuildtimeCode(). + * https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java + */ + private static boolean inGraalImageBuildtimeCode() { + return PROPERTY_IMAGE_CODE_VALUE_BUILDTIME.equals(System.getProperty(PROPERTY_IMAGE_CODE_KEY)); + } + +} + diff --git a/hildr-node/src/main/resources/META-INF/native-image/logback/reflect-config.json b/hildr-node/src/main/resources/META-INF/native-image/logback/reflect-config.json new file mode 100644 index 00000000..9a80df20 --- /dev/null +++ b/hildr-node/src/main/resources/META-INF/native-image/logback/reflect-config.json @@ -0,0 +1,167 @@ +[{ + "name" : "com.sample.ColorConverter", + "allPublicConstructors": true, + "allPublicMethods": true, + "allDeclaredMethods": true +}, + { + "name": "ch.qos.logback.classic.pattern.DateConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.MessageConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ThrowableProxyConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.NopThrowableInformationConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ContextNameConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldYellowCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.LoggerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.ReplacingCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldBlueCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.CyanCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.RedCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.WhiteCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.PropertyConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.RootCauseFirstThrowableProxyConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.MethodOfCallerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.LevelConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.IdentityCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldWhiteCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.MarkerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldCyanCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldMagentaCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.RelativeTimeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.MagentaCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ClassOfCallerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.LineOfCallerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.FileOfCallerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldGreenCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.LocalSequenceNumberConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.YellowCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.GrayCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.MDCConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ClassOfCallerConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BoldRedCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.GreenCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.core.pattern.color.BlackCompositeConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.ThreadConverter", + "allDeclaredConstructors": true + }, + { + "name": "ch.qos.logback.classic.pattern.LineSeparatorConverter", + "allDeclaredConstructors": true + } +] diff --git a/hildr-node/src/main/resources/logback.xml b/hildr-node/src/main/resources/logback.xml index e78fd95d..c01ff9bd 100644 --- a/hildr-node/src/main/resources/logback.xml +++ b/hildr-node/src/main/resources/logback.xml @@ -6,7 +6,7 @@ - + logs/app.log app-%d{yyyy-MM-dd HH}.gz