1
2pub mod syslog_trait;
4
5pub mod syslog_sync_shared;
9
10#[cfg(feature = "build_with_queue")]
14pub mod syslog_sync_queue;
15
16#[cfg(all(feature = "build_with_queue", not(feature = "async_enabled")))]
18pub(crate) mod crossbeam_queue_adapter;
19
20pub mod syslog_stream;
22
23pub mod syslog_sync_internal;
25
26pub(crate) mod socket;
32
33#[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
44pub 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 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 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}