首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rust slog打印调用位置(源文件名和行号)

rust slog打印调用位置(源文件名和行号)
EN

Stack Overflow用户
提问于 2021-08-17 06:55:33
回答 1查看 94关注 0票数 0

我使用的是slog 2.7。我正在寻找一种打印日志语句的源文件位置的方法。这里提供了一个使用env_logger的示例:Log source file and line numbers

下面提供了我当前的日志配置函数

代码语言:javascript
复制
pub fn configure_log(log_file_name: &str) -> slog::Logger {
    println!(
        "'{}' at configure_log(), log_file_name is:'{}'",
        chrono::prelude::Utc::now(),
        log_file_name
    );
    let log_file_path = std::path::Path::new(log_file_name);
    let dir_file_path = log_file_path.parent().unwrap();
    std::fs::create_dir_all(dir_file_path).unwrap();

    let log_file_handler_option = std::fs::OpenOptions::new()
            .create(true)
            .write(true)
            .truncate(true)
            .open(log_file_name)
            //.unwrap()
        ;
    let log_file_handler = match log_file_handler_option {
        Ok(f) => f,
        Err(e) => {
            println!("{}", e);
            panic!();
        }
    };

    let decorator = slog_term::TermDecorator::new().build();
    let my_log_drain = slog_term::FullFormat::new(decorator).build().fuse();
    let my_log_drain = slog_envlogger::new(my_log_drain);
    //let my_log_drain = slog_async::Async::new(my_log_drain).build().fuse();
    let my_log_drain = slog_async::Async::new(
        slog::Duplicate::new(
            slog::Filter::new(
                slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(log_file_handler))
                    .build(),
                |record: &slog::Record| record.level().is_at_least(slog::Level::Warning),
            ), //,slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(std::io::stdout())).build()
            slog::Duplicate::new(
                slog::Filter::new(
                    slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(
                        std::io::stderr(),
                    ))
                    .build(),
                    |record: &slog::Record| record.level().is_at_least(slog::Level::Warning),
                ), //,slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(std::io::stdout())).build()
                slog_term::FullFormat::new(slog_term::TermDecorator::new().build()).build(),
            ),
        )
        .fuse(),
    )
    .build()
    .fuse();

    slog::Logger::root(
        my_log_drain,
        slog::o!("n" => env!("CARGO_PKG_NAME"),"v" => env!("CARGO_PKG_VERSION")),
    )
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-26 14:45:59

在@ Jmb的帮助下,下面是代码的编辑版本,它解决了我提出的问题。

代码语言:javascript
复制
    pub fn configure_log(log_file_name: &str) -> slog::Logger {
        println!(
            "'{}' at configure_log(), log_file_name is:'{}'",
            chrono::prelude::Utc::now(),
            log_file_name
        );
        let log_file_path = std::path::Path::new(log_file_name);
        let dir_file_path = log_file_path.parent().unwrap();
        std::fs::create_dir_all(dir_file_path).unwrap();
    
        let log_file_handler_option = std::fs::OpenOptions::new()
                .create(true)
                .write(true)
                .truncate(true)
                .open(log_file_name)
                //.unwrap()
            ;
        let log_file_handler = match log_file_handler_option {
            Ok(f) => f,
            Err(err) => {
                println!("{:?}", err);
                panic!("Unable to open the log file '{}', '{:?}'",log_file_name,err);
            }
        };
    
        let decorator = slog_term::TermDecorator::new().build();
        let my_log_drain = slog_term::FullFormat::new(decorator).build().fuse();
        let my_log_drain = slog_envlogger::new(my_log_drain);
        //let my_log_drain = slog_async::Async::new(my_log_drain).build().fuse();
        let my_log_drain = slog_async::Async::new(
            slog::Duplicate::new(
                slog::Filter::new(
                    slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(log_file_handler))
                        .use_file_location()
                        .build(),
                    |record: &slog::Record| record.level().is_at_least(slog::Level::Warning),
                ), //,slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(std::io::stdout())).build()
                slog::Duplicate::new(
                    slog::Filter::new(
                        slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(
                            std::io::stderr(),
                        ))
                        .use_file_location()
                        .build(),
                        |record: &slog::Record| record.level().is_at_least(slog::Level::Warning),
                    ), //,slog_term::FullFormat::new(slog_term::PlainSyncDecorator::new(std::io::stdout())).build()
                    slog_term::FullFormat::new(slog_term::TermDecorator::new().build()).use_file_location().build(),
                ),
            )
            .fuse(),
        )
        .build()
        .fuse();
    
        slog::Logger::root(
            my_log_drain,
            slog::o!("n" => env!("CARGO_PKG_NAME"),"v" => env!("CARGO_PKG_VERSION")),
        )
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68812860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档