.\" -*- 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 "LOG_DB_DAEMON 8" .TH LOG_DB_DAEMON 8 2026-08-25 "perl v5.42.2" "User Contributed Perl 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)" log_db_daemon \- دیمن ثبت گزارش در پایگاه‌داده برای Squid .PP نسخه 0.5. .SH "خلاصه دستور (SYNOPSIS)" .IX Header "خلاصه دستور (SYNOPSIS)" log_db_daemon DSN [\fIگزینه‌ها\fR] .SH "توضیحات (DESCRIPTION)" .IX Header "توضیحات (DESCRIPTION)" این برنامه مدخل‌های access.log مربوط به Squid را در یک پایگاه‌داده می‌نویسد. در حال حاضر تنها قالب لاگ بومی .B squid پشتیبانی می‌شود. .PP این اسکریپت در محیط‌های زیر توسعه یافته و آزمایش شده است: .IP "squid\-2.7 Squid\-3.2" 4 .IX Item "squid-2.7 Squid-3.2" .PD 0 .IP "mysql 5.0.26 and 5.1" 4 .IX Item "mysql 5.0.26 and 5.1" .IP "perl 5.8.8" 4 .IX Item "perl 5.8.8" .IP "OpenSUSE 10.2" 4 .IX Item "OpenSUSE 10.2" .PD .SH "گزینه‌ها (OPTIONS)" .IX Header "گزینه‌ها (OPTIONS)" .IP \fBDSN\fR 12 .IX Item "DSN" شناسه منبع داده (DSN) پایگاه‌داده که به صورت یک مسیر کدگذاری شده است. این مقدار به عنوان مسیر فایل access_log ارسال می‌شود. .Sp پیکربندی نمونه: .Vb 1 \& access_log daemon:/host/database/table/username/password squid .Ve .Sp برای تعیین نکردن یک پارامتر، از دو اسلش متوالی استفاده کنید: .Vb 1 \& access_log daemon://database/table/username/password squid .Ve .Sp مقدار پیش‌فرض "DBI:mysql:database=squid" .IP \fB\-\-debug\fR 12 .IX Item "--debug" نوشتن اطلاعات اشکال‌زدایی در خروجی خطای استاندارد (stderr). .SH "پیکربندی (CONFIGURATION)" .IX Header "پیکربندی (CONFIGURATION)" .SS "پیکربندی Squid (Squid configuration)" .IX Subsection "Squid configuration" \fIدستورالعمل access_log\fR .IX Subsection "دستورالعمل access_log" .PP مسیر فایل گزارش دسترسی (access log) برای ارائه پارامترهای اتصال به پایگاه‌داده استفاده می‌شود. .PP .Vb 1 \& access_log daemon:/mysql_host:port/database/table/username/password squid .Ve .PP پیشوند \*(Aqdaemon\*(Aq الزامی است و به Squid اعلام می‌کند که باید به جای ثبت گزارش معمولی در فایل، از برنامه کمکی \fBlogfile_daemon\fR استفاده شود. .PP آخرین پارامتر به Squid مشخص می‌کند که هنگام نوشتن خطوط برای دیمن گزارش‌گیری، از چه قالب لاگی استفاده کند. در حال حاضر قالب \fBsquid\fR پشتیبانی می‌شود. .IP mysql_host:port 4 .IX Item "mysql_host:port" میزبانی که سرور mysql روی آن در حال اجراست. در صورت خالی گذاشتن، \*(Aqlocalhost\*(Aq در نظر گرفته می‌شود. .IP database 4 .IX Item "database" نام پایگاه‌داده‌ای که باید به آن متصل شد. در صورت خالی گذاشتن، \*(Aqsquid_log\*(Aq در نظر گرفته می‌شود. .IP table 4 .IX Item "table" نام جدول پایگاه‌داده که خطوط گزارش در آن ذخیره می‌شوند. در صورت خالی گذاشتن، \*(Aqaccess_log\*(Aq در نظر گرفته می‌شود. .IP username 4 .IX Item "username" نام کاربری برای اتصال به پایگاه‌داده. در صورت خالی گذاشتن، \*(Aqsquid\*(Aq در نظر گرفته می‌شود. .IP password 4 .IX Item "password" گذرواژه مورد استفاده برای اتصال به پایگاه‌داده. در صورت خالی بودن، هیچ گذرواژه‌ای استفاده نخواهد شد. .PP برای باقی گذاشتن تمام فیلدها روی مقادیر پیش‌فرض آن‌ها، می‌توانید از یک اسلش تکی استفاده کنید: .PP .Vb 1 \& access_log daemon:/ squid .Ve .PP برای مشخص کردن تنها گذرواژه پایگاه‌داده (که به صورت پیش‌فرض خالی است)، باید تمام پارامترهای دیگر را با استفاده از رشته‌های تهی (null) خالی بگذارید: .PP .Vb 1 \& access_log daemon://///password squid .Ve .PP \fIدستورالعمل logfile_daemon\fR .IX Subsection "دستورالعمل logfile_daemon" .PP این روش کنونی اعلام محل قرارگیری دیمن فایل گزارش به Squid است. .PP .Vb 1 \& logfile_daemon /path/to/squid/libexec/logfile\-daemon_mysql.pl .Ve .PP اسکریپت باید در مکانی که در دستورالعمل مشخص شده است کپی شود. .SS "پیکربندی پایگاه‌داده (Database configuration)" .IX Subsection "Database configuration" فرض کنید نام پایگاه‌داده را \*(Aqsquid_log\*(Aq و نام جدول گزارش را \*(Aqaccess_log\*(Aq بگذاریم. نام کاربری و گذرواژه برای اتصال به پایگاه‌داده هر دو \*(Aqsquid\*(Aq خواهند بود. .PP \fIپایگاه‌داده (Database)\fR .IX Subsection "Database" .PP ایجاد پایگاه‌داده: .PP .Vb 1 \& CREATE DATABASE squid_log; .Ve .PP \fIکاربر (User)\fR .IX Subsection "User" .PP ایجاد کاربر: .PP .Vb 2 \& GRANT INSERT,SELECT,CREATE ON squid_log.* TO \*(Aqsquid\*(Aq@\*(Aqlocalhost\*(Aq IDENTIFIED BY \*(Aqsquid\*(Aq; \& FLUSH PRIVILEGES; .Ve .PP توجه داشته باشید که تنها دسترسی‌های CREATE، INSERT و SELECT به کاربر \*(Aqsquid\*(Aq اعطا شده است. این کار تضمین می‌کند که اسکریپت دیمن فایل گزارش نتواند مدخل‌های گزارش را تغییر دهد یا اصلاح کند. .PP \fIجدول (Table)\fR .IX Subsection "Table" .PP اگر هنگام شروع دیمن چنین جدولی وجود نداشته باشد، دیمن تلاش خواهد کرد آن را مقداردهی اولیه کند. .PP جدول ایجادشده باید شبیه به ساختار زیر باشد: .PP .Vb 10 \& CREATE TABLE access_log ( \& id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, \& time_since_epoch DECIMAL(15,3), \& time_response INTEGER, \& ip_client CHAR(15), \& ip_server CHAR(15), \& http_status_code VARCHAR(10), \& http_reply_size INTEGER, \& http_method VARCHAR(20), \& http_url TEXT, \& http_username VARCHAR(20), \& http_mime_type VARCHAR(50), \& squid_hier_status VARCHAR(20), \& squid_request_status VARCHAR(20) \& ); .Ve .SH "استخراج داده‌ها (DATA EXTRACTION)" .IX Header "استخراج داده‌ها (DATA EXTRACTION)" .SS "پرس‌وجوهای نمونه (Sample queries)" .IX Subsection "Sample queries." .IP "کلاینت‌های دسترسی‌یافته به حافظه موقت (کَش)" 4 .IX Item "Clients accessing the cache" .Vb 1 \& SELECT DISTINCT ip_client FROM access_log; .Ve .IP "تعداد درخواست‌ها در روز" 4 .IX Item "Number of request per day" .Vb 6 \& SELECT \& DATE(FROM_UNIXTIME(time_since_epoch)) AS date_day, \& COUNT(*) AS num_of_requests \& FROM access_log \& GROUP BY 1 \& ORDER BY 1; .Ve .IP "شمارش وضعیت درخواست‌ها" 4 .IX Item "Request status count" برای به دست آوردن تعداد خام هر وضعیت درخواست: .Sp .Vb 4 \& SELECT squid_request_status, COUNT(*) AS n \& FROM access_log \& GROUP BY squid_request_status \& ORDER BY 2 DESC; .Ve .Sp برای محاسبه درصد هر وضعیت درخواست: .Sp .Vb 6 \& SELECT \& squid_request_status, \& (COUNT(*)/(SELECT COUNT(*) FROM access_log)*100) AS percentage \& FROM access_log \& GROUP BY squid_request_status \& ORDER BY 2 DESC; .Ve .Sp برای تفکیک فقط میان وضعیت‌های HIT و MISS: .Sp .Vb 10 \& SELECT \& \*(Aqhits\*(Aq, \& (SELECT COUNT(*) \& FROM access_log \& WHERE squid_request_status LIKE \*(Aq%HIT%\*(Aq) \& / \& (SELECT COUNT(*) FROM access_log)*100 \& AS percentage \& UNION \& SELECT \& \*(Aqmisses\*(Aq, \& (SELECT COUNT(*) \& FROM access_log \& WHERE squid_request_status LIKE \*(Aq%MISS%\*(Aq) \& / \& (SELECT COUNT(*) FROM access_log)*100 \& AS percentage; .Ve .IP "محدوده‌های زمان پاسخ" 4 .IX Item "Response time ranges" .Vb 10 \& SELECT \& \*(Aq0..500\*(Aq, \& COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage \& FROM access_log \& WHERE time_response >= 0 AND time_response < 500 \& UNION \& SELECT \& \*(Aq500..1000\*(Aq, \& COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage \& FROM access_log \& WHERE time_response >= 500 AND time_response < 1000 \& UNION \& SELECT \& \*(Aq1000..2000\*(Aq, \& COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage \& FROM access_log \& WHERE time_response >= 1000 AND time_response < 2000 \& UNION \& SELECT \& \*(Aq>= 2000\*(Aq, \& COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage \& FROM access_log \& WHERE time_response >= 2000; .Ve .IP "ترافیک بر اساس نوع MIME" 4 .IX Item "Traffic by mime type" .Vb 6 \& SELECT \& http_mime_type, \& SUM(http_reply_size) as total_bytes \& FROM access_log \& GROUP BY http_mime_type \& ORDER BY 2 DESC; .Ve .IP "ترافیک بر اساس کلاینت" 4 .IX Item "Traffic by client" .Vb 6 \& SELECT \& ip_client, \& SUM(http_reply_size) AS total_bytes \& FROM access_log \& GROUP BY 1 \& ORDER BY 2 DESC; .Ve .SH "مسائل شناخته‌شده (KNOWN ISSUES)" .IX Header "مسائل شناخته‌شده (KNOWN ISSUES)" .SS "مسائل مربوط به سرعت (Speed issues)" .IX Subsection "Speed issues" موتور ذخیره‌سازی MyISAM سریع‌تر از InnoDB شناخته می‌شود؛ بنابراین با این که از تراکنش‌ها و یکپارچگی ارجاعی (referential integrity) پشتیبانی نمی‌کند، ممکن است در این سناریو مناسب‌تر باشد. شاید بخواهید "ENGINE=MYISAM" را در انتهای کد ایجاد جدول در اسکریپت SQL بالا اضافه کنید. .PP شاخص‌ها (ایندکس‌ها) باید مطابق با پرس‌وجوهایی که بیشتر اجرا می‌شوند ایجاد گردند. اسکریپت DDL تنها یک ایندکس ضمنی برای ستون کلید اصلی ایجاد می‌کند. .SS "پاک‌سازی جدول (Table cleanup)" .IX Subsection "Table cleanup" این اسکریپت در حال حاضر تنها دستور \f(CW\*(C`L\*(C'\fR (یعنی «افزودن یک خط به گزارش») را پیاده‌سازی کرده است؛ بنابراین خطوط گزارش هرگز از جدول پاک نمی‌شوند. این رویکرد مشکل مقیاس‌پذیری آشکاری دارد. .PP یک راه‌حل می‌تواند پیاده‌سازی دستوری مانند "rotate log" (چرخش گزارش‌ها) باشد، به‌گونه‌ای که مقادیر خلاصه‌شده‌ای را محاسبه کرده، در یک «جدول خلاصه» قرار دهد و سپس خطوطی را که برای محاسبه آن مقادیر استفاده شده‌اند حذف نماید. .PP کد پاک‌سازی مشابهی را می‌توان در یک اسکریپت خارجی پیاده‌سازی کرد و به صورت دوره‌ای و مستقل از دستورات گزارش‌گیری Squid اجرا نمود. .SS "آزمایش (Testing)" .IX Subsection "Testing" این اسکریپت تنها در سناریوهای کم‌حجم (یک کلاینت منفرد، کمتر از ۱۰ درخواست در ثانیه) آزمایش شده است. آزمایش در محیط‌های پرحجم ممکن است گلوگاه‌های عملکردی و باگ‌هایی را آشکار سازد. .SH "نویسندگان (AUTHORS)" .IX Header "نویسندگان (AUTHORS)" این برنامه توسط \&\fIMarcello Romani \fR و \&\fIAmos Jeffries \fR نوشته شده است. .SH "حق نشر (COPYRIGHT)" .IX Header "حق نشر (COPYRIGHT)" .Vb 5 \& * Copyright (C) 1996\-2026 The Squid Software Foundation and contributors \& * \& * Squid software is distributed under GPLv2+ license and includes \& * contributions from numerous individuals and organizations. \& * Please see the COPYING and CONTRIBUTORS files for details. .Ve .PP حق نشر (C) 2008 متعلق به Marcello Romani .PP این کتابخانه نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت همان شرایط خود Perl، یعنی چه Perl نسخه 5.8.8 یا (به انتخاب خودتان) هر نسخه بعدی Perl 5 که در دسترس دارید، بازتوزیع کرده یا تغییر دهید. .SH "پرسش‌ها (QUESTIONS)" .IX Header "پرسش‌ها (QUESTIONS)" پرسش‌ها درباره استفاده از این برنامه را می‌توانید به \fIفهرست پستی کاربران Squid \fR ارسال کنید. .SH "گزارش باگ‌ها (REPORTING BUGS)" .IX Header "گزارش باگ‌ها (REPORTING BUGS)" گزارش‌های باگ باید به زبان انگلیسی ارسال شوند. برای جزئیات مواردی که باید در گزارش باگ خود بگنجانید، نشانی https://wiki.squid\-cache.org/SquidFaq/BugReporting را ببینید. .PP گزارش باگ‌ها یا اصلاحیه‌ها با استفاده از نشانی https://bugs.squid\-cache.org .PP گزارش باگ‌های امنیتی جدی به \fISquid Bugs \fR .PP گزارش ایده‌ها برای بهبودهای تازه به \fIفهرست پستی توسعه‌دهندگان Squid \fR .SH "همچنین ببینید (SEE ALSO)" .IX Header "همچنین ببینید (SEE ALSO)" .BR squid (8)، .BR GPL (7)، .PP ویکی پرسش‌های متداول Squid در نشانی https://wiki.squid\-cache.org/SquidFaq .PP راهنمای پیکربندی Squid در نشانی http://www.squid\-cache.org/Doc/config