diff options
| author | Mason Reed <mason@vector35.com> | 2025-09-27 17:41:27 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-10-22 00:36:25 -0400 |
| commit | d75102a9b85b48eafbd02414f4f2825ad5a28579 (patch) | |
| tree | 7c21506d904ed0405752fad5103c623ac5d8819c /rust | |
| parent | 1d554b5af1b43ced740725c1812949af1447b7ea (diff) | |
[Rust] Expose a non `log` specific function for sending logs to a `Logger`
This allows you to reference multiple different loggers without setting a global logger instance using `Logger::init`.
Diffstat (limited to 'rust')
| -rw-r--r-- | rust/src/logger.rs | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/rust/src/logger.rs b/rust/src/logger.rs index b48d847a..a4046212 100644 --- a/rust/src/logger.rs +++ b/rust/src/logger.rs @@ -91,6 +91,25 @@ impl Ref<Logger> { log::set_max_level(self.level); let _ = log::set_boxed_logger(Box::new(self)); } + + /// Send a log to the logger instance, if you instead want to use the `log` crate and its facilities, + /// you should use [`Ref<Logger>::init`] to initialize the `log` compatible logger. + pub fn send_log(&self, level: Level, msg: &str) { + use binaryninjacore_sys::BNLog; + if let Ok(msg) = CString::new(format!("{}", msg)) { + let logger_name = self.name().to_cstr(); + unsafe { + BNLog( + self.session_id(), + level, + logger_name.as_ptr(), + 0, + c"%s".as_ptr(), + msg.as_ptr(), + ) + } + } + } } impl Default for Ref<Logger> { @@ -127,29 +146,13 @@ impl log::Log for Ref<Logger> { fn log(&self, record: &log::Record) { use self::Level::*; - use binaryninjacore_sys::BNLog; - use log::Level; - let level = match record.level() { - Level::Error => ErrorLog, - Level::Warn => WarningLog, - Level::Info => InfoLog, - Level::Debug | Level::Trace => DebugLog, - }; - - if let Ok(msg) = CString::new(format!("{}", record.args())) { - let logger_name = self.name().to_cstr(); - unsafe { - BNLog( - self.session_id(), - level, - logger_name.as_ptr(), - 0, - c"%s".as_ptr(), - msg.as_ptr(), - ); - } + log::Level::Error => ErrorLog, + log::Level::Warn => WarningLog, + log::Level::Info => InfoLog, + log::Level::Debug | log::Level::Trace => DebugLog, }; + self.send_log(level, &format!("{}", record.args())); } fn flush(&self) {} |
