summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-09-27 17:41:27 -0400
committerMason Reed <mason@vector35.com>2025-10-22 00:36:25 -0400
commitd75102a9b85b48eafbd02414f4f2825ad5a28579 (patch)
tree7c21506d904ed0405752fad5103c623ac5d8819c /rust
parent1d554b5af1b43ced740725c1812949af1447b7ea (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.rs45
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) {}