Skip to content

Commit 5374d8b

Browse files
halibobo1205claudecodeant-ai[bot]
committed
feat(log): bridge JUL to SLF4J and improve shutdown log reliability
**Route runtime diagnostics into the main logs and reduce log loss during shutdown** ### What Changed - gRPC and other Java runtime warnings now appear in the application log instead of going only to standard error. - Database size stats are no longer printed at info level during startup, which reduces log noise. - Shutdown now waits longer before stopping the log system, giving pending messages more time to flush. - Async appender now allows up to 5 seconds to drain its queue on shutdown. - Interrupted shutdowns now show a clearer log message. - Test log config suppresses verbose ROCKSDB and metrics output (WARN level). - Logging dependencies were updated to keep the log routing setup aligned. ### Impact `✅ Fewer missed gRPC error logs` `✅ Cleaner startup output` `✅ Fewer lost shutdown logs` Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: codeant-ai[bot] <151821869+codeant-ai[bot]@users.noreply.github.com>
1 parent 721b165 commit 5374d8b

7 files changed

Lines changed: 47 additions & 30 deletions

File tree

build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ subprojects {
8181
}
8282

8383
dependencies {
84-
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
85-
implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25'
84+
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.36'
85+
implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.36'
86+
implementation group: 'org.slf4j', name: 'jul-to-slf4j', version: '1.7.36'
8687
implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.13'
8788
implementation "com.google.code.findbugs:jsr305:3.0.0"
8889
implementation group: 'org.springframework', name: 'spring-context', version: "${springVersion}"

chainbase/src/main/java/org/tron/common/storage/metric/DbStat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ protected void statProperty() {
1717
double size = Double.parseDouble(tmp[2]) * 1048576.0;
1818
Metrics.gaugeSet(MetricKeys.Gauge.DB_SST_LEVEL, files, getEngine(), getName(), level);
1919
Metrics.gaugeSet(MetricKeys.Gauge.DB_SIZE_BYTES, size, getEngine(), getName(), level);
20-
logger.info("DB {}, level:{},files:{},size:{} M",
20+
logger.debug("DB {}, level:{},files:{},size:{} M",
2121
getName(), level, files, size / 1048576.0);
2222
});
2323
} catch (Exception e) {

common/src/main/java/org/tron/common/parameter/CommonParameter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
import java.util.ArrayList;
77
import java.util.List;
88
import java.util.Set;
9+
import java.util.logging.Level;
10+
import java.util.logging.Logger;
911
import lombok.Getter;
1012
import lombok.Setter;
13+
import org.slf4j.bridge.SLF4JBridgeHandler;
1114
import org.tron.common.args.GenesisBlock;
1215
import org.tron.common.config.DbBackupConfig;
1316
import org.tron.common.cron.CronExpression;
@@ -23,6 +26,15 @@
2326

2427
public class CommonParameter {
2528

29+
// set here for test can work
30+
static {
31+
SLF4JBridgeHandler.removeHandlersForRootLogger();
32+
if (!SLF4JBridgeHandler.isInstalled()) {
33+
SLF4JBridgeHandler.install();
34+
}
35+
Logger.getLogger("io.grpc").setLevel(Level.ALL);
36+
}
37+
2638
protected static CommonParameter PARAMETER = new CommonParameter();
2739

2840
// Runtime chain state: set by VMConfig.initVmHardFork()

framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import ch.qos.logback.core.hook.ShutdownHookBase;
44
import ch.qos.logback.core.util.Duration;
5-
import org.tron.program.FullNode;
65

76
/**
87
* @author kiven
@@ -16,11 +15,16 @@ public class TronLogShutdownHook extends ShutdownHookBase {
1615
private static final Duration CHECK_SHUTDOWN_DELAY = Duration.buildByMilliseconds(100);
1716

1817
/**
19-
* The check times before shutdown. default is 60000/100 = 600 times.
18+
* Maximum time to wait for a graceful application shutdown before forcing
19+
* log flush. The thread pool managed by ExecutorServiceManager will be
20+
* forcibly shut down after at most 60 seconds, so 180 s gives enough
21+
* headroom for all shutdown phases to complete before logs are flushed.
2022
*/
21-
private final long check_times = 60 * 1000 / CHECK_SHUTDOWN_DELAY.getMilliseconds();
23+
private static final long MAX_WAIT_MS = 3 * 60 * 1000;
2224

23-
// if true, shutdown hook will be executed , for example, 'java -jar FullNode.jar -[v|h]'.
25+
private final long checkTimes = MAX_WAIT_MS / CHECK_SHUTDOWN_DELAY.getMilliseconds();
26+
27+
// if true, shutdown hook will be executed, for example, 'java -jar FullNode.jar -[v|h]'.
2428
public static volatile boolean shutDown = true;
2529

2630
public TronLogShutdownHook() {
@@ -29,16 +33,18 @@ public TronLogShutdownHook() {
2933
@Override
3034
public void run() {
3135
try {
32-
for (int i = 0; i < check_times; i++) {
36+
for (long i = 0; i < checkTimes; i++) {
3337
if (shutDown) {
3438
break;
3539
}
36-
addInfo("Sleeping for " + CHECK_SHUTDOWN_DELAY);
40+
if (i % 100 == 0) {
41+
addInfo("Waiting for application shutdown... elapsed=" + (i / 10) + "s");
42+
}
3743
Thread.sleep(CHECK_SHUTDOWN_DELAY.getMilliseconds());
3844
}
3945
} catch (InterruptedException e) {
4046
Thread.currentThread().interrupt();
41-
addInfo("TronLogShutdownHook run error :" + e.getMessage());
47+
addInfo("TronLogShutdownHook interrupted: " + e.getMessage());
4248
}
4349
super.stop();
4450
}

framework/src/main/resources/logback.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
<!-- (the smaller value -> flush occurs often) -->
6262
<queueSize>100</queueSize>
6363
<includeCallerData>true</includeCallerData>
64+
<!-- Allow up to 5 s to drain the queue on shutdown before giving up -->
65+
<maxFlushTime>5000</maxFlushTime>
6466
<appender-ref ref="FILE"/>
6567
</appender>
6668

framework/src/test/resources/logback-test.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,8 @@
3838

3939
<logger level="DEBUG" name="Test"/>
4040
<logger level="DEBUG" name="Manager"/>
41+
<logger level="WARN" name="ROCKSDB"/> <!--RocksDB start log is very verbose, so we set it to WARN level-->
42+
<logger level="WARN" name="metrics"/> <!--Metrics log is very verbose, so we set it to WARN level-->
43+
4144

4245
</configuration>

gradle/verification-metadata.xml

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,12 +2198,20 @@
21982198
<sha256 value="bd52ddfaba7afebdf66c39d59a3d08d7fd406ef5c330187cc223ef285b59ca49" origin="Generated by Gradle"/>
21992199
</artifact>
22002200
</component>
2201-
<component group="org.slf4j" name="jcl-over-slf4j" version="1.7.25">
2202-
<artifact name="jcl-over-slf4j-1.7.25.jar">
2203-
<sha256 value="5e938457e79efcbfb3ab64bc29c43ec6c3b95fffcda3c155f4a86cc320c11e14" origin="Generated by Gradle"/>
2201+
<component group="org.slf4j" name="jcl-over-slf4j" version="1.7.36">
2202+
<artifact name="jcl-over-slf4j-1.7.36.jar">
2203+
<sha256 value="ab57ca8fd223772c17365d121f59e94ecbf0ae59d08c03a3cb5b81071c019195" origin="Generated by Gradle"/>
22042204
</artifact>
2205-
<artifact name="jcl-over-slf4j-1.7.25.pom">
2206-
<sha256 value="f318976d3d4bd3f36a9bab47af4b17eaf671603e3d7a92e6c67b2004462e0f2d" origin="Generated by Gradle"/>
2205+
<artifact name="jcl-over-slf4j-1.7.36.pom">
2206+
<sha256 value="bd96243d7d4218cd7cc7d45c0e30fa13480a1a4f91d356edd7dfe93f1ffb68e6" origin="Generated by Gradle"/>
2207+
</artifact>
2208+
</component>
2209+
<component group="org.slf4j" name="jul-to-slf4j" version="1.7.36">
2210+
<artifact name="jul-to-slf4j-1.7.36.jar">
2211+
<sha256 value="9e641fb142c5f0b0623d6222c09ea87523a41bf6bed48ac79940724010b989de" origin="Generated by Gradle"/>
2212+
</artifact>
2213+
<artifact name="jul-to-slf4j-1.7.36.pom">
2214+
<sha256 value="99ff5340c4642a30829d3d98253f123e7a3ef573483164477c88d89d7e6586b7" origin="Generated by Gradle"/>
22072215
</artifact>
22082216
</component>
22092217
<component group="org.slf4j" name="slf4j-api" version="1.7.25">
@@ -2232,21 +2240,6 @@
22322240
<sha256 value="fb046a9c229437928bb11c2d27c8b5d773eb8a25e60cbd253d985210dedc2684" origin="Generated by Gradle"/>
22332241
</artifact>
22342242
</component>
2235-
<component group="org.slf4j" name="slf4j-parent" version="1.7.25">
2236-
<artifact name="slf4j-parent-1.7.25.pom">
2237-
<sha256 value="18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6" origin="Generated by Gradle"/>
2238-
</artifact>
2239-
</component>
2240-
<component group="org.slf4j" name="slf4j-parent" version="1.7.30">
2241-
<artifact name="slf4j-parent-1.7.30.pom">
2242-
<sha256 value="11647956e48a0c5bfb3ac33f6da7e83f341002b6857efd335a505b687be34b75" origin="Generated by Gradle"/>
2243-
</artifact>
2244-
</component>
2245-
<component group="org.slf4j" name="slf4j-parent" version="1.7.32">
2246-
<artifact name="slf4j-parent-1.7.32.pom">
2247-
<sha256 value="5ab349d0f4c7bc08ed0ef1f4d9386cb1940a2f4d6f152150e16dbbecc0b83c70" origin="Generated by Gradle"/>
2248-
</artifact>
2249-
</component>
22502243
<component group="org.slf4j" name="slf4j-parent" version="1.7.36">
22512244
<artifact name="slf4j-parent-1.7.36.pom">
22522245
<sha256 value="bb388d37fbcdd3cde64c3cede21838693218dc451f04040c5df360a78ed7e812" origin="Generated by Gradle"/>

0 commit comments

Comments
 (0)