Drakulix / simplelog.rs

Simple Logging Facility for Rust
https://docs.rs/simplelog/
Apache License 2.0
414 stars 71 forks source link

crash on openbsd with set_time_offset_to_local() #138

Open labannah9125 opened 10 months ago

labannah9125 commented 10 months ago

not sure why it crash but works on other platforms. removing unwrap() seems to work BUT isnt localtime. maybe another patch from @botovq interfering to rust on the os?

% cat Cargo.toml
[package]
name = "simplelog-demo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
log = "0.4.20"
simplelog = "0.12.1"

% cat src/main.rs
use log::*;
use simplelog::{CombinedLogger, ConfigBuilder, LevelFilter, SimpleLogger, WriteLogger};
use std::fs;

fn main() {
    let _ = setup_logger("debug");
    info!("Hello world!");
}

fn setup_logger(log_level: &str) -> Result<(), Box<dyn std::error::Error>> {
    let log_file_path = format!("./{}.log", env!("CARGO_PKG_NAME"));
    let log_file = fs::OpenOptions::new()
        .append(true)
        .create(true)
        .write(true)
        .open(log_file_path)?;

    // Split the confguration between stdout and file logging for less noisy output in the stdout
    // keeping full details in log lived log files.
    let mut log_stdout_config_builder = ConfigBuilder::new();
    log_stdout_config_builder
        .set_time_offset_to_local()
        .unwrap();
    let mut log_file_config_builder = ConfigBuilder::new();
    log_file_config_builder
        .set_time_format_rfc3339()
        .set_time_offset_to_local()
        .unwrap();

    // Any invalid log level will simply use the default of "info".
    let log_level = match log_level {
        "debug" => LevelFilter::Debug,
        "info" => LevelFilter::Info,
        "error" => LevelFilter::Error,
        "warn" => LevelFilter::Warn,
        _ => LevelFilter::Info,
    };

    // If unable to write to the log file, only output to the terminal.
    if CombinedLogger::init(vec![
        SimpleLogger::new(log_level, log_stdout_config_builder.build()),
        WriteLogger::new(log_level, log_file_config_builder.build(), log_file),
    ])
    .is_err()
    {
        SimpleLogger::new(log_level, log_stdout_config_builder.build());
    }

    Ok(())
}

% RUST_BACKTRACE=1 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/simplelog-demo`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ConfigBuilder(Config { time: Error, level: Error, level_padding: Off, thread: Debug, thread_log_mode: IDs, thread_padding: Off, target: Debug, target_padding: Off, location: Trace, time_format: Custom([Hour(Hour { padding: Zero, is_12_hour_clock: false }), :, Minute(Minute { padding: Zero }), :, Second(Second { padding: Zero })]), time_offset: +00:00:00, filter_allow: [], filter_ignore: [], level_color: [None, Some(Red), Some(Yellow), Some(Blue), Some(Cyan), Some(White)], write_log_enable_colors: false })', src/main.rs:23:10
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::result::unwrap_failed
   3: core::result::Result<T,E>::unwrap
             at /usr/obj/ports/rust-1.72.1/rustc-1.72.1-src/library/core/src/result.rs:1076:23
   4: simplelog_demo::setup_logger
             at ./src/main.rs:21:5
   5: simplelog_demo::main
             at ./src/main.rs:6:13
   6: core::ops::function::FnOnce::call_once
             at /usr/obj/ports/rust-1.72.1/rustc-1.72.1-src/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
qarmin commented 9 months ago

I had similar problem on single board, custom linux device and I found solution(but not sure if this will work on openbsd) 3 possible solutions with different crates to use local time instead utc: