POSTFIX2DLF.IN(1) LogReport's Lire Documentation POSTFIX2DLF.IN(1)

postfix2dlf - تبدیل فایل‌های لاگ postfix به قالب dlf

postfix2dlf

دستور postfix2dlf یک فایل لاگ postfix را به یک فایل قالب لاگ چکیده (Distilled Log Format - DLF) ایمیل در Lire تبدیل می‌کند. این ابزار برای انجام کار اصلی، postfix2dlf_pre(1) و postfix2dlf_main(1) را فراخوانی می‌کند. این دستور فایل لاگ را از ورودی stdin دریافت می‌کند و خروجی DLF را در stdout می‌نویسد. پیام‌های عیب‌یابی در stderr چاپ می‌شوند. این اسکریپت توسط lr_log2xml(1) فراخوانی می‌شود.

معماری postfix2dlf با سایر مبدل‌های dlf ایمیل کاملاً متفاوت است. دلیل این امر این است که هنگام تجزیهٔ یک فایل لاگ postfix، هیچ نشانه‌ای مبنی بر اینکه آیا یک پیام به تمام گیرندگان تحویل داده شده است یا خیر وجود ندارد. (در لاگ sendmail فیلدی به نام rcpts= وجود دارد که می‌توان برای این منظور استفاده کرد.)

برای برخورد با چنین لاگی چندین راهکار وجود دارد: ۱: ردگیری تمام queueidها به همراه اطلاعات from- مربوط به آن‌ها در تمام مدت پردازش فایل لاگ، که این روش بیش از حد حافظه مصرف می‌کند. ۲: استفاده از یک روش حدسی ۱۰ ثانیه‌ای: فرض شود پیام هیچ‌گاه بیشتر از مثلاً ۱۰ ثانیه در صف باقی نمی‌ماند؛ یا به‌صورت جایگزین، فرض شود هم‌زمان بیش از $LR_POSTFIX_MAX_QUEUE_SIZE پیام در صف نخواهد بود، که این روش بیش از حد مستعد خطاست. ۳: استفاده از sort(1) برای مرتب‌سازی خطوط لاگ بر اساس queueid؛ این همان روشی است که ما قبلاً استفاده می‌کردیم. با این حال، ما از پیش نمی‌دانیم کدام فیلد queueid را ذخیره خواهد کرد (برای نمونه، فایل‌های لاگ پردازش‌شده توسط syslog در Sun Solaris مقدار queueid را در موقعیت دیگری دارند). محاسبهٔ این موقعیت به معنی دوبار تجزیه کردن لاگ خواهد بود.

ما گونه‌ای تغییریافته از راهکار سوم را انتخاب کرده‌ایم: اطلاعاتی را که می‌توانستیم با sort(1) به دست آوریم، در یک فایل db ذخیره می‌کنیم. هنگام ساخت این فایل db، که نگاشتی از queueidها به nof-lines-with-this-id نگه‌می‌دارد، تا جای ممکن پیش‌پردازش انجام می‌دهیم. لاگ پیش‌پردازش‌شده در یک tmpfile چاپ می‌شود. ساختار لاگ پیش‌پردازش‌شده مشابه لاگ خام است: هر خط لاگ خام، یک خط پیش‌پردازش‌شده تولید می‌کند. لاگ پیش‌پردازش‌شده با استفاده از اطلاعات موجود در فایل db، توسط lr_postfix2dlf_main(1) به dlf تبدیل می‌شود.

یک اثر جانبی مطلوب این شیوهٔ پردازش این است که لاگ بر اساس ترتیب زمانی اولیه پردازش می‌شود..SH "مثال‌ها (EXAMPLES)" یک فایل لاگ:

Dec 1 04:02:56 internetsrv postfix/pickup[20919]: 
 693A3578E: uid=0 from=<root>
Dec 1 04:02:56 internetsrv postfix/cleanup[20921]: 
 693A3578E: message-id=<john.doe.1@example.com>
Dec 1 04:02:57 internetsrv postfix/qmgr[20164]: 693A3578E: 
 from=<john.doe.2@example.com>, size=617 (queue active)
Dec 1 04:02:57 internetsrv postfix/cleanup[20921]: 
 E325C578D: message-id=<john.doe.1@example.com>
Dec 1 04:02:58 internetsrv postfix/local[20924]: 
 693A3578E: to=<john.doe.2@example.com>, relay=local, 
 delay=3, status=sent (forwarded as E325C578D)
Dec 1 04:02:58 internetsrv postfix/qmgr[20164]: E325C578D: 
 from=<john.doe.2@example.com>, size=769 (queue active)
Dec 1 04:02:59 internetsrv postfix/smtp[20925]: E325C578D: 
 to=<john.doe.3@example.com>, 
 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=<john.doe.4@example.com>
Dec 1 06:58:24 internetsrv postfix/qmgr[20164]: 42BFE578D: 
 from=<john.doe.5@example.com>, size=2473 (queue active)
Dec 1 06:58:26 internetsrv postfix/smtp[21145]: 42BFE578D: 
 to=<john.doe.6@example.com>, 
 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=<john.doe.7@example.com>
Dec 1 07:08:29 internetsrv postfix/qmgr[20164]: C7B39578D: 
 from=<john.doe.8@example.com>, size=2173 (queue active)
Dec 1 07:08:32 internetsrv postfix/smtp[21163]: C7B39578D: 
 to=<john.doe.9@example.com>, 
 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]

به این صورت تبدیل خواهد شد:

1007175776 internetsrv 693A3578E <john.doe.1@example.com>
 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.1@example.com>
 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.4@example.com>
 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.7@example.com>
 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.)

دستور postfix2dlf به‌ندرت به‌تنهایی استفاده می‌شود، بلکه به احتمال زیاد توسط lr_log2report فراخوانی می‌گردد:

$ lr_log2report postfix < /var/log/mail.log > report

. اگر واقعاً تمایل دارید این اسکریپت را به‌صورت مستقل اجرا کنید (مثلاً برای اشکال‌زدایی)، آن را بدین صورت اجرا کنید:

$ LR_SERVICE=email LR_ID=`date +%s` /path/to/lire/convertors/postfix2dlf < /var/log/mail.log > mail.dlf

. اطمینان حاصل کنید که /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)" لاگ‌های Postfix به این صورت هستند:

postfix/pickup[81586]: 094BE204: uid=1001 from=<edwin>
postfix/cleanup[81683]: 094BE204: 
 message-id=<20000531080729.L39824@cgmd76206.c.nl>
postfix/qmgr[13460]: 094BE204: 
 from=<edwin@cgmd76206.c.nl>, size=1717 (queue active)
postfix/smtp[81685]: 094BE204: to=<r.moeskops@c.nl>, 
 relay=smtp.c.nl[212.83.68.146], delay=4, status=sent (250 
 Message received: 
 20000531060722.ZCOV13476.relay02@cgmd76206.c.nl)

postfix/pickup[81849]: 473B9204: uid=1001 from=<edwin>
postfix/cleanup[81916]: 473B9204: 
 message-id=<200005310901.LAA56567@kludge.mpn.cp.p.com>
postfix/qmgr[13460]: 473B9204: 
 from=<edwin@cgmd76206.c.nl>, size=1997 (queue active)
postfix/local[81918]: 473B9204: to=<edwin@cgmd76206.c.nl>, 
 relay=local, delay=0, status=sent 
 ("|exec /usr/local/bin/procmail -t")

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=<Jan.Stap@nl.o-it.com>, size=1692 (queue active)
postfix/local[82059]: A17131C5: 
 to=<majordomo-org@cgmd76206.c.nl>, relay=local, delay=1, 
 status=sent ("|/usr/local/majordomo/wrapper majordomo")

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=<edwin@bw2.baub.bwk.t.nl>, size=774 (queue active)
postfix/smtpd[58567]: disconnect from 
 kweetal.t.nl[131.155.2.7]
postfix/smtp[58574]: 9A16E229: to=<joostvb@x.nl>, 
 relay=mx3.x.nl[194.109.6.48], delay=15, status=sent (250 
 OAA23290 Message accepted for delivery)

ما مجموعه postfix2dlf را روی یک فایل لاگ ۲۴ مگابایتی postfix اجرا کردیم. نتایج بدین شرح بودند:

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

.

دستور postfix2dlf به‌ندرت به‌تنهایی استفاده می‌شود، اما به احتمال زیاد توسط lr_log2report فراخوانی خواهد شد:

 $ lr_run lr_log2report postfix < /var/log/maillog
این اسکریپت به فضای زیادی در TMPDIR نیاز دارد: یک فایل موقت (tmpfile) ایجاد می‌کند که اندازهٔ آن تقریباً با لاگ خامی که به عنوان ورودی دریافت می‌کند، برابر است.
گاهی اوقات postfix شناسه‌های صف (queueids) خود را بسیار سریع دوباره استفاده می‌کند. ما نمی‌توانیم این مورد را مدیریت کنیم.

Brad Knowles برای ارائهٔ وصله‌ها (patches). Emanuele “luca” برای اشاره به تحویل lmtp.

postfix2dlf_main(1)، postfix2dlf_pre(1) و سایر مبدل‌های dlf ایمیل: argomail2dlf(1)، exim2dlf(1)، nms2dlf(1)، qmail2dlf(1)، sendmail2dlf(1)؛ فراخوانندهٔ lr_log2xml(1).

$Id: postfix2dlf.in,v 1.40 2006/07/23 13:16:34 vanbaal Exp $

حق نشر (C) 2000, 2001, 2002 Stichting LogReport Foundation LogReport@LogReport.org

این برنامه بخشی از Lire است.

نرم‌افزار Lire یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «پروانه عمومی همگانی گنو» (GNU General Public License) همان‌طور که توسط بنیاد نرم‌افزار آزاد منتشر شده است، بازتوزیع کرده و/یا تغییر دهید؛ چه نسخهٔ ۲ پروانه، و چه (به انتخاب خودتان) هر نسخهٔ متأخر دیگری.

این برنامه به این امید توزیع شده است که مفید باشد، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابلیت فروش یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر «پروانه عمومی همگانی گنو» را ببینید.

شما باید به همراه این برنامه یک نسخه از GNU General Public License را دریافت کرده باشید (فایل COPYING را ببینید)؛ در غیر این صورت، به http://www.gnu.org/copyleft/gpl.html مراجعه کنید.

Joost van Baal، نسخهٔ اولیه توسط Edwin Groothuis.

2025-09-28 Lire 2.1.1