Logging 如何实现附加到文件的记录器?

Logging 如何实现附加到文件的记录器?,logging,rust,Logging,Rust,我正在尝试实现log::log,以便调用log()将消息附加到文件中。这是我目前的日志: pub struct MyLogger { loglevel: LogLevelFilter, logfile: Option<File>, } pub结构MyLogger{ loglevel:LogLevelFilter, 日志文件:选项, } 以及log::log的实现: impl Log for Logger { fn enabled(&self, me

我正在尝试实现
log::log
,以便调用
log()
将消息附加到文件中。这是我目前的日志:

pub struct MyLogger {
    loglevel: LogLevelFilter,
    logfile: Option<File>,
}
pub结构MyLogger{
loglevel:LogLevelFilter,
日志文件:选项,
}
以及log::log的实现:

impl Log for Logger {
    fn enabled(&self, metadata: &LogMetadata) -> bool {
        metadata.level() <= self.loglevel
    }

    fn log(&self, record: &LogRecord) {
        if self.enabled(record.metadata()) {
            let msg = format!("{}\t| {}\t| {}", record.level(), record.target(), record.args());
            self.logfile.write_all(msg.as_bytes()).unwrap();
        }
    }
}
日志记录器的impl日志{ 启用fn(&self,元数据:&LogMetadata)->bool{
metadata.level()每当你需要呈现一个不可变的接口,但在幕后进行变异时,你可以使用内部可变性。通常的方法是使用来自的某些东西。文档会调用以下特定用例:

因为你必须使用变异来实现一个最初被定义为采用的特质方法&self

具体来说,我会尝试在这种情况下使用

不幸的是,要求实现者也是
Sync+Send
,但单元格不是。这意味着我们需要升级到可以处理多个线程的功能。这就是:

extern板条箱日志;
使用std::fs::File;
使用std::io::Write;
使用std::sync::Mutex;
使用日志::{LogLevelFilter,LogMetadata,LogRecord,log};
发布结构文件记录器{
loglevel:LogLevelFilter,
日志文件:选项,
}
文件记录器的impl日志{
启用fn(&self,元数据:&LogMetadata)->bool{

metadata.level()注意:通常不需要在调用
log
的线程中进行同步I/O,因此通常使用内部队列或缓冲区,并有一个专用的“使用者”线程负责写入文件。在生锈的世界中,可能是通道?
extern crate log;

use std::fs::File;
use std::io::Write;
use std::sync::Mutex;
use log::{LogLevelFilter,LogMetadata,LogRecord,Log};

pub struct FileLogger {
    loglevel: LogLevelFilter,
    logfile: Option<Mutex<File>>,
}

impl Log for FileLogger {
    fn enabled(&self, metadata: &LogMetadata) -> bool {
        metadata.level() <= self.loglevel
    }

    fn log(&self, record: &LogRecord) {
        if self.enabled(record.metadata()) {
            let msg = format!("{}\t| {}\t| {}", record.level(), record.target(), record.args());
            self.logfile.as_ref().map(|f| {
                f.lock().unwrap().write_all(msg.as_bytes()).unwrap()
            });
        }
    }
}

#[test]
fn it_works() {
}