-
Notifications
You must be signed in to change notification settings - Fork 91
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add configurable logging system #407
Add configurable logging system #407
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool, thank you for looking into this! This already looks pretty good, but I have some comments after the first round of review.
...in/ldk-node-android/lib/src/androidTest/kotlin/org/lightningdevkit/ldknode/AndroidLibTest.kt
Show resolved
Hide resolved
tests/common/mod.rs
Outdated
} | ||
|
||
/// Simple in-memory mock `log` logger for tests. | ||
#[derive(Debug)] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this Debug
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NodeBuilder
is Debug
, and it fields an optional LogWriterConfig
. The config object has to be Debug
and custom log writer variant needs to implement it for this reason.
@enigbe Is there any update on this? Please let me know if you're hitting any blockers. This seems to need a minor rebase by now. |
No blockers on this. I'll be pushing updates later today. |
1d57cab
to
d8eb0e1
Compare
7fa2928
to
283fe85
Compare
@enigbe Please let me know if/when this is ready for the next round of review! |
0660dfa
to
6766c60
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tnull I believe this is ready for another review. I have addressed the majority of the concerns you raised in the first pass.
Regarding your concerns about testing the logging to custom loggers, I agree that the necessary refactor would be extensive and could detract from the purpose of this PR. As such, I plan to address these test-related changes in a follow-up PR.
Additionally, I encountered some challenges testing a custom logger in Kotlin and would greatly appreciate your guidance or suggestions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did another round of review, already looks pretty good.
I took a quick look at the Kotlin failures, but also couldn't immediately spot what's up, let me know if you want me to have a closer look though.
Btw, you could consider rebasing on #426 (or on main after it lands) which generally fixes pre-existing CI failures.
src/logger.rs
Outdated
|
||
impl LogWriter for Writer { | ||
fn log(&self, record: LogRecord) { | ||
let log = format!( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, so format!
allocates a string on the heap. As we try to avoid allocations (to reduce heap fragmentation where possible), can we a) only create this string when we're sure we need it to log (i.e, after passing the log level filtering), and b) can we avoid it altogether for the CustomWriter
case, and possibly even the LogFacadeWriter
case? In the latter case we should be able to give the arguments to the respective macros directly, no?
...in/ldk-node-android/lib/src/androidTest/kotlin/org/lightningdevkit/ldknode/AndroidLibTest.kt
Show resolved
Hide resolved
322f97f
to
3b71223
Compare
src/payment/unified_qr.rs
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Feel free to drop this commit and rebase cleanly on main.
f06097b
to
c43fe47
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool, basically LGTM, just a few last-minute nits/and cleanups.
Let's address them quickly and land this soon.
bindings/kotlin/ldk-node-jvm/lib/src/test/kotlin/org/lightningdevkit/ldknode/LibraryTest.kt
Show resolved
Hide resolved
src/builder.rs
Outdated
/// Sets the log file path if the log file needs to live separate from the storage directory path. | ||
pub fn set_log_file_path(&mut self, log_dir_path: String) -> &mut Self { | ||
self.config.log_file_path = Some(log_dir_path); | ||
/// Configures the [`Node`] instance to write logs to the filesystem with an optional |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Let's end the first paragraph after filesystem
and give explaining the two arguments a short sentence of their own, something like:
/// Configures the [`Node`] instance to write logs to the filesystem with an optional | |
/// Configures the [`Node`] instance to write logs to the filesystem. | |
/// | |
/// If set to `None`, `log_file_path` will default to [`DEFAULT_LOG_FILE_PATH`]. | |
/// If set to `None`, `log_level` will default to [`DEFAULT_LOG_LEVEL`]. |
src/builder.rs
Outdated
self | ||
} | ||
|
||
/// Configures the [`Node`] instance to write logs to the provided custom log writer. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Let's link LogWriter
here:
/// Configures the [`Node`] instance to write logs to the provided custom log writer. | |
/// Configures the [`Node`] instance to write logs to the provided custom [`LogWriter`]. |
src/builder.rs
Outdated
/// Sets the log file path if logs need to live separate from the storage directory path. | ||
pub fn set_log_file_path(&self, log_file_path: String) { | ||
self.inner.write().unwrap().set_log_file_path(log_file_path); | ||
/// Configures the [`Node`] instance to write logs to the filesystem with an optional |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adjust as above.
src/builder.rs
Outdated
self.inner.write().unwrap().set_log_facade_logger(log_level); | ||
} | ||
|
||
/// Configures the [`Node`] instance to write logs to the provided custom log writer. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adjust as above.
src/lib.rs
Outdated
@@ -111,6 +111,8 @@ pub use event::Event; | |||
|
|||
pub use io::utils::generate_entropy_mnemonic; | |||
|
|||
pub use config::FilesystemLoggerConfig; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As mentioned above, no need to export this anymore.
src/logger.rs
Outdated
use std::fs; | ||
use std::io::Write; | ||
use std::path::Path; | ||
use std::sync::Arc; | ||
|
||
/// A unit of logging output with Metadata to enable filtering module_path, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Lowercase metadata
and tick all the variable names:
/// A unit of logging output with Metadata to enable filtering module_path, | |
/// A unit of logging output with metadata to enable filtering `module_path`, |
pub line: u32, | ||
} | ||
|
||
#[cfg(feature = "uniffi")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This needs docs (copied from above).
level: Level, | ||
/// Defines the behavior required for writing log records. | ||
/// | ||
/// This version is used when the `uniffi` feature is enabled. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's still add the second paragraph from above here before going into the Uniffi-specific differences.
tests/integration_tests_rust.rs
Outdated
@@ -216,6 +217,9 @@ fn start_stop_reinit() { | |||
setup_builder!(builder, config); | |||
builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config)); | |||
|
|||
let log_file_path = format!("{}/{}", config.storage_dir_path, "ldk_node.log"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's drop this? Or any reason why this test would need a special case? If we want to test the interface works, we could consider adding a test for that which then however should confirm that only the correct types of messages are logged. But let's maybe add that as a follow-up.
* Add flexible log writer interface for multiple destinations * Implement filesystem writing capability via FilesystemLogger * Prefix LDK-based objects with 'Ldk' for consistency * Add configuration options for log file path and log level
241bfcc
to
96522d9
Compare
- modify tests to forward logs to mock in-memory `log` logger - correct "Forwards" spelling error
* Add support for user-provided custom logger to write logs to, allowing users to provide any logger that implements LogWriter * Add test to cover this use case, implementing Log- Writer for the mock, in-memory MockLogger. * Fix setting log's global logger twice. * Revert the renaming of LogLevel to LdkLevel.
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.
96522d9
to
e509cf8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 🎉
Thank you very much!
Sweet will try this out |
Overview
This PR introduces a flexible logging system for LDK Node by implementing a
LogWriter
interface that supports writing logs to different destinations.What this PR does
LogWriter
interface, allowingWriter
variants to handle log output destinations. The supportedWriter
variants can now:LogWriter
to bindings.log
logger,LogWriter
logger.Related Issue(s)
logger
interface #309