LOG_DB_DAEMON(8) User Contributed Perl Documentation LOG_DB_DAEMON(8)

log_db_daemon - دیمن ثبت گزارش در پایگاه‌داده برای Squid

نسخه 0.5.

log_db_daemon DSN [گزینه‌ها]

این برنامه مدخل‌های access.log مربوط به Squid را در یک پایگاه‌داده می‌نویسد. در حال حاضر تنها قالب لاگ بومی squid پشتیبانی می‌شود.

این اسکریپت در محیط‌های زیر توسعه یافته و آزمایش شده است:

شناسه منبع داده (DSN) پایگاه‌داده که به صورت یک مسیر کدگذاری شده است. این مقدار به عنوان مسیر فایل access_log ارسال می‌شود.

پیکربندی نمونه:

access_log daemon:/host/database/table/username/password squid

برای تعیین نکردن یک پارامتر، از دو اسلش متوالی استفاده کنید:

access_log daemon://database/table/username/password squid

مقدار پیش‌فرض "DBI:mysql:database=squid"

نوشتن اطلاعات اشکال‌زدایی در خروجی خطای استاندارد (stderr).

دستورالعمل access_log

مسیر فایل گزارش دسترسی (access log) برای ارائه پارامترهای اتصال به پایگاه‌داده استفاده می‌شود.

access_log daemon:/mysql_host:port/database/table/username/password squid

پیشوند 'daemon' الزامی است و به Squid اعلام می‌کند که باید به جای ثبت گزارش معمولی در فایل، از برنامه کمکی logfile_daemon استفاده شود.

آخرین پارامتر به Squid مشخص می‌کند که هنگام نوشتن خطوط برای دیمن گزارش‌گیری، از چه قالب لاگی استفاده کند. در حال حاضر قالب squid پشتیبانی می‌شود.

میزبانی که سرور mysql روی آن در حال اجراست. در صورت خالی گذاشتن، 'localhost' در نظر گرفته می‌شود.
نام پایگاه‌داده‌ای که باید به آن متصل شد. در صورت خالی گذاشتن، 'squid_log' در نظر گرفته می‌شود.
نام جدول پایگاه‌داده که خطوط گزارش در آن ذخیره می‌شوند. در صورت خالی گذاشتن، 'access_log' در نظر گرفته می‌شود.
نام کاربری برای اتصال به پایگاه‌داده. در صورت خالی گذاشتن، 'squid' در نظر گرفته می‌شود.
گذرواژه مورد استفاده برای اتصال به پایگاه‌داده. در صورت خالی بودن، هیچ گذرواژه‌ای استفاده نخواهد شد.

برای باقی گذاشتن تمام فیلدها روی مقادیر پیش‌فرض آن‌ها، می‌توانید از یک اسلش تکی استفاده کنید:

access_log daemon:/ squid

برای مشخص کردن تنها گذرواژه پایگاه‌داده (که به صورت پیش‌فرض خالی است)، باید تمام پارامترهای دیگر را با استفاده از رشته‌های تهی (null) خالی بگذارید:

access_log daemon://///password squid

دستورالعمل logfile_daemon

این روش کنونی اعلام محل قرارگیری دیمن فایل گزارش به Squid است.

logfile_daemon /path/to/squid/libexec/logfile-daemon_mysql.pl

اسکریپت باید در مکانی که در دستورالعمل مشخص شده است کپی شود.

فرض کنید نام پایگاه‌داده را 'squid_log' و نام جدول گزارش را 'access_log' بگذاریم. نام کاربری و گذرواژه برای اتصال به پایگاه‌داده هر دو 'squid' خواهند بود.

پایگاه‌داده (Database)

ایجاد پایگاه‌داده:

CREATE DATABASE squid_log;

کاربر (User)

ایجاد کاربر:

GRANT INSERT,SELECT,CREATE ON squid_log.* TO 'squid'@'localhost' IDENTIFIED BY 'squid';
FLUSH PRIVILEGES;

توجه داشته باشید که تنها دسترسی‌های CREATE، INSERT و SELECT به کاربر 'squid' اعطا شده است. این کار تضمین می‌کند که اسکریپت دیمن فایل گزارش نتواند مدخل‌های گزارش را تغییر دهد یا اصلاح کند.

جدول (Table)

اگر هنگام شروع دیمن چنین جدولی وجود نداشته باشد، دیمن تلاش خواهد کرد آن را مقداردهی اولیه کند.

جدول ایجادشده باید شبیه به ساختار زیر باشد:

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)
);

کلاینت‌های دسترسی‌یافته به حافظه موقت (کَش)
SELECT DISTINCT ip_client FROM access_log;
تعداد درخواست‌ها در روز
SELECT
  DATE(FROM_UNIXTIME(time_since_epoch)) AS date_day,
  COUNT(*) AS num_of_requests
FROM access_log
GROUP BY 1
ORDER BY 1;
شمارش وضعیت درخواست‌ها
برای به دست آوردن تعداد خام هر وضعیت درخواست:
SELECT squid_request_status, COUNT(*) AS n
FROM access_log
GROUP BY squid_request_status
ORDER BY 2 DESC;

برای محاسبه درصد هر وضعیت درخواست:

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;

برای تفکیک فقط میان وضعیت‌های HIT و MISS:

SELECT
  'hits',
  (SELECT COUNT(*)
  FROM access_log
  WHERE squid_request_status LIKE '%HIT%')
  /
  (SELECT COUNT(*) FROM access_log)*100
  AS percentage
UNION
SELECT
  'misses',
  (SELECT COUNT(*)
  FROM access_log
  WHERE squid_request_status LIKE '%MISS%')
  /
  (SELECT COUNT(*) FROM access_log)*100
  AS percentage;
محدوده‌های زمان پاسخ
SELECT
  '0..500',
  COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage
FROM access_log
WHERE time_response >= 0 AND time_response < 500
UNION
SELECT
  '500..1000',
  COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage
FROM access_log
WHERE time_response >= 500 AND time_response < 1000
UNION
SELECT
  '1000..2000',
  COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage
FROM access_log
WHERE time_response >= 1000 AND time_response < 2000
UNION
SELECT
  '>= 2000',
  COUNT(*)/(SELECT COUNT(*) FROM access_log)*100 AS percentage
FROM access_log
WHERE time_response >= 2000;
ترافیک بر اساس نوع MIME
SELECT
  http_mime_type,
  SUM(http_reply_size) as total_bytes
FROM access_log
GROUP BY http_mime_type
ORDER BY 2 DESC;
ترافیک بر اساس کلاینت
SELECT
  ip_client,
  SUM(http_reply_size) AS total_bytes
FROM access_log
GROUP BY 1
ORDER BY 2 DESC;

موتور ذخیره‌سازی MyISAM سریع‌تر از InnoDB شناخته می‌شود؛ بنابراین با این که از تراکنش‌ها و یکپارچگی ارجاعی (referential integrity) پشتیبانی نمی‌کند، ممکن است در این سناریو مناسب‌تر باشد. شاید بخواهید "ENGINE=MYISAM" را در انتهای کد ایجاد جدول در اسکریپت SQL بالا اضافه کنید.

شاخص‌ها (ایندکس‌ها) باید مطابق با پرس‌وجوهایی که بیشتر اجرا می‌شوند ایجاد گردند. اسکریپت DDL تنها یک ایندکس ضمنی برای ستون کلید اصلی ایجاد می‌کند.

این اسکریپت در حال حاضر تنها دستور "L" (یعنی «افزودن یک خط به گزارش») را پیاده‌سازی کرده است؛ بنابراین خطوط گزارش هرگز از جدول پاک نمی‌شوند. این رویکرد مشکل مقیاس‌پذیری آشکاری دارد.

یک راه‌حل می‌تواند پیاده‌سازی دستوری مانند "rotate log" (چرخش گزارش‌ها) باشد، به‌گونه‌ای که مقادیر خلاصه‌شده‌ای را محاسبه کرده، در یک «جدول خلاصه» قرار دهد و سپس خطوطی را که برای محاسبه آن مقادیر استفاده شده‌اند حذف نماید.

کد پاک‌سازی مشابهی را می‌توان در یک اسکریپت خارجی پیاده‌سازی کرد و به صورت دوره‌ای و مستقل از دستورات گزارش‌گیری Squid اجرا نمود.

این اسکریپت تنها در سناریوهای کم‌حجم (یک کلاینت منفرد، کمتر از ۱۰ درخواست در ثانیه) آزمایش شده است. آزمایش در محیط‌های پرحجم ممکن است گلوگاه‌های عملکردی و باگ‌هایی را آشکار سازد.

این برنامه توسط Marcello Romani <marcello.romani@libero.it> و Amos Jeffries <amosjeffries@squid-cache.org> نوشته شده است.

* 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.

حق نشر (C) 2008 متعلق به Marcello Romani

این کتابخانه نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت همان شرایط خود Perl، یعنی چه Perl نسخه 5.8.8 یا (به انتخاب خودتان) هر نسخه بعدی Perl 5 که در دسترس دارید، بازتوزیع کرده یا تغییر دهید.

پرسش‌ها درباره استفاده از این برنامه را می‌توانید به فهرست پستی کاربران Squid <squid-users@lists.squid-cache.org> ارسال کنید.

گزارش‌های باگ باید به زبان انگلیسی ارسال شوند. برای جزئیات مواردی که باید در گزارش باگ خود بگنجانید، نشانی https://wiki.squid-cache.org/SquidFaq/BugReporting را ببینید.

گزارش باگ‌ها یا اصلاحیه‌ها با استفاده از نشانی https://bugs.squid-cache.org

گزارش باگ‌های امنیتی جدی به Squid Bugs <squid-bugs@lists.squid-cache.org>

گزارش ایده‌ها برای بهبودهای تازه به فهرست پستی توسعه‌دهندگان Squid <squid-dev@lists.squid-cache.org>

squid(8)، GPL(7)،

ویکی پرسش‌های متداول Squid در نشانی https://wiki.squid-cache.org/SquidFaq

راهنمای پیکربندی Squid در نشانی http://www.squid-cache.org/Doc/config

2026-08-25 perl v5.42.2