@@ -3,51 +3,77 @@ use std::{
33 ptr,
44} ;
55
6+ use log:: Level ;
67use open62541_sys:: { UA_LogCategory , UA_LogLevel , UA_Logger , UA_String_vformat } ;
78
89use crate :: { ua, DataType as _, Error , Result } ;
910
11+ // This matches the crate name.
1012const 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).
1631pub ( 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