syslog-rs 6.6.1

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

use syslog_rs::{
    LogFacility, LogStat, Priority, SyStreamPriDebug, SyncSyslog, SyslogLocal 
};

#[test]
fn test_single_message()
{

    let log = 
        SyncSyslog::openlog(
            Some("test1"), 
            LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
            LogFacility::LOG_DAEMON,
        SyslogLocal::new()
    );

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

    let log = log.unwrap();

    let msg1 = format!("test UTF-8 проверка BOM UTF-8");
    let now = std::time::Instant::now();

    log.syslog(Priority::LOG_DEBUG, msg1.into()).unwrap();

    let dur = now.elapsed();
    println!("{:?}", dur);

    let msg2 = format!("test UTF-8  きるさお命泉ぶねりよ日子金れっ");

    let now = std::time::Instant::now();

    log.syslog(Priority::LOG_DEBUG, msg2.into()).unwrap();

    let dur = now.elapsed();
    println!("{:?}", dur);

    let _ = log.closelog();

    return;
}

#[test]
fn test_single_stream_test()
{
    use std::fmt::Write;

    let log = 
        SyncSyslog::openlog(
            Some("test1"), 
            LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
            LogFacility::LOG_DAEMON,
        SyslogLocal::new());

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

    let log = log.unwrap();
    
    write!(log.get_stream::<SyStreamPriDebug>(), "test123").unwrap();

}

#[test]
fn test_single_message_withound_nd()
{

    let log = 
        SyncSyslog::openlog(
            Some("test1_nond"), 
            LogStat::LOG_CONS | LogStat::LOG_PID, 
            LogFacility::LOG_DAEMON,
        SyslogLocal::new());

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

    let log = log.unwrap();

    let msg1 = format!("test UTF-8 проверка BOM UTF-8");
    let now = std::time::Instant::now();

    log.syslog(Priority::LOG_DEBUG, msg1.into()).unwrap();

    let dur = now.elapsed();
    println!("{:?}", dur);

    let msg2 = format!("test UTF-8  きるさお命泉ぶねりよ日子金れっ");

    let now = std::time::Instant::now();

    log.syslog(Priority::LOG_DEBUG, msg2.into()).unwrap();

    let dur = now.elapsed();
    println!("{:?}", dur);

    let _ = log.closelog();

    return;
}

#[test]
fn test_single_message_perror()
{
    /*use std::sync::Arc;
    use std::thread;
    use std::time::Duration;
    use super::{LOG_MASK};*/

    let log = 
        SyncSyslog::openlog(
                Some("test2"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID | LogStat::LOG_PERROR, 
                LogFacility::LOG_DAEMON,
                SyslogLocal::new()
            );

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

    let log = log.unwrap();

    log.syslog(Priority::LOG_DEBUG, 
        format!("perror test UTF-8 きるさお命泉ぶねりよ日子金れっ проверка BOM").into()).unwrap();

    let _ = log.closelog();

    return;
}

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

    let log = 
            SyncSyslog::openlog(
                Some("test_multithreading"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
                LogFacility::LOG_DAEMON,
            SyslogLocal::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 fmmt = format!("a message from thread 1 #{}[]", i);
            let now = Instant::now();
            c1_log.syslog(Priority::LOG_DEBUG, fmmt.into()).unwrap();
            let elapsed = now.elapsed();
            println!("t1: {:?}", elapsed);
        }
    });

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

    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();

    return;
}

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

    let log = 
            SyncSyslog::openlog(
                Some("test_multithreading_rw"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
                LogFacility::LOG_DAEMON,
            SyslogLocal::new()
        );

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

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

    let thread_handler = 
        thread::spawn(move|| 
            {
                std::thread::park();
                for i in 0..30
                {
                    

                    let fmmt = format!("a message from thread 1 #{}[]", i);
                    let now = Instant::now();
                    c1_log.syslog(Priority::LOG_DEBUG, fmmt.into()).unwrap();
                    let elapsed = now.elapsed();
                    println!("t1: {:?}", elapsed);
                }
            }
        );

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

    thread_handler.thread().unpark();

    for i in 0..3
    {
        std::thread::sleep(Duration::from_nanos(999));
        let identity = format!("multithreading_rw{}", i);
        let now = Instant::now();
        log.change_identity(Some(&identity)).unwrap();
        let elapsed = now.elapsed();
        println!("idc: {:?}", elapsed);
    }

    thread_handler.join().unwrap();

    let _ = log.closelog();

    return;
}

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

    let log = 
            SyncSyslog::openlog(
                Some("multithreading_rw_sock"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
                LogFacility::LOG_DAEMON,
            SyslogLocal::new()
        );

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

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

    let thread_handler = 
        thread::spawn(move|| 
            {
                std::thread::park();
                for i in 0..30
                {
                    

                    let fmmt = format!("a message from thread 1 #{}[]", i);
                    let now = Instant::now();
                    c1_log.syslog(Priority::LOG_DEBUG, fmmt.into()).unwrap();
                    let elapsed = now.elapsed();
                    println!("t1: {:?}", elapsed);
                }
            }
        );

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

    thread_handler.thread().unpark();

    for _ in 0..3
    {
        std::thread::sleep(Duration::from_nanos(999));
        let now = Instant::now();
        log.update_tap_data(SyslogLocal::new()).unwrap();
        let elapsed = now.elapsed();
        println!("idc: {:?}", elapsed);
    }

    thread_handler.join().unwrap();

    let _ = log.closelog();

    return;
}

#[test]
fn long_msg_test()
{
    // 40 EMSGSIZE
    let msg = 
"7赤ざクぽな載覧な改申ほふ取容う主坊酸ヱ司戦ヒソオ力端めゃ間真ル実記キ団需くスルて学回県仁京ぴ熱完かあもく。上ょぜ催5強変却ソヲキ転入ク記事購シリ断衝ぽ玲面たぽつへ様態の善無かー勢加ヨマナキ趣会撮さはこ違42器のレうゆ。稿エスタ己報照アイネル岩撲ムニ半者サアキツ画47込死請誌8策ノ再然ださそ禁断しにた高否リ続最ユケ山芸ロ去群づへ索芭あン掲佳怖斎澤クね。
書キマコヒ上広ざばてわ会佐のにりリ学総点フわすか頼野ぜイよば株約ネキヱメ必軽チヲ録使ラ下能ナウコ紀捜れ霊別イ摯療じらどト相3聞めびら情拳ユフエ確経板植えーぜあ。無ど曲注程クタル系新どばくい都面村リと計安ワヱ月見モヌエノ完臨健85定テサコミ貸容ミテタカ写載とかえげ詐訃だみそな。代け設養テヨナ乱54服料ニ止画ら不暮ッ強治ぱンやし供方広づじもあ般判ごくドラ示刊ヱサトキ速事取さふぞ授共西れッ。
陸オク康59面くこ惑7伊エノモ候余ロソウ政投ナク転文だけス香両4誕よ数真ひぞぴざ空加ユラ勢隣ゃびよ移72士シヌ図際想カマテ覧費活輸権因ん。東がイ価変や濃恒ヒメネエ学見ょ理供カオムヱ針中わば文63転ヨリホミ礼民ネトマツ速果還ばが転世晴げでんが。犯レト同岸サケ写新ゆぐぱひ人捕けほゅえ的人第いぜ転連ぎど京分株ニムトヒ家及ユフケヌ記定み歩死質をゃいイ都末ワ革量んつ覧打百レいん。
下ゃとぞら川株以東ぴそぱ費更ウマヨメ覧論ウスレモ八度ずんとイ発平う果構つ小各ぼス夢国フラ連石はちい雪飲聴ゅいと。門ぱし続消上ト文影投設テユチ設川ルラシケ引押ヤマセメ権書ハテ例発リロソイ環載ぴ企実カマリト店鉄ワソロフ逆子先チルマ楽法どゆね声東女携抜爆んけみ。14報ふラめて怒止に開謙こさ促大ヘチツ遺飯ケ営長コキ価空少ろッひぱ読信ケテウ者育ヒミク代57柱浪フ。
";

println!("{}", msg.len());

    let log = 
            SyncSyslog::openlog(
                Some("test4"), 
                LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
                LogFacility::LOG_DAEMON,
                SyslogLocal::new()
            );

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

    let log = log.unwrap();

    log.syslog(Priority::LOG_DEBUG, format!("{}", msg).into()).unwrap();
                
    let _ = log.closelog();

    return;
}