כאשר קבצי הלוג גדלים לעשרות ג'יגה-בייט וחיפוש ידני אחר שגיאה אורך שעות, ריכוזיות הלוגים הופכת להכרח. בפרויקט אחד עם 20 מיקרוסרוויסים, קיצרנו את זמן איתור שורש התקלה מקריסה מ-3 שעות ל-10 דקות לאחר פריסת Graylog. Graylog פותר את זה: הוא אוסף, מנתח ומעבד לוגים מכל מקור — מיישום Laravel ועד שרת Nginx. בתוך כמה ימי עבודה, אנו פורסים את המחזור המלא: קלט GELF, pipelines, דשבורדים והתראות Telegram. הניסיון שלנו: 30+ הטמעות מוצלחות עם אפס אובדן נתונים בעומסים של עד 10,000 בקשות לדקה. אנו מבטיחים יציבות וחיסכון: בפרויקט אחד, הלקוח חסך 250,000 רובל במשך שישה חודשים על ידי אוטומציה של חיפוש שגיאות.
Graylog היא מערכת קוד פתוח.
למה Graylog במקום ELK או Loki?
Graylog תופסת נישה בין ELK (חזק, מורכב) לבין Loki (פשוט, מוגבל). יש לה ממשק אינטרנט מובנה עם חיפוש, התראות ודשבורדים — אין צורך ב-Kibana כרכיב נפרד. היא מתאימה לצוותים שצריכים ניהול לוגים מרכזי ללא התאמה אישית עמוקה. בפועל, Graylog מתמודדת עם עד 100,000 הודעות בשנייה, מהיר פי 2 מ-ELK על חומרה דומה. ארכיטקטורה: Graylog ← MongoDB (תצורה) + OpenSearch/Elasticsearch (נתונים).
איך להגדיר התראות לשגיאות קריטיות?
Graylog תומכת ב-Event Definitions — התראות המבוססות על תנאים. לדוגמה, לשיעור גבוה של שגיאות 5xx:
Alerts → Event Definitions → Create:
- כותרת: שיעור שגיאות 5xx גבוה
- תנאי: Aggregation
- Stream: כל גישת Nginx
- ספירת הודעות
- פילטר: http_status >= 500
- ביצוע כל: 5 דקות
- תנאי: count > 50
- התראה:
- סוג: HTTP Notification
- URL:
https://api.telegram.org/bot<TOKEN>/sendMessage - גוף:
{"chat_id": "<ID>", "text": "High error rate: ${event.message}"}
פריסה שלב אחר שלב
- הכן שרת עם Docker ו-Docker Compose.
- צור את הקובץ docker-compose.yml (ראה להלן).
- הפעל קונטיינרים:
docker-compose up -d. - הגדר Inputs בממשק האינטרנט של Graylog.
- הגדר שליחת לוגים מהיישום שלך.
- צור Streams והתראות.
---
docker-compose.yml
version: '3.8'
services:
mongodb:
image: mongo:6.0
volumes:
- mongo_data:/data/db
opensearch:
image: opensearchproject/opensearch:2.12.0
environment:
- cluster.name=graylog
- discovery.type=single-node
- plugins.security.disabled=true
- "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- os_data:/usr/share/opensearch/data
graylog:
image: graylog/graylog:6.0
environment:
- GRAYLOG_PASSWORD_SECRET=your_random_64_char_secret
- GRAYLOG_ROOT_PASSWORD_SHA2=your_sha256_password_hash
- GRAYLOG_HTTP_EXTERNAL_URI=http://graylog.example.com:9000/
- GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
- GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200
ports:
- "9000:9000" # Web UI
- "12201:12201" # GELF UDP
- "12201:12201/udp"
- "5044:5044" # Beats
- "514:514/udp" # Syslog UDP
depends_on:
- mongodb
- opensearch
volumes:
mongo_data:
os_data:
צור סודות: docker-compose.yml version: '3.8' services: mongodb: image: mongo:6.0 volumes: - mongo_data:/data/db opensearch: image: opensearchproject/opensearch:2.12.0 environment: - cluster.name=graylog - discovery.type=single-node - plugins.security.disabled=true - "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g" - bootstrap.memory_lock=true ulimits: memlock: { soft: -1, hard: -1 } volumes: - os_data:/usr/share/opensearch/data graylog: image: graylog/graylog:6.0 environment: - GRAYLOG_PASSWORD_SECRET=your_random_64_char_secret - GRAYLOG_ROOT_PASSWORD_SHA2=your_sha256_password_hash - GRAYLOG_HTTP_EXTERNAL_URI=http://graylog.example.com:9000/ - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog - GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200 ports: - "9000:9000" # Web UI - "12201:12201" # GELF UDP - "12201:12201/udp" - "5044:5044" # Beats - "514:514/udp" # Syslog UDP depends_on: - mongodb - opensearch volumes: mongo_data: os_data: ו-hash של סיסמה: pwgen -N 1 -s 96.
Inputs
Graylog מקבלת לוגים דרך Inputs — מוגדרים ב-System → Inputs. בחירת הפרוטוקול תלויה בדרישות האמינות והביצועים.
| פרוטוקול | פורט | אמינות | עומס | שימוש טיפוסי |
|---|---|---|---|---|
| GELF UDP | 12201 | נמוכה (אובדן אפשרי) | מינימלי | יישומים שבהם מהירות חשובה יותר מאשר הבטחה |
| GELF TCP | 12201 | גבוהה | גבוה יותר | לוגים קריטיים (שגיאות, אבטחה) |
| Beats | 5044 | גבוהה | בינוני | Filebeat ללוגי שרת |
| Syslog UDP/TCP | 514 | בינונית | נמוך | ציוד רשת, לוגי מערכת |
שליחת לוגים מ-Laravel ל-Graylog דרך GELF
השתמש ב-GELF (הפרוטוקול המקורי של Graylog). התקן את החבילה echo -n "password" | sha256sum וצור logger מותאם אישית:
// app/Logging/GraylogLogger.php
namespace App\Logging;
use Gelf\Publisher;
use Gelf\Transport\UdpTransport;
use Monolog\Handler\GelfHandler;
use Monolog\Logger;
class GraylogLogger
{
public function __invoke(array $config): Logger
{
$transport = new UdpTransport(
$config['host'],
$config['port'] ?? 12201,
UdpTransport::CHUNK_SIZE_LAN
);
$publisher = new Publisher($transport);
$handler = new GelfHandler($publisher);
return new Logger('app', [$handler]);
}
}
// config/logging.php
'graylog' => [
'driver' => 'custom',
'via' => App\Logging\GraylogLogger::class,
'host' => env('GRAYLOG_HOST', 'graylog'),
'port' => 12201,
],
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'graylog'],
],שדות Context הופכים אוטומטית לשדות ב-Graylog. דוגמה לקריאה: graylog2/gelf-php
הגדרת Filebeat ללוגי Nginx
---
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/access.log
fields:
source_type: nginx_access
processors:
- add_fields:
target: ''
fields:
environment: production
output.logstash:
hosts: ["graylog-server:5044"]
Extractors ו-Pipelines
Graylog מאפשרת ניתוח שדות מהודעות דרך Extractors (לשדות בודדים) או Processing Pipelines (ללוגיקה מורכבת). לדוגמה, עבור לוגי גישה של Nginx, ניתן לחלץ את קוד התגובה ולתייג אוטומטית שגיאות 5xx. בפרויקט אחד שעיבד 2 מיליון אירועים ביום, תבנית ה-grok בוצעה ב-10 מיקרו-שניות להודעה, ללא עיכובים.
דוגמה ל-Pipeline עבור Nginx
rule "parse nginx access log"
when has_field("source_type") AND to_string($message.source_type) == "nginx_access"
then
let extracted = grok(
pattern: "%{IPORHOST:client_ip} - %{DATA:username} \\[%{HTTPDATE:http_date}\\] \"%{WORD:http_method} %{DATA:request_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status:int} %{NUMBER:bytes_sent:int}",
value: to_string($message.message),
only_named_captures: true
);
set_fields(extracted);
set_field("http_status_int", to_long($message.http_status));
end
rule "tag error responses"
when has_field("http_status_int") AND to_long($message.http_status_int) >= 500
then
set_field("is_error", true);
add_tag("http_error");
end Streams ו-Index Sets — ניהול אחסון
Streams מאפשרים פיצול זרם הלוגים לקטגוריות עם מדיניות שמירה שונה. אנו ממליצים על שלושה Streams:
- גישת Nginx: source_type = nginx_access → שמירה 30 יום
- שגיאות יישום: level = ERROR או CRITICAL → שמירה 90 יום
- אירועי אבטחה: tags מכילים "security" → שמירה 180 יום
עבור כל Stream, צור Index Set עם הגדרות עצמאיות. דוגמה עבור שגיאות יישום:
| פרמטר | ערך |
|---|---|
| קידומת אינדקס | app-errors |
| מקסימום אינדקסים | 90 |
| רוטציה | יומית |
| שמירה | מחיקה, מקסימום 90 |
| Shards | 2 |
| Replicas | 0 |
דשבורד
ב-Graylog, דשבורדים בנויים מווידג'טים של חיפוש. סט סטנדרטי ליישום אינטרנט:
- מספר הודעות (כל הלוגים, 24 שעות) — מספר
- קודי סטטוס HTTP (תרשים עוגה, שדה http_status)
- שיעור שגיאות (תרשים קו, פילטר level:ERROR, קיבוץ לפי זמן)
- הנתיבים המובילים (טבלה, ערכים מובילים לפי request_path)
- התפלגות גיאוגרפית (מפה, אם GeoIP מופעל)
ציר זמן ותוצרים
פריסת Graylog + OpenSearch + MongoDB, הגדרת Inputs, Filebeat עבור Nginx, רישום GELF מהיישום, חוקי Pipeline בסיסיים, Index Sets עם מדיניות שמירה, התראות ראשוניות — 1-2 ימי עבודה. אנו נעריך את הפרויקט שלך ביום אחד — צור קשר כדי לדון בפרטים. הזמן פריסת Graylog סוהרת ואנו נכין תצורה מותאמת לפרויקט שלך תוך 24 שעות.







