syslog_rs/sync/
mod.rs

1
2/// An APIs and common interfaces.
3pub mod syslog_trait;
4
5//-- SYNC --
6
7/// A syslog instance which is shared between threads.
8pub mod syslog_sync_shared;
9
10//-- SYNC QUEUE --
11
12/// A syslog intance which uses an MPSC channels.
13#[cfg(feature = "build_with_queue")]
14pub mod syslog_sync_queue;
15
16/// A queue adapter based on the `crossbeam` MPSC.
17#[cfg(all(feature = "build_with_queue", not(feature = "async_enabled")))]
18pub(crate) mod crossbeam_queue_adapter;
19
20/// A streamer for the syslog.
21pub mod syslog_stream;
22
23/// Internal logic of the syslog client.
24pub mod syslog_sync_internal;
25
26//pub mod syslog;
27
28//-- SYNC SOCKET --
29
30/// A sockets (communication).
31pub(crate) mod socket;
32
33//pub use syslog_trait::SyslogApi;
34
35#[cfg(all(feature = "build_with_queue", not(feature = "async_enabled")))]
36pub(crate) use crossbeam_queue_adapter as q_adapter;
37
38#[cfg(all(feature = "async_embedded", feature = "build_with_queue"))]
39pub(crate) use crate::a_sync::async_queue_adapter::q_adapter as q_adapter;
40
41#[cfg(all(feature = "async_embedded", feature = "build_with_queue"))]
42pub use q_adapter::DefaultQueueAdapter;
43
44/// Exposing API for streaming to syslog.
45pub use syslog_stream::{SyslogStream, StreamableSyslogApi};
46
47use syslog_stream::StreamableSyslog;
48
49
50#[cfg(feature = "build_sync")]
51#[cfg(test)]
52mod tests_shared
53{
54    use crate::{LogFacility, LogStat, Priority, SyslogApi, SyslogLocal, SyslogShared};
55
56    #[test]
57    fn test_single_message()
58    {
59
60
61        let log = 
62                SyslogShared::openlog(
63                    Some("test1"), 
64                    LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
65                    LogFacility::LOG_DAEMON,
66                SyslogLocal::new());
67
68        assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
69
70        let log = log.unwrap();
71
72        let msg1 = format!("test UTF-8 проверка BOM UTF-8");
73        let now = std::time::Instant::now();
74
75        log.syslog(Priority::LOG_DEBUG, msg1.into());
76
77        let dur = now.elapsed();
78        println!("{:?}", dur);
79
80        let msg2 = format!("test UTF-8  きるさお命泉ぶねりよ日子金れっ");
81
82        let now = std::time::Instant::now();
83
84        log.syslog(Priority::LOG_DEBUG, msg2.into());
85
86        let dur = now.elapsed();
87        println!("{:?}", dur);
88
89        let _ = log.closelog();
90
91        return;
92    }
93
94    #[test]
95    fn test_single_message_perror()
96    {
97        /*use std::sync::Arc;
98        use std::thread;
99        use std::time::Duration;
100        use super::{LOG_MASK};*/
101
102        let log = 
103            SyslogShared::openlog(
104                    Some("test2"), 
105                    LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID | LogStat::LOG_PERROR, 
106                    LogFacility::LOG_DAEMON,
107                    SyslogLocal::new()
108                );
109
110        assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
111
112        let log = log.unwrap();
113
114        log.syslog(Priority::LOG_DEBUG, format!("perror test UTF-8 きるさお命泉ぶねりよ日子金れっ проверка BOM").into());
115
116        let _ = log.closelog();
117
118        return;
119    }
120
121    #[test]
122    fn test_multithreading()
123    {
124        use std::sync::Arc;
125        use std::thread;
126        use std::time::{Instant, Duration};
127
128        let log = 
129                SyslogShared::openlog(
130                    Some("test3"), 
131                    LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
132                    LogFacility::LOG_DAEMON,
133                SyslogLocal::new()
134            );
135
136        assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
137
138        let log = Arc::new(log.unwrap());
139        let c1_log = log.clone();
140        let c2_log = log.clone();
141
142        thread::spawn(move|| {
143            for i in 0..5
144            {
145                thread::sleep(Duration::from_nanos(200));
146                let now = Instant::now();
147                c1_log.syslog(Priority::LOG_DEBUG, format!("a message from thread 1 #{}[]", i).into());
148                let elapsed = now.elapsed();
149                println!("t1: {:?}", elapsed);
150            }
151        });
152
153        thread::spawn(move|| {
154            for i in 0..5
155            {
156                thread::sleep(Duration::from_nanos(201));
157                let now = Instant::now();
158                c2_log.syslog(Priority::LOG_DEBUG, format!("きるさお命泉ぶねりよ日子金れっ {}", i).into());
159                let elapsed = now.elapsed();
160                println!("t2: {:?}", elapsed);
161            }
162        });
163
164        let now = Instant::now();
165        log.syslog(Priority::LOG_DEBUG, format!("A message from main, きるさお命泉ぶねりよ日子金れっ").into());
166        let elapsed = now.elapsed();
167        println!("main: {:?}", elapsed);
168
169        thread::sleep(Duration::from_secs(2));
170
171        let _ = log.closelog();
172
173        return;
174    }
175
176    #[test]
177    fn long_msg_test()
178    {
179        // 40 EMSGSIZE
180        let msg = 
181    "7赤ざクぽな載覧な改申ほふ取容う主坊酸ヱ司戦ヒソオ力端めゃ間真ル実記キ団需くスルて学回県仁京ぴ熱完かあもく。上ょぜ催5強変却ソヲキ転入ク記事購シリ断衝ぽ玲面たぽつへ様態の善無かー勢加ヨマナキ趣会撮さはこ違42器のレうゆ。稿エスタ己報照アイネル岩撲ムニ半者サアキツ画47込死請誌8策ノ再然ださそ禁断しにた高否リ続最ユケ山芸ロ去群づへ索芭あン掲佳怖斎澤クね。
182    書キマコヒ上広ざばてわ会佐のにりリ学総点フわすか頼野ぜイよば株約ネキヱメ必軽チヲ録使ラ下能ナウコ紀捜れ霊別イ摯療じらどト相3聞めびら情拳ユフエ確経板植えーぜあ。無ど曲注程クタル系新どばくい都面村リと計安ワヱ月見モヌエノ完臨健85定テサコミ貸容ミテタカ写載とかえげ詐訃だみそな。代け設養テヨナ乱54服料ニ止画ら不暮ッ強治ぱンやし供方広づじもあ般判ごくドラ示刊ヱサトキ速事取さふぞ授共西れッ。
183    陸オク康59面くこ惑7伊エノモ候余ロソウ政投ナク転文だけス香両4誕よ数真ひぞぴざ空加ユラ勢隣ゃびよ移72士シヌ図際想カマテ覧費活輸権因ん。東がイ価変や濃恒ヒメネエ学見ょ理供カオムヱ針中わば文63転ヨリホミ礼民ネトマツ速果還ばが転世晴げでんが。犯レト同岸サケ写新ゆぐぱひ人捕けほゅえ的人第いぜ転連ぎど京分株ニムトヒ家及ユフケヌ記定み歩死質をゃいイ都末ワ革量んつ覧打百レいん。
184    下ゃとぞら川株以東ぴそぱ費更ウマヨメ覧論ウスレモ八度ずんとイ発平う果構つ小各ぼス夢国フラ連石はちい雪飲聴ゅいと。門ぱし続消上ト文影投設テユチ設川ルラシケ引押ヤマセメ権書ハテ例発リロソイ環載ぴ企実カマリト店鉄ワソロフ逆子先チルマ楽法どゆね声東女携抜爆んけみ。14報ふラめて怒止に開謙こさ促大ヘチツ遺飯ケ営長コキ価空少ろッひぱ読信ケテウ者育ヒミク代57柱浪フ。
185    ";
186
187    println!("{}", msg.len());
188
189        let log = 
190                SyslogShared::openlog(
191                    Some("test4"), 
192                    LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
193                    LogFacility::LOG_DAEMON,
194                    SyslogLocal::new()
195                );
196
197        assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
198
199        let log = log.unwrap();
200
201        log.syslog(Priority::LOG_DEBUG, format!("{}", msg).into());
202                    
203        let _ = log.closelog();
204
205        return;
206    }
207}
208    
209#[cfg(all(feature = "build_with_queue", feature = "async_embedded"))]
210#[cfg(test)]
211mod tests_queue
212{
213    use crate::{formatters::DefaultSyslogFormatter, sync::DefaultQueueAdapter, LogFacility, LogStat, Priority, SyslogApi, SyslogLocal, SyslogQueue};
214
215
216    #[test]
217    fn test_multithreading()
218    {
219        use std::sync::Arc;
220        use std::thread;
221        use std::time::{Instant, Duration};
222        use crate::LOG_MASK;
223
224        let log = 
225            SyslogQueue
226                ::<DefaultQueueAdapter, DefaultSyslogFormatter, SyslogLocal>
227                ::openlog_with(
228                    Some("test5"), 
229                    LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
230                    LogFacility::LOG_DAEMON, SyslogLocal::new()
231                );
232
233        assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
234
235        let log = Arc::new(log.unwrap());
236        let c1_log = log.clone();
237        let c2_log = log.clone();
238
239        thread::spawn(move|| {
240            for i in 0..5
241            {
242                thread::sleep(Duration::from_nanos(200));
243                let now = Instant::now();
244                c1_log.syslog(Priority::LOG_DEBUG, format!("a message from thread 1 #{}[]", i).into());
245                let elapsed = now.elapsed();
246                println!("t1: {:?}", elapsed);
247            }
248        });
249
250        thread::spawn(move|| {
251            for i in 0..5
252            {
253                thread::sleep(Duration::from_nanos(201));
254                let now = Instant::now();
255                c2_log.syslog(Priority::LOG_DEBUG, format!("きるさお命泉ぶねりよ日子金れっ {}", i).into());
256                let elapsed = now.elapsed();
257                println!("t2: {:?}", elapsed);
258            }
259        });
260
261        let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
262
263        assert_eq!(res.is_ok(), true, "{}", res.err().unwrap());
264        assert_eq!(res.unwrap(), 0xff, "should be 0xff");
265
266        let now = Instant::now();
267        log.syslog(Priority::LOG_DEBUG, format!("A message from main, сообщение от главнюка").into());
268        let elapsed = now.elapsed();
269        println!("main: {:?}", elapsed);
270
271        thread::sleep(Duration::from_secs(2));
272
273        let _ = log.closelog();
274
275        thread::sleep(Duration::from_millis(500));
276
277        let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
278
279        assert_eq!(res.is_ok(), true);
280
281        return;
282    }
283
284    #[cfg(feature = "build_ext_file")]
285    #[test]
286    fn test_file_multithreading()
287    {
288        use std::sync::Arc;
289        use std::thread;
290        use std::time::{Instant, Duration};
291        use crate::formatters::DefaultSyslogFormatterFile;
292        use crate::{SyslogFile, SyslogQueue, LOG_MASK};
293
294        let log = 
295            SyslogQueue
296                ::<DefaultQueueAdapter, DefaultSyslogFormatterFile, SyslogFile>
297                ::openlog_with(
298                    Some("test2"), 
299                    LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID, 
300                    LogFacility::LOG_DAEMON, 
301                    SyslogFile::new("/tmp/syslog_rs_test2.log")
302                );
303                    
304
305        assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
306
307        let log = Arc::new(log.unwrap());
308        let c1_log = log.clone();
309        let c2_log = log.clone();
310
311        thread::spawn(move|| {
312            for i in 0..5
313            {
314                thread::sleep(Duration::from_nanos(200));
315                let now = Instant::now();
316                c1_log.syslog(Priority::LOG_ALERT, format!("a message from thread 1 #{}[]", i).into());
317                let elapsed = now.elapsed();
318                println!("t1: {:?}", elapsed);
319            }
320        });
321
322        thread::spawn(move|| {
323            for i in 0..5
324            {
325                thread::sleep(Duration::from_nanos(201));
326                let now = Instant::now();
327                c2_log.syslog(Priority::LOG_DEBUG, format!("きるさお命泉ぶねりよ日子金れっ {}", i).into());
328                let elapsed = now.elapsed();
329                println!("t2: {:?}", elapsed);
330            }
331        });
332
333        let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
334
335        assert_eq!(res.is_ok(), true, "{}", res.err().unwrap());
336        assert_eq!(res.unwrap(), 0xff, "should be 0xff");
337
338        let now = Instant::now();
339        log.syslog(Priority::LOG_DEBUG, format!("A message from main, きるさお命泉ぶねりよ日子金れっ").into());
340        let elapsed = now.elapsed();
341        println!("main: {:?}", elapsed);
342
343        thread::sleep(Duration::from_secs(2));
344
345        let _ = log.closelog();
346
347        thread::sleep(Duration::from_millis(500));
348
349        let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
350
351        assert_eq!(res.is_ok(), true);
352
353        return;
354    }
355
356}