.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "POSTFIX2DLF.IN 1" .TH POSTFIX2DLF.IN 1 2025-09-28 "Lire 2.1.1" "LogReport's Lire Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" postfix2dlf \- تبدیل فایل‌های لاگ postfix به قالب dlf .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" \&\fBpostfix2dlf\fR .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" دستور postfix2dlf یک فایل لاگ postfix را به یک فایل قالب لاگ چکیده (Distilled Log Format - DLF) ایمیل در Lire تبدیل می‌کند. این ابزار برای انجام کار اصلی، \fBpostfix2dlf_pre\fR\|(1) و \fBpostfix2dlf_main\fR\|(1) را فراخوانی می‌کند. این دستور فایل لاگ را از ورودی stdin دریافت می‌کند و خروجی DLF را در stdout می‌نویسد. پیام‌های عیب‌یابی در stderr چاپ می‌شوند. این اسکریپت توسط \fBlr_log2xml\fR\|(1) فراخوانی می‌شود. .SH "منطق طراحی (RATIONALE)" .IX Header "RATIONALE" معماری postfix2dlf با سایر مبدل‌های dlf ایمیل کاملاً متفاوت است. دلیل این امر این است که هنگام تجزیهٔ یک فایل لاگ postfix، \fIهیچ\fR نشانه‌ای مبنی بر اینکه آیا یک پیام به تمام گیرندگان تحویل داده شده است یا خیر وجود ندارد. (در لاگ sendmail فیلدی به نام rcpts= وجود دارد که می‌توان برای این منظور استفاده کرد.) .PP برای برخورد با چنین لاگی چندین راهکار وجود دارد: ۱: ردگیری تمام queueidها به همراه اطلاعات from\- مربوط به آن‌ها در تمام مدت پردازش فایل لاگ، که این روش بیش از حد حافظه مصرف می‌کند. ۲: استفاده از یک روش حدسی ۱۰ ثانیه‌ای: فرض شود پیام هیچ‌گاه بیشتر از مثلاً ۱۰ ثانیه در صف باقی نمی‌ماند؛ یا به‌صورت جایگزین، فرض شود هم‌زمان بیش از \f(CW$LR_POSTFIX_MAX_QUEUE_SIZE\fR پیام در صف نخواهد بود، که این روش بیش از حد مستعد خطاست. ۳: استفاده از \fBsort\fR\|(1) برای مرتب‌سازی خطوط لاگ بر اساس queueid؛ این همان روشی است که ما قبلاً استفاده می‌کردیم. با این حال، ما از پیش نمی‌دانیم کدام فیلد queueid را ذخیره خواهد کرد (برای نمونه، فایل‌های لاگ پردازش‌شده توسط syslog در Sun Solaris مقدار queueid را در موقعیت دیگری دارند). محاسبهٔ این موقعیت به معنی دوبار تجزیه کردن لاگ خواهد بود. .PP ما گونه‌ای تغییریافته از راهکار سوم را انتخاب کرده‌ایم: اطلاعاتی را که می‌توانستیم با \fBsort\fR\|(1) به دست آوریم، در یک فایل db ذخیره می‌کنیم. هنگام ساخت این فایل db، که نگاشتی از queueidها به nof\-lines\-with\-this\-id نگه‌می‌دارد، تا جای ممکن پیش‌پردازش انجام می‌دهیم. لاگ پیش‌پردازش‌شده در یک tmpfile چاپ می‌شود. ساختار لاگ پیش‌پردازش‌شده مشابه لاگ خام است: هر خط لاگ خام، یک خط پیش‌پردازش‌شده تولید می‌کند. لاگ پیش‌پردازش‌شده با استفاده از اطلاعات موجود در فایل db، توسط \&\fBlr_postfix2dlf_main\fR\|(1) به dlf تبدیل می‌شود. .PP یک اثر جانبی مطلوب این شیوهٔ پردازش این است که لاگ بر اساس ترتیب زمانی اولیه پردازش می‌شود..SH "مثال‌ها (EXAMPLES)" .IX Header "EXAMPLE" یک فایل لاگ: .PP .Vb 10 \& Dec 1 04:02:56 internetsrv postfix/pickup[20919]: \& 693A3578E: uid=0 from= \& Dec 1 04:02:56 internetsrv postfix/cleanup[20921]: \& 693A3578E: message\-id= \& Dec 1 04:02:57 internetsrv postfix/qmgr[20164]: 693A3578E: \& from=, size=617 (queue active) \& Dec 1 04:02:57 internetsrv postfix/cleanup[20921]: \& E325C578D: message\-id= \& Dec 1 04:02:58 internetsrv postfix/local[20924]: \& 693A3578E: to=, relay=local, \& delay=3, status=sent (forwarded as E325C578D) \& Dec 1 04:02:58 internetsrv postfix/qmgr[20164]: E325C578D: \& from=, size=769 (queue active) \& Dec 1 04:02:59 internetsrv postfix/smtp[20925]: E325C578D: \& to=, \& relay=1.example.com.vp.pt[10.0.0.1], delay=2, status=sent \& (250 Requested mail action Ok.) \& Dec 1 06:58:22 internetsrv postfix/smtpd[21142]: connect \& from 2.example.com.fi[10.0.0.2] \& Dec 1 06:58:23 internetsrv postfix/smtpd[21142]: \& 42BFE578D: client=2.example.com.fi[10.0.0.2] \& Dec 1 06:58:24 internetsrv postfix/cleanup[21143]: \& 42BFE578D: message\-id= \& Dec 1 06:58:24 internetsrv postfix/qmgr[20164]: 42BFE578D: \& from=, size=2473 (queue active) \& Dec 1 06:58:26 internetsrv postfix/smtp[21145]: 42BFE578D: \& to=, \& relay=1.example.com.vp.pt[10.0.0.1], delay=3, status=sent \& (250 Requested mail action Ok.) \& Dec 1 06:59:22 internetsrv postfix/smtpd[21142]: \& disconnect from 2.example.com.fi[10.0.0.2] \& Dec 1 07:08:28 internetsrv postfix/smtpd[21160]: connect \& from 2.example.com.fi[10.0.0.2] \& Dec 1 07:08:28 internetsrv postfix/smtpd[21160]: \& C7B39578D: client=2.example.com.fi[10.0.0.2] \& Dec 1 07:08:29 internetsrv postfix/cleanup[21161]: \& C7B39578D: message\-id= \& Dec 1 07:08:29 internetsrv postfix/qmgr[20164]: C7B39578D: \& from=, size=2173 (queue active) \& Dec 1 07:08:32 internetsrv postfix/smtp[21163]: C7B39578D: \& to=, \& relay=3.example.com.vp.pt[10.0.0.3], delay=4, status=sent \& (250 Requested mail action Ok.) \& Dec 1 07:08:33 internetsrv postfix/smtpd[21160]: \& disconnect from 2.example.com.fi[10.0.0.2] \& Dec 1 07:18:42 internetsrv postfix/smtpd[21166]: connect \& from 2.example.com.fi[10.0.0.2] .Ve .PP به این صورت تبدیل خواهد شد: .PP .Vb 10 \& 1007175776 internetsrv 693A3578E \& john.doe.2 example.com localhost 127.0.0.1 617 3 0 \& john.doe.2 example.com localhost 127.0.0.1 sent \& (forwarded_as_e325c578d) \& 1007175779 internetsrv E325C578D \& john.doe.2 example.com localhost 127.0.0.1 769 2 0 \& john.doe.3 example.com 1.example.com.vp.pt 10.0.0.1 sent \& (250_requested_mail_action_ok.) \& 1007186303 internetsrv 42BFE578D \& john.doe.5 example.com 2.example.com.fi 10.0.0.2 2473 3 0 \& john.doe.6 example.com 1.example.com.vp.pt 10.0.0.1 sent \& (250_requested_mail_action_ok.) \& 1007186908 internetsrv C7B39578D \& john.doe.8 example.com 2.example.com.fi 10.0.0.2 2173 4 0 \& john.doe.9 example.com 3.example.com.vp.pt 10.0.0.3 sent \& (250_requested_mail_action_ok.) .Ve .PP دستور postfix2dlf به‌ندرت به‌تنهایی استفاده می‌شود، بلکه به احتمال زیاد توسط lr_log2report فراخوانی می‌گردد: .PP .Vb 1 \& $ lr_log2report postfix < /var/log/mail.log > report .Ve .PP \&. اگر واقعاً تمایل دارید این اسکریپت را به‌صورت مستقل اجرا کنید (مثلاً برای اشکال‌زدایی)، آن را بدین صورت اجرا کنید: .PP .Vb 1 \& $ LR_SERVICE=email LR_ID=\`date +%s\` /path/to/lire/convertors/postfix2dlf < /var/log/mail.log > mail.dlf .Ve .PP \&. اطمینان حاصل کنید که /path/to/libexec/lire و /path/to/lire/convertors در PATH شما قرار دارند، و متغیرهای TMPDIR، LR_DBFILE و LR_DBDIR تنظیم شده‌اند. برای دستیابی به این موضوع، می‌توانید به‌صورت دستی /path/to/etc/lire/profile_lean و /path/to/etc/lire/defaults را با دستور source اجرا کنید..SH "قالب لاگ (LOGFORMAT)" .IX Header "LOGFORMAT" لاگ‌های Postfix به این صورت هستند: .SS "از محلی به دوردست (from local to remote)" .IX Subsection "from local to remote" .Vb 9 \& postfix/pickup[81586]: 094BE204: uid=1001 from= \& postfix/cleanup[81683]: 094BE204: \& message\-id=<20000531080729.L39824@cgmd76206.c.nl> \& postfix/qmgr[13460]: 094BE204: \& from=, size=1717 (queue active) \& postfix/smtp[81685]: 094BE204: to=, \& relay=smtp.c.nl[212.83.68.146], delay=4, status=sent (250 \& Message received: \& 20000531060722.ZCOV13476.relay02@cgmd76206.c.nl) .Ve .SS "از محلی به محلی (from local to local)" .IX Subsection "from local to local" .Vb 8 \& postfix/pickup[81849]: 473B9204: uid=1001 from= \& postfix/cleanup[81916]: 473B9204: \& message\-id=<200005310901.LAA56567@kludge.mpn.cp.p.com> \& postfix/qmgr[13460]: 473B9204: \& from=, size=1997 (queue active) \& postfix/local[81918]: 473B9204: to=, \& relay=local, delay=0, status=sent \& ("|exec /usr/local/bin/procmail \-t") .Ve .SS "از دوردست به محلی (from remote to local)" .IX Subsection "from remote to local" .Vb 9 \& postfix/smtpd[82056]: A17131C5: \& client=gw\-nl1.o\-it.com[193.79.128.34] \& postfix/cleanup[82057]: A17131C5: \& message\-id=<023201bfcad1$16365ba0$775910ac@ehvbos.nl.oit.com> \& postfix/qmgr[13460]: A17131C5: \& from=, size=1692 (queue active) \& postfix/local[82059]: A17131C5: \& to=, relay=local, delay=1, \& status=sent ("|/usr/local/majordomo/wrapper majordomo") .Ve .SS "از دوردست به دوردست (from remote to remote)" .IX Subsection "from remote to remote" .Vb 10 \& postfix/smtpd[58567]: connect from \& kweetal.t.nl[131.155.2.7] \& postfix/smtpd[58567]: 9A16E229: \& client=kweetal.t.nl[131.155.2.7] \& postfix/cleanup[58570]: 9A16E229: \& message\-id=<200006041246.OAA23888@bw2.baub.bwk.t.nl> \& postfix/qmgr[236]: 9A16E229: \& from=, size=774 (queue active) \& postfix/smtpd[58567]: disconnect from \& kweetal.t.nl[131.155.2.7] \& postfix/smtp[58574]: 9A16E229: to=, \& relay=mx3.x.nl[194.109.6.48], delay=15, status=sent (250 \& OAA23290 Message accepted for delivery) .Ve .SH "کارایی (PERFORMANCE)" .IX Header "PERFORMANCE" ما مجموعه postfix2dlf را روی یک فایل لاگ ۲۴ مگابایتی postfix اجرا کردیم. نتایج بدین شرح بودند: .PP .Vb 3 \& postfix2dlf_pre info read 195257 lines; output 177027 DLF lines; 3 errors \& postfix2dlf_pre info memory stats: vsize=5900K rss=4508K majflt=430 \& postfix2dlf_pre info elapsed time in seconds real=626 user=449.16 system=8.7 \& \& postfix2dlf_main info read 177027 lines; output 61671 DLF lines; 0 errors \& postfix2dlf_main info memory stats: vsize=5976K rss=4656K majflt=427 \& postfix2dlf_main info elapsed time in seconds real=245 user=152.05 system=4.15 .Ve .PP \&. .SH "مثال‌ها (EXAMPLES)" .IX Header "EXAMPLES" دستور postfix2dlf به‌ندرت به‌تنهایی استفاده می‌شود، اما به احتمال زیاد توسط lr_log2report فراخوانی خواهد شد: .PP .Vb 1 \& $ lr_run lr_log2report postfix < /var/log/maillog .Ve.SH "گزارش باگ‌ها (BUGS)" .IX Header "BUGS" این اسکریپت به فضای زیادی در TMPDIR نیاز دارد: یک فایل موقت (tmpfile) ایجاد می‌کند که اندازهٔ آن تقریباً با لاگ خامی که به عنوان ورودی دریافت می‌کند، برابر است. .PP گاهی اوقات postfix شناسه‌های صف (queueids) خود را بسیار سریع دوباره استفاده می‌کند. ما نمی‌توانیم این مورد را مدیریت کنیم. .SH "تشکر و قدردانی (THANKS)" .IX Header "THANKS" Brad Knowles برای ارائهٔ وصله‌ها (patches). Emanuele \(lqluca\(rq برای اشاره به تحویل lmtp. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBpostfix2dlf_main\fR\|(1)، \fBpostfix2dlf_pre\fR\|(1) و سایر مبدل‌های dlf ایمیل: \&\fBargomail2dlf\fR\|(1)، \fBexim2dlf\fR\|(1)، \fBnms2dlf\fR\|(1)، \fBqmail2dlf\fR\|(1)، \fBsendmail2dlf\fR\|(1)؛ فراخوانندهٔ \&\fBlr_log2xml\fR\|(1). .SH "نسخه (VERSION)" .IX Header "VERSION" \&\f(CW$Id:\fR postfix2dlf.in,v 1.40 2006/07/23 13:16:34 vanbaal Exp $ .SH "کپی‌رایت و تکثیر (COPYRIGHT)" .IX Header "COPYRIGHT" حق نشر (C) 2000, 2001, 2002 Stichting LogReport Foundation LogReport@LogReport.org .PP این برنامه بخشی از Lire است. .PP نرم‌افزار Lire یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «پروانه عمومی همگانی گنو» (GNU General Public License) همان‌طور که توسط بنیاد نرم‌افزار آزاد منتشر شده است، بازتوزیع کرده و/یا تغییر دهید؛ چه نسخهٔ ۲ پروانه، و چه (به انتخاب خودتان) هر نسخهٔ متأخر دیگری. .PP این برنامه به این امید توزیع شده است که مفید باشد، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابلیت فروش یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر «پروانه عمومی همگانی گنو» را ببینید. .PP شما باید به همراه این برنامه یک نسخه از GNU General Public License را دریافت کرده باشید (فایل COPYING را ببینید)؛ در غیر این صورت، به http://www.gnu.org/copyleft/gpl.html مراجعه کنید. .SH "نویسندگان (AUTHORS)" .IX Header "AUTHOR" Joost van Baal، نسخهٔ اولیه توسط Edwin Groothuis.