Skip to content

Commit e509cf8

Browse files
committed
refactor: optimize logging system
This commit addresses a series of fixes, refactors, and documentation changes meant to optimize the new logging system to be better with: - Improved memory usage by eliminating unnecessary data allocations and improving log record handling. - Enhanced logging system with support for foreign implementations (as tested with Kotlin). - Improved documentation across board. - Cleaner refactors and simpler code that improve clarity. - Streamlined logging configuration. - Pre-existing bug fixes.
1 parent 63f08b2 commit e509cf8

File tree

11 files changed

+352
-322
lines changed

11 files changed

+352
-322
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ libc = "0.2"
8080
uniffi = { version = "0.27.3", features = ["build"], optional = true }
8181
serde = { version = "1.0.210", default-features = false, features = ["std", "derive"] }
8282
serde_json = { version = "1.0.128", default-features = false, features = ["std"] }
83-
log = { version = "0.4.22", features = ["std"]}
83+
log = { version = "0.4.22", default-features = false, features = ["std"]}
8484

8585
vss-client = "0.3"
8686
prost = { version = "0.11.6", default-features = false}

bindings/kotlin/ldk-node-android/lib/src/androidTest/kotlin/org/lightningdevkit/ldknode/AndroidLibTest.kt

+5-8
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,16 @@
33
*/
44
package org.lightningdevkit.ldknode
55

6-
import kotlin.UInt
7-
import kotlin.test.Test
8-
import kotlin.test.assertEquals
6+
import androidx.test.ext.junit.runners.AndroidJUnit4
97
import kotlin.io.path.createTempDirectory
8+
import kotlin.test.Test
109
import org.junit.runner.RunWith
11-
import org.lightningdevkit.ldknode.*;
12-
import android.content.Context.MODE_PRIVATE
13-
import androidx.test.core.app.ApplicationProvider
14-
import androidx.test.ext.junit.runners.AndroidJUnit4
10+
import org.lightningdevkit.ldknode.*
1511

1612
@RunWith(AndroidJUnit4::class)
1713
class AndroidLibTest {
18-
@Test fun node_start_stop() {
14+
@Test
15+
fun node_start_stop() {
1916
val tmpDir1 = createTempDirectory("ldk_node").toString()
2017
println("Random dir 1: $tmpDir1")
2118
val tmpDir2 = createTempDirectory("ldk_node").toString()

bindings/kotlin/ldk-node-jvm/lib/src/test/kotlin/org/lightningdevkit/ldknode/LibraryTest.kt

+64
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import java.net.http.HttpRequest
99
import java.net.http.HttpResponse
1010
import kotlin.io.path.createTempDirectory
1111
import kotlin.test.assertEquals
12+
import kotlin.test.assertTrue
1213

1314
fun runCommandAndWait(vararg cmd: String): String {
1415
println("Running command \"${cmd.joinToString(" ")}\"")
@@ -92,6 +93,60 @@ fun waitForBlock(esploraEndpoint: String, blockHash: String) {
9293
}
9394
}
9495

96+
class CustomLogWriter(private var currentLogLevel: LogLevel = LogLevel.INFO) :
97+
LogWriter {
98+
enum class LogLevel {
99+
ERROR, WARN, INFO, DEBUG, TRACE, GOSSIP
100+
}
101+
102+
private val logMessages = mutableListOf<String>()
103+
104+
fun setLogLevel(level: LogLevel) {
105+
currentLogLevel = level
106+
}
107+
108+
fun getLogMessages(): List<String> {
109+
return logMessages.toList()
110+
}
111+
112+
override fun log(record: LogRecord) {
113+
val recordLevel =
114+
when (record.level.toString().lowercase()) {
115+
"error" -> LogLevel.ERROR
116+
"warn" -> LogLevel.WARN
117+
"info" -> LogLevel.INFO
118+
"debug" -> LogLevel.DEBUG
119+
"trace" -> LogLevel.TRACE
120+
"gossip" -> LogLevel.GOSSIP
121+
else -> LogLevel.INFO
122+
}
123+
124+
if (isLevelEnabled(recordLevel)) {
125+
val logMessage = formatRecord(record)
126+
logMessages.add(logMessage)
127+
println("$logMessage")
128+
}
129+
}
130+
131+
private fun formatRecord(record: LogRecord): String {
132+
val timestamp =
133+
java.time.LocalDateTime.now()
134+
.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
135+
return String.format(
136+
"%s %-6s [%s:%s] %s\n",
137+
timestamp,
138+
record.level,
139+
record.modulePath,
140+
record.line,
141+
record.args
142+
)
143+
}
144+
145+
private fun isLevelEnabled(level: LogLevel): Boolean {
146+
return level.ordinal <= currentLogLevel.ordinal
147+
}
148+
}
149+
95150
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
96151
class LibraryTest {
97152

@@ -106,6 +161,9 @@ class LibraryTest {
106161
}
107162

108163
@Test fun fullCycle() {
164+
val logWriter1 = CustomLogWriter(CustomLogWriter.LogLevel.GOSSIP)
165+
val logWriter2 = CustomLogWriter(CustomLogWriter.LogLevel.GOSSIP)
166+
109167
val tmpDir1 = createTempDirectory("ldk_node").toString()
110168
println("Random dir 1: $tmpDir1")
111169
val tmpDir2 = createTempDirectory("ldk_node").toString()
@@ -129,8 +187,11 @@ class LibraryTest {
129187

130188
val builder1 = Builder.fromConfig(config1)
131189
builder1.setChainSourceEsplora(esploraEndpoint, null)
190+
builder1.setCustomLogger(logWriter1)
191+
132192
val builder2 = Builder.fromConfig(config2)
133193
builder2.setChainSourceEsplora(esploraEndpoint, null)
194+
builder2.setCustomLogger(logWriter2)
134195

135196
val node1 = builder1.build()
136197
val node2 = builder2.build()
@@ -263,6 +324,9 @@ class LibraryTest {
263324
assert(spendableBalance1AfterClose < 100000u)
264325
assertEquals(102500uL, spendableBalance2AfterClose)
265326

327+
assertTrue(logWriter1.getLogMessages().isNotEmpty())
328+
assertTrue(logWriter2.getLogMessages().isNotEmpty())
329+
266330
node1.stop()
267331
node2.stop()
268332
}

bindings/ldk_node.udl

+10-18
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,16 @@ enum LogLevel {
3434
"Error",
3535
};
3636

37-
dictionary FilesystemLoggerConfig {
38-
string log_file_path;
37+
dictionary LogRecord {
3938
LogLevel level;
39+
string args;
40+
string module_path;
41+
u32 line;
4042
};
4143

42-
dictionary LogFacadeLoggerConfig {
43-
LogLevel level;
44+
[Trait, WithForeign]
45+
interface LogWriter {
46+
void log(LogRecord record);
4447
};
4548

4649
interface Builder {
@@ -57,8 +60,9 @@ interface Builder {
5760
void set_gossip_source_rgs(string rgs_server_url);
5861
void set_liquidity_source_lsps2(SocketAddress address, PublicKey node_id, string? token);
5962
void set_storage_dir_path(string storage_dir_path);
60-
void set_filesystem_logger(FilesystemLoggerConfig fs_config);
61-
void set_log_facade_logger(LogFacadeLoggerConfig lf_config);
63+
void set_filesystem_logger(string? log_file_path, LogLevel? log_level);
64+
void set_log_facade_logger(LogLevel log_level);
65+
void set_custom_logger(LogWriter log_writer);
6266
void set_network(Network network);
6367
[Throws=BuildError]
6468
void set_listening_addresses(sequence<SocketAddress> listening_addresses);
@@ -593,18 +597,6 @@ dictionary NodeAnnouncementInfo {
593597
sequence<SocketAddress> addresses;
594598
};
595599

596-
dictionary LogRecord {
597-
LogLevel level;
598-
string args;
599-
string module_path;
600-
u32 line;
601-
};
602-
603-
[Trait]
604-
interface LogWriter {
605-
void log(LogRecord record);
606-
};
607-
608600
[Custom]
609601
typedef string Txid;
610602

0 commit comments

Comments
 (0)