syslog-rs 6.6.0

A native Rust implementation of the glibc/libc/windows syslog client and windows native log for logging.
Documentation
#![cfg(all(feature = "build_with_queue", feature = "async_embedded"))]
extern crate syslog_rs;

use syslog_rs::{formatters::DefaultSyslogFormatter, sync::DefaultQueueAdapter, LogFacility, LogStat, Priority, QueuedSyslog};
 
use syslog_rs::DefaultLocalSyslogDestination;


#[test]
fn test_multithreading()
{
    use std::sync::Arc;
    use std::thread;
    use std::time::{Instant, Duration};
    use syslog_rs::LOG_MASK;

    let log = 
        QueuedSyslog
            ::<DefaultQueueAdapter, DefaultSyslogFormatter, DefaultLocalSyslogDestination>
            ::openlog_with(
                Some("test5"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
                LogFacility::LOG_DAEMON, DefaultLocalSyslogDestination::new()
            );

    assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());

    let log = Arc::new(log.unwrap());
    let c1_log = log.clone();
    let c2_log = log.clone();

    thread::spawn(move|| {
        for i in 0..5
        {
            thread::sleep(Duration::from_nanos(200));
            let now = Instant::now();
            c1_log.syslog(Priority::LOG_DEBUG, 
                format!("a message from thread 1 #{}[]", i).into()).unwrap();
            let elapsed = now.elapsed();
            println!("t1: {:?}", elapsed);
        }
    });

    thread::spawn(move|| {
        for i in 0..5
        {
            thread::sleep(Duration::from_nanos(201));
            let now = Instant::now();
            c2_log.syslog(Priority::LOG_DEBUG, 
                format!("きるさお命泉ぶねりよ日子金れっ {}", i).into()).unwrap();
            let elapsed = now.elapsed();
            println!("t2: {:?}", elapsed);
        }
    });

    let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));

    assert_eq!(res.is_ok(), true, "{}", res.err().unwrap());
    assert_eq!(res.unwrap(), 0xff, "should be 0xff");

    let now = Instant::now();
    log.syslog(Priority::LOG_DEBUG, 
        format!("A message from main, сообщение от главнюка").into()).unwrap();
    let elapsed = now.elapsed();
    println!("main: {:?}", elapsed);

    thread::sleep(Duration::from_secs(2));

    let _ = log.closelog();

    thread::sleep(Duration::from_millis(500));

    let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));

    assert_eq!(res.is_ok(), true);

    return;
}

#[cfg(feature = "build_ext_file")]
#[test]
fn test_file_multithreading()
{
    use std::sync::Arc;
    use std::thread;
    use std::time::{Instant, Duration};
    use syslog_rs::formatters::DefaultSyslogFormatterFile;
    use syslog_rs::{SyslogFile, LOG_MASK};

    let log = 
        QueuedSyslog
            ::<DefaultQueueAdapter, DefaultSyslogFormatterFile, SyslogFile>
            ::openlog_with(
                Some("test2"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
                LogFacility::LOG_DAEMON, 
                SyslogFile::new("/tmp/syslog_rs_test2.log")
            );
                

    assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());

    let log = Arc::new(log.unwrap());
    let c1_log = log.clone();
    let c2_log = log.clone();

    thread::spawn(move|| {
        for i in 0..5
        {
            thread::sleep(Duration::from_nanos(200));
            let now = Instant::now();
            c1_log.syslog(Priority::LOG_ALERT, 
                format!("a message from thread 1 #{}[]", i).into()).unwrap();
            let elapsed = now.elapsed();
            println!("t1: {:?}", elapsed);
        }
    });

    thread::spawn(move|| {
        for i in 0..5
        {
            thread::sleep(Duration::from_nanos(201));
            let now = Instant::now();
            c2_log.syslog(Priority::LOG_DEBUG, 
                format!("きるさお命泉ぶねりよ日子金れっ {}", i).into()).unwrap();
            let elapsed = now.elapsed();
            println!("t2: {:?}", elapsed);
        }
    });

    let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));

    assert_eq!(res.is_ok(), true, "{}", res.err().unwrap());
    assert_eq!(res.unwrap(), 0xff, "should be 0xff");

    let now = Instant::now();
    log.syslog(Priority::LOG_DEBUG, 
        format!("A message from main, きるさお命泉ぶねりよ日子金れっ").into()).unwrap();
    let elapsed = now.elapsed();
    println!("main: {:?}", elapsed);

    thread::sleep(Duration::from_secs(2));

    let _ = log.closelog();

    thread::sleep(Duration::from_millis(500));

    let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));

    assert_eq!(res.is_ok(), true);

    return;
}