Skip to content

Commit 5367b59

Browse files
committed
Skip unnecessary log formatting, include log category
1 parent 1e55da6 commit 5367b59

1 file changed

Lines changed: 52 additions & 26 deletions

File tree

src/ua/logger/rust_log.rs

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,77 @@ use std::{
33
ptr,
44
};
55

6+
use log::Level;
67
use open62541_sys::{UA_LogCategory, UA_LogLevel, UA_Logger, UA_String_vformat};
78

89
use crate::{ua, DataType as _, Error, Result};
910

11+
// This matches the crate name.
1012
const LOG_TARGET: &str = "open62541_sys";
1113

14+
// These match the category names from `ua_log_stdout.c` and `ua_log_syslog.c`.
15+
const LOG_CATEGORY_NETWORK: &str = "network";
16+
const LOG_CATEGORY_SECURECHANNEL: &str = "channel";
17+
const LOG_CATEGORY_SESSION: &str = "session";
18+
const LOG_CATEGORY_SERVER: &str = "server";
19+
const LOG_CATEGORY_CLIENT: &str = "client";
20+
const LOG_CATEGORY_USERLAND: &str = "userland";
21+
const LOG_CATEGORY_SECURITYPOLICY: &str = "security";
22+
const LOG_CATEGORY_EVENTLOOP: &str = "eventloop";
23+
const LOG_CATEGORY_PUBSUB: &str = "pubsub";
24+
const LOG_CATEGORY_DISCOVERY: &str = "discovery";
25+
const LOG_CATEGORY_UNKNOWN: &str = "unknown";
26+
1227
/// Creates logger that forwards to the `log` crate.
1328
///
14-
/// We can use this to prevent `open62541` from installing its own default logger (which outputs any
29+
/// We can use this to prevent `open62541` from installing its own default logger (which outputs all
1530
/// logs to stdout/stderr directly).
1631
pub(crate) fn logger() -> ua::Logger {
1732
unsafe extern "C" fn log_c(
1833
_log_context: *mut c_void,
1934
level: UA_LogLevel,
20-
_category: UA_LogCategory,
35+
category: UA_LogCategory,
2136
msg: *const c_char,
2237
args: open62541_sys::va_list_,
2338
) {
24-
let msg = match format_message(msg, args) {
25-
Ok(msg) => msg,
26-
Err(error) => {
27-
log::error!(target: LOG_TARGET, "Unknown log message: {error}");
28-
return;
29-
}
30-
};
31-
32-
let msg = msg.as_str().unwrap_or("Invalid log message");
33-
34-
if level == UA_LogLevel::UA_LOGLEVEL_FATAL {
39+
let level = match level {
3540
// Without fatal level in `log`, fall back to error.
36-
log::error!(target: LOG_TARGET, "{msg}");
37-
} else if level == UA_LogLevel::UA_LOGLEVEL_ERROR {
38-
log::error!(target: LOG_TARGET, "{msg}");
39-
} else if level == UA_LogLevel::UA_LOGLEVEL_WARNING {
40-
log::warn!(target: LOG_TARGET, "{msg}");
41-
} else if level == UA_LogLevel::UA_LOGLEVEL_INFO {
42-
log::info!(target: LOG_TARGET, "{msg}");
43-
} else if level == UA_LogLevel::UA_LOGLEVEL_DEBUG {
44-
log::debug!(target: LOG_TARGET, "{msg}");
45-
} else if level == UA_LogLevel::UA_LOGLEVEL_TRACE {
46-
log::trace!(target: LOG_TARGET, "{msg}");
47-
} else {
41+
UA_LogLevel::UA_LOGLEVEL_FATAL | UA_LogLevel::UA_LOGLEVEL_ERROR => Level::Error,
42+
UA_LogLevel::UA_LOGLEVEL_WARNING => Level::Warn,
43+
UA_LogLevel::UA_LOGLEVEL_INFO => Level::Info,
44+
UA_LogLevel::UA_LOGLEVEL_DEBUG => Level::Debug,
45+
UA_LogLevel::UA_LOGLEVEL_TRACE => Level::Trace,
4846
// Handle unexpected level by escalating to error.
49-
log::error!(target: LOG_TARGET, "{msg}");
47+
#[expect(clippy::match_same_arms, reason = "distinction of cases")]
48+
_ => Level::Error,
49+
};
50+
51+
if !log::log_enabled!(target: LOG_TARGET, level) {
52+
// Bail out early to skip formatting message.
53+
return;
5054
}
55+
56+
let msg = format_message(msg, args);
57+
let msg = match msg {
58+
Ok(ref msg) => msg.as_str().unwrap_or("Invalid log message"),
59+
Err(_) => "Unknown log message",
60+
};
61+
62+
let category = match category {
63+
UA_LogCategory::UA_LOGCATEGORY_NETWORK => LOG_CATEGORY_NETWORK,
64+
UA_LogCategory::UA_LOGCATEGORY_SECURECHANNEL => LOG_CATEGORY_SECURECHANNEL,
65+
UA_LogCategory::UA_LOGCATEGORY_SESSION => LOG_CATEGORY_SESSION,
66+
UA_LogCategory::UA_LOGCATEGORY_SERVER => LOG_CATEGORY_SERVER,
67+
UA_LogCategory::UA_LOGCATEGORY_CLIENT => LOG_CATEGORY_CLIENT,
68+
UA_LogCategory::UA_LOGCATEGORY_USERLAND => LOG_CATEGORY_USERLAND,
69+
UA_LogCategory::UA_LOGCATEGORY_SECURITYPOLICY => LOG_CATEGORY_SECURITYPOLICY,
70+
UA_LogCategory::UA_LOGCATEGORY_EVENTLOOP => LOG_CATEGORY_EVENTLOOP,
71+
UA_LogCategory::UA_LOGCATEGORY_PUBSUB => LOG_CATEGORY_PUBSUB,
72+
UA_LogCategory::UA_LOGCATEGORY_DISCOVERY => LOG_CATEGORY_DISCOVERY,
73+
_ => LOG_CATEGORY_UNKNOWN,
74+
};
75+
76+
log::log!(target: LOG_TARGET, level, "({category}) {msg}");
5177
}
5278

5379
unsafe extern "C" fn clear_c(logger: *mut UA_Logger) {

0 commit comments

Comments
 (0)