منذ حوالي خمس سنوات، واجهت مهمة جمع السجلات، عادة من قواعد الشفرة الصغيرة إلى المتوسطة الحجم. إرسال السجلات من الكود ليس مشكلة: لدى Java و Go مكتبات لهذا الغرض بشكل عملي من البداية. لكن نشر شيء لجمعها هو صداع. أفهم أنها مهمة قابلة للحل (حتى قبل ChatGPT، والآن أكثر من ذلك). ومع ذلك، فإن جميع أنظمة التسجيل موجهة بشكل أساسي نحو عالم المؤسسات الكبيرة ومتطلباتها، بدلاً من الفرق الصغيرة أو المطورين الفرديين مع بعض العصي والغراء وموعد نهائي "بالأمس".
إطلاق ELK يمثل تحديًا بالنسبة لي في كل مرة: مجموعة من الإعدادات، ونشر غير بديهي، وعندما أدخل واجهة المستخدم، تجري عيناي بشكل جامح بين علامات التبويب. مع Loki و Graylog، الأمر أسهل قليلاً، لكن لا يزال هناك ميزات أكثر بكثير مما أحتاج. في نفس الوقت، فصل السجلات بين المشاريع وإضافة مستخدمين آخرين إلى النظام بحيث لا يرون أي شيء لا ينبغي عليهم رؤيته، ليست العملية الأكثر وضوحًا أيضًا.
لذلك قبل حوالي عام، قررت إنشاء نظام جمع السجلات الخاص بي. نظام سهل الاستخدام والإطلاق قدر الإمكان. سيتم نشره على الخادم بأمر واحد، دون أي تكوين أو علامات تبويب غير ضرورية في الواجهة. هكذا ظهر Log Bull، وهو الآن مفتوح المصدر: نظام جمع السجلات للمطورين ذوي المشاريع متوسطة الحجم.
جدول المحتويات:
Log Bull هو نظام لجمع السجلات مع التركيز على سهولة الاستخدام (الحد الأدنى من التكوين، الحد الأدنى من الميزات، بدون تكوين عند بدء التشغيل). المشروع مفتوح المصدر بالكامل تحت ترخيص Apache 2.0. كانت أولويتي الرئيسية هي إنشاء حل يسمح لمطور مبتدئ بمعرفة كيفية بدء تشغيل النظام بسهولة، وكيفية إرسال السجلات إليه، وكيفية عرضها في حوالي 15 دقيقة.
الميزات الرئيسية للمشروع:
https://www.youtube.com/watch?v=8H8jF8nVzJE&embedable=true
تم تطوير المشروع بلغة Go وبُني على OpenSearch.
موقع المشروع - https://logbull.com
مشروع GitHub - https://github.com/logbull/logbull
ملاحظة: إذا وجدت المشروع مفيدًا ولديك حساب GitHub، فيرجى إعطائه نجمة ⭐️. من الصعب جمع النجوم الأولى. سأكون ممتنًا للغاية لدعمك!
هناك ثلاث طرق لنشر المشروع: عبر نص برمجي .sh (الذي أوصي به)، عبر Docker وعبر Docker Compose.
الطريقة 1: التثبيت عبر النص البرمجي
سيقوم النص البرمجي بتثبيت Docker، ووضع المشروع في مجلد /opt/logbull، وتكوين بدء التشغيل التلقائي عند إعادة تشغيل النظام. أمر التثبيت:
sudo apt-get install -y curl && \ sudo curl -sSL https://raw.githubusercontent.com/logbull/logbull/main/install-logbull.sh \ | sudo bash
الطريقة 2: الإطلاق عبر Docker Compose
قم بإنشاء ملف docker-compose.yml بالمحتوى التالي:
services: logbull: container_name: logbull image: logbull/logbull:latest ports: - "4005:4005" volumes: - ./logbull-data:/logbull-data restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4005/api/v1/system/health"] interval: 5s timeout: 5s retries: 30
وقم بتشغيل الأمر docker compose up -d. سيبدأ النظام على المنفذ 4005.
الطريقة 3: الإطلاق عبر أمر Docker
قم بتشغيل الأمر التالي في المحطة الطرفية (سيبدأ النظام أيضًا على المنفذ 4005):
docker run -d \ --name logbull \ -p 4005:4005 \ -v ./logbull-data:/logbull-data \ --restart unless-stopped \ --health-cmd="curl -f http://localhost:4005/api/v1/system/health || exit 1" \ --health-interval=5s \ --health-retries=30 \ logbull/logbull:latest
صممت المشروع مع وضع الراحة في الاعتبار، بشكل أساسي للمطورين. لهذا السبب قمت بإنشاء مكتبات لمعظم لغات التطوير الشائعة. فعلت ذلك بفكرة أن Log Bull يمكن توصيله بأي مكتبة شائعة كمعالج دون تغيير قاعدة الكود الحالية.
أوصي بشدة بالاطلاع على الأمثلة على الموقع، لأن هناك لوحة تفاعلية لاختيار اللغة:

لنأخذ Python كمثال. أولاً، تحتاج إلى تثبيت المكتبة (على الرغم من أنه يمكنك أيضًا إرسالها عبر HTTP؛ هناك أمثلة لـ cURL):
pip install logbull
ثم أرسل من الكود:
import time from logbull import LogBullLogger # Initialize logger logger = LogBullLogger( host="http://LOGBULL_HOST", project_id="LOGBULL_PROJECT_ID", ) # Log messages (printed to console AND sent to LogBull) logger.info("User logged in successfully", fields={ "user_id": "12345", "username": "john_doe", "ip": "192.168.1.100" }) # With context session_logger = logger.with_context({ "session_id": "sess_abc123", "user_id": "user_456" }) session_logger.info("Processing request", fields={ "action": "purchase" }) # Ensure all logs are sent before exiting logger.flush() time.sleep(5)
يتم عرض جميع السجلات فورًا على الشاشة الرئيسية. يمكنك:
تقليل حجم الرسائل (عن طريق قطع السطر إلى ~50-100 حرف).
توسيع قائمة الحقول المرسلة (user_id، order_id، إلخ).
انقر على حقل وأضفه إلى عامل التصفية. البحث في السجلات مع الشروط:



يمكنك أيضًا جمع مجموعات من الشروط (على سبيل المثال، تتضمن الرسالة نصًا معينًا، ولكنها تستبعد عنوان IP محدد للخادم).
آمل أن يكون نظام جمع السجلات الخاص بي مفيدًا لأولئك المطورين الذين لا يريدون أو لا يستطيعون (بسبب موارد المشروع المحدودة) تنفيذ حلول "ثقيلة الوزن" مثل ELK. أنا بالفعل أستخدم Log Bull في مشاريع الإنتاج، وكل شيء يسير على ما يرام. أرحب بالتعليقات والاقتراحات للتحسين والمشكلات على GitHub.


