Skip to content

Commit 2cba2be

Browse files
authored
Merge pull request #318 from RedisLabsModules/add-logging-implementation
Provide the standard logging facility implementation.
2 parents 02c1ab3 + de65b4e commit 2cba2be

File tree

7 files changed

+210
-63
lines changed

7 files changed

+210
-63
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ serde = { version = "1", features = ["derive"] }
104104
nix = "0.26"
105105
cfg-if = "1"
106106
redis-module-macros-internals = { path = "./redismodule-rs-macros-internals" }
107+
log = "0.4"
107108

108109
[dev-dependencies]
109110
anyhow = "1"

examples/load_unload.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use redis_module::{redis_module, Context, LogLevel, RedisString, Status};
1+
use redis_module::{logging::RedisLogLevel, redis_module, Context, RedisString, Status};
22

33
static mut GLOBAL_STATE: Option<String> = None;
44

@@ -10,7 +10,7 @@ fn init(ctx: &Context, args: &[RedisString]) -> Status {
1010
(before, after)
1111
};
1212
ctx.log(
13-
LogLevel::Warning,
13+
RedisLogLevel::Warning,
1414
&format!("Update global state on LOAD. BEFORE: {before:?}, AFTER: {after:?}",),
1515
);
1616

@@ -24,7 +24,7 @@ fn deinit(ctx: &Context) -> Status {
2424
(before, after)
2525
};
2626
ctx.log(
27-
LogLevel::Warning,
27+
RedisLogLevel::Warning,
2828
&format!("Update global state on UNLOAD. BEFORE: {before:?}, AFTER: {after:?}"),
2929
);
3030

src/context/call_reply.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -548,20 +548,15 @@ impl TryFrom<&str> for VerbatimStringFormat {
548548
)));
549549
}
550550
let mut res = VerbatimStringFormat::default();
551-
value
552-
.chars()
553-
.into_iter()
554-
.take(3)
555-
.enumerate()
556-
.try_for_each(|(i, c)| {
557-
if c as u32 >= 127 {
558-
return Err(RedisError::String(
559-
"Verbatim format must contains only ASCI values.".to_owned(),
560-
));
561-
}
562-
res.0[i] = c as c_char;
563-
Ok(())
564-
})?;
551+
value.chars().take(3).enumerate().try_for_each(|(i, c)| {
552+
if c as u32 >= 127 {
553+
return Err(RedisError::String(
554+
"Verbatim format must contains only ASCI values.".to_owned(),
555+
));
556+
}
557+
res.0[i] = c as c_char;
558+
Ok(())
559+
})?;
565560
Ok(res)
566561
}
567562
}

src/context/mod.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ use std::os::raw::{c_char, c_int, c_long, c_longlong};
66
use std::ptr::{self, NonNull};
77
use std::sync::atomic::{AtomicPtr, Ordering};
88

9+
use crate::add_info_section;
910
use crate::key::{RedisKey, RedisKeyWritable};
11+
use crate::logging::RedisLogLevel;
1012
use crate::raw::{ModuleOptions, Version};
1113
use crate::redisvalue::RedisValueKey;
1214
use crate::{add_info_field_long_long, add_info_field_str, raw, utils, Status};
13-
use crate::{add_info_section, LogLevel};
1415
use crate::{RedisError, RedisResult, RedisString, RedisValue};
1516

1617
use std::ffi::CStr;
@@ -123,37 +124,43 @@ impl CallOptionsBuilder {
123124
/// It is implemented `Send` and `Sync` so it can safely be used
124125
/// from within different threads.
125126
pub struct DetachedContext {
126-
ctx: AtomicPtr<raw::RedisModuleCtx>,
127+
pub(crate) ctx: AtomicPtr<raw::RedisModuleCtx>,
127128
}
128129

129-
impl Default for DetachedContext {
130-
fn default() -> Self {
130+
impl DetachedContext {
131+
pub const fn new() -> Self {
131132
DetachedContext {
132133
ctx: AtomicPtr::new(ptr::null_mut()),
133134
}
134135
}
135136
}
136137

138+
impl Default for DetachedContext {
139+
fn default() -> Self {
140+
Self::new()
141+
}
142+
}
143+
137144
impl DetachedContext {
138-
pub fn log(&self, level: LogLevel, message: &str) {
145+
pub fn log(&self, level: RedisLogLevel, message: &str) {
139146
let c = self.ctx.load(Ordering::Relaxed);
140147
crate::logging::log_internal(c, level, message);
141148
}
142149

143150
pub fn log_debug(&self, message: &str) {
144-
self.log(LogLevel::Debug, message);
151+
self.log(RedisLogLevel::Debug, message);
145152
}
146153

147154
pub fn log_notice(&self, message: &str) {
148-
self.log(LogLevel::Notice, message);
155+
self.log(RedisLogLevel::Notice, message);
149156
}
150157

151158
pub fn log_verbose(&self, message: &str) {
152-
self.log(LogLevel::Verbose, message);
159+
self.log(RedisLogLevel::Verbose, message);
153160
}
154161

155162
pub fn log_warning(&self, message: &str) {
156-
self.log(LogLevel::Warning, message);
163+
self.log(RedisLogLevel::Warning, message);
157164
}
158165

159166
pub fn set_context(&self, ctx: &Context) -> Result<(), RedisError> {
@@ -266,24 +273,24 @@ impl Context {
266273
}
267274
}
268275

269-
pub fn log(&self, level: LogLevel, message: &str) {
276+
pub fn log(&self, level: RedisLogLevel, message: &str) {
270277
crate::logging::log_internal(self.ctx, level, message);
271278
}
272279

273280
pub fn log_debug(&self, message: &str) {
274-
self.log(LogLevel::Debug, message);
281+
self.log(RedisLogLevel::Debug, message);
275282
}
276283

277284
pub fn log_notice(&self, message: &str) {
278-
self.log(LogLevel::Notice, message);
285+
self.log(RedisLogLevel::Notice, message);
279286
}
280287

281288
pub fn log_verbose(&self, message: &str) {
282-
self.log(LogLevel::Verbose, message);
289+
self.log(RedisLogLevel::Verbose, message);
283290
}
284291

285292
pub fn log_warning(&self, message: &str) {
286-
self.log(LogLevel::Warning, message);
293+
self.log(RedisLogLevel::Warning, message);
287294
}
288295

289296
/// # Panics

src/lib.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
//#![allow(dead_code)]
2-
31
pub use crate::context::InfoContext;
4-
use strum_macros::AsRefStr;
52
extern crate num_traits;
63

74
pub mod alloc;
@@ -44,15 +41,11 @@ pub use crate::raw::*;
4441
pub use crate::redismodule::*;
4542
use backtrace::Backtrace;
4643

47-
/// `LogLevel` is a level of logging to be specified with a Redis log directive.
48-
#[derive(Clone, Copy, Debug, AsRefStr)]
49-
#[strum(serialize_all = "snake_case")]
50-
pub enum LogLevel {
51-
Debug,
52-
Notice,
53-
Verbose,
54-
Warning,
55-
}
44+
/// The detached Redis module context (the context of this module). It
45+
/// is only set to a proper value after the module is initialised via the
46+
/// provided [redis_module] macro.
47+
/// See [DetachedContext].
48+
pub static MODULE_CONTEXT: DetachedContext = DetachedContext::new();
5649

5750
pub fn base_info_func(
5851
ctx: &InfoContext,

0 commit comments

Comments
 (0)