Skip to content

Make try_log public so that custom loggers can use it#104

Open
Boscop wants to merge 2 commits intoDrakulix:masterfrom
Boscop:make-try_log-pub
Open

Make try_log public so that custom loggers can use it#104
Boscop wants to merge 2 commits intoDrakulix:masterfrom
Boscop:make-try_log-pub

Conversation

@Boscop
Copy link

@Boscop Boscop commented Jun 4, 2022

My use case that requires this change is:
From my DLL plugin I want to log to a file but also to the host, by sending it strings (one per log record).
I need to log each line separately to the host, but Write doesn't let me know when each record starts/ends.
So I need to log to a String (actually Cursor<Vec<u8>>, then str::from_utf8, then send the String to the host) and I need to be able to call try_log for that.

Copy link
Owner

@Drakulix Drakulix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In principle I don't mind to do this, but right now try_log has no documentation.

If you could try to add those (and make sure to explain potential use-cases and reasons this function is public) I would gladly merge this!

@Boscop
Copy link
Author

Boscop commented Dec 2, 2022

I'm not sure what kind of doc to add.
In my use case, my DLL logger has to call try_log and then logs to the host via host_log.
(I need to log each line separately to the host, but Write wouldn't let me know when each record starts/ends.)

Like this:

pub struct HostLogger {
	level: LevelFilter,
	config: Config,
}

impl HostLogger {
	pub fn new(log_level: LevelFilter, config: Config) -> Box<HostLogger> {
		Box::new(HostLogger { level: log_level, config })
	}
}

impl Log for HostLogger {
	fn enabled(&self, metadata: &Metadata<'_>) -> bool {
		metadata.level() <= self.level
	}

	fn log(&self, record: &Record<'_>) {
		if self.enabled(record.metadata()) {
			let mut s = Vec::new();
			let _ = try_log(&self.config, record, &mut Cursor::new(&mut s));
			let s = std::str::from_utf8(&s).expect("utf8").trim();
			host_log(s);
		}
	}

	fn flush(&self) {}
}

impl SharedLogger for HostLogger {
	fn level(&self) -> LevelFilter {
		self.level
	}

	fn config(&self) -> Option<&Config> {
		Some(&self.config)
	}

	fn as_log(self: Box<Self>) -> Box<dyn Log> {
		Box::new(*self)
	}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants