Aller au contenu

Graylog Cheatsheet

Graylog Cheatsheet

Installation

PlatformInstallation Method
Ubuntu/Debianwget https://packages.graylog2.org/repo/packages/graylog-5.2-repository_latest.deb && sudo dpkg -i graylog-5.2-repository_latest.deb && sudo apt-get update && sudo apt-get install graylog-server
CentOS/RHELsudo rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-5.2-repository_latest.rpm && sudo yum install graylog-server
Dockerdocker run -d --name graylog -p 9000:9000 -p 12201:12201 -p 1514:1514 -e GRAYLOG_PASSWORD_SECRET="somepassword" -e GRAYLOG_ROOT_PASSWORD_SHA2="hash" graylog/graylog:5.2
Docker Composecurl -O https://raw.githubusercontent.com/Graylog2/graylog-docker/5.2/docker-compose.yml && docker-compose up -d
Kubernetes (Helm)helm repo add graylog https://charts.graylog.org/ && helm install graylog graylog/graylog --namespace graylog

Prerequisites Installation

ComponentCommand
Java (OpenJDK 17)sudo apt-get install openjdk-17-jre-headless
MongoDB 6.0sudo apt-get install mongodb-org
OpenSearch 2.xwget https://artifacts.opensearch.org/releases/bundle/opensearch/2.11.0/opensearch-2.11.0-linux-x64.deb && sudo dpkg -i opensearch-2.11.0-linux-x64.deb
Verify Javajava -version

Service Management Commands

CommandDescription
sudo systemctl start graylog-serverStart Graylog service
sudo systemctl stop graylog-serverStop Graylog service
sudo systemctl restart graylog-serverRestart Graylog service
sudo systemctl status graylog-serverCheck service status
sudo systemctl enable graylog-serverEnable service at boot
sudo systemctl disable graylog-serverDisable service at boot
sudo tail -f /var/log/graylog-server/server.logView live logs
sudo journalctl -u graylog-server -fView systemd journal logs
sudo systemctl daemon-reloadReload systemd configuration

REST API - Authentication & Setup

CommandDescription
curl -X POST 'http://localhost:9000/api/system/sessions' -H 'Content-Type: application/json' -d '{"username":"admin","password":"pass","host":"localhost"}'Create session token
curl -u admin:token http://localhost:9000/api/systemTest API connection with token
curl -u admin:token http://localhost:9000/api/system/cluster/nodesList cluster nodes
curl -u admin:token http://localhost:9000/api/system/cluster/nodeGet current node info
curl -u admin:token http://localhost:9000/api/system/indexer/cluster/healthCheck Elasticsearch health
export GRAYLOG_API="http://localhost:9000/api"Set API endpoint variable
export GRAYLOG_TOKEN="your-api-token"Set authentication token

REST API - Search Operations

CommandDescription
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/relative?query=*&range=3600&limit=100"Search all logs (last hour)
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/relative?query=source:webserver&range=3600"Search by source field
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/relative?query=level:error&range=86400"Search error logs (24h)
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/absolute?query=*&from=2024-01-01T00:00:00.000Z&to=2024-01-02T00:00:00.000Z"Search with absolute time range
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/relative?query=message:*failed*&range=3600&sort=timestamp:desc"Search with keyword and sort
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/relative?query=http_status:500&range=7200"Search by HTTP status code
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/search/universal/relative?query=source:nginx%20AND%20level:error&range=3600"Boolean search query

REST API - Input Management

CommandDescription
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/inputs"List all inputs
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/inputs" -H 'Content-Type: application/json' -d '{"title":"Syslog UDP","type":"org.graylog2.inputs.syslog.udp.SyslogUDPInput","global":true,"configuration":{"port":1514}}'Create Syslog UDP input
curl -X DELETE -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/inputs/{inputId}"Delete input by ID
curl -X PUT -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/inputs/{inputId}"Update input configuration
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/inputs/{inputId}"Get specific input details

REST API - Stream Management

CommandDescription
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/streams"List all streams
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/streams" -H 'Content-Type: application/json' -d '{"title":"Security Logs","description":"Security events","rules":[]}'Create new stream
curl -X DELETE -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/streams/{streamId}"Delete stream
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/streams/{streamId}/resume"Start/resume stream
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/streams/{streamId}/pause"Pause stream
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/streams/{streamId}/rules"List stream rules

REST API - Index Management

CommandDescription
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/indices/index_sets"List index sets
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/indices/ranges"List index ranges
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/indices/ranges/rebuild"Rebuild index ranges
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/indices/{indexName}/reopen"Reopen closed index
curl -X DELETE -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/indices/indices/{indexName}"Delete specific index
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/system/indexer/indices/closed"List closed indices

REST API - Alert & Notification Management

CommandDescription
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/events/definitions"List event definitions
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/events/notifications"List notification configurations
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/events/definitions" -H 'Content-Type: application/json' -d @event_definition.jsonCreate event definition
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/events/search"Search events
curl -X DELETE -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/events/definitions/{definitionId}"Delete event definition

REST API - User & Role Management

CommandDescription
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/users"List all users
curl -X POST -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/users" -H 'Content-Type: application/json' -d '{"username":"newuser","password":"pass","email":"user@example.com","permissions":[],"roles":["Reader"]}'Create new user
curl -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/roles"List all roles
curl -X DELETE -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/users/{username}"Delete user
curl -X PUT -u $GRAYLOG_TOKEN:token "$GRAYLOG_API/users/{username}/password" -H 'Content-Type: application/json' -d '{"password":"newpass"}'Change user password

Configuration Files

Main Server Configuration

Location: /etc/graylog/server/server.conf

# Core settings
is_leader = true
node_id_file = /etc/graylog/server/node-id
password_secret = <96-character-secret>
root_password_sha2 = <sha256-hash>

# Web interface
http_bind_address = 0.0.0.0:9000
http_publish_uri = http://graylog.example.com:9000/
http_external_uri = http://graylog.example.com:9000/

# Elasticsearch/OpenSearch
elasticsearch_hosts = http://127.0.0.1:9200
rotation_strategy = count
elasticsearch_max_docs_per_index = 20000000
elasticsearch_max_number_of_indices = 20
retention_strategy = delete

# MongoDB
mongodb_uri = mongodb://localhost:27017/graylog

# Email configuration
transport_email_enabled = true
transport_email_hostname = smtp.example.com
transport_email_port = 587
transport_email_use_auth = true
transport_email_auth_username = graylog@example.com
transport_email_auth_password = password
transport_email_from_email = graylog@example.com

# Message processing
processbuffer_processors = 5
outputbuffer_processors = 3
processor_wait_strategy = blocking
ring_size = 65536
inputbuffer_ring_size = 65536
inputbuffer_processors = 2
inputbuffer_wait_strategy = blocking

# Message journal
message_journal_enabled = true
message_journal_dir = /var/lib/graylog-server/journal
message_journal_max_size = 5gb

JVM Options

Location: /etc/graylog/server/server.conf or JVM options file

# Heap size (set to 50% of available RAM, max 32GB)
-Xms4g
-Xmx4g

# Garbage collection
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=4
-XX:ConcGCThreads=2

# Memory settings
-XX:+AlwaysPreTouch
-XX:+UseStringDeduplication

Log4j Configuration

Location: /etc/graylog/server/log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="org.graylog2.log4j">
    <Appenders>
        <RollingFile name="rolling-file" fileName="/var/log/graylog-server/server.log"
                     filePattern="/var/log/graylog-server/server.log.%i.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5p [%c{1}] %m%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="rolling-file"/>
        </Root>
    </Loggers>
</Configuration>

Common Use Cases

Use Case 1: Setting Up Syslog Input for Linux Servers

# 1. Create Syslog UDP input via API
curl -X POST -u admin:token http://localhost:9000/api/system/inputs \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "title": "Linux Syslog UDP",
    "type": "org.graylog2.inputs.syslog.udp.SyslogUDPInput",
    "global": true,
    "configuration": {
      "bind_address": "0.0.0.0",
      "port": 1514,
      "recv_buffer_size": 262144
    }
  }'

# 2. Configure rsyslog on client server
echo "*.* @graylog-server:1514;RSYSLOG_SyslogProtocol23Format" | \
  sudo tee /etc/rsyslog.d/90-graylog.conf

# 3. Restart rsyslog
sudo systemctl restart rsyslog

# 4. Test log forwarding
logger -p local0.info "Test message to Graylog"

# 5. Search for test message
curl -u admin:token \
  "http://localhost:9000/api/search/universal/relative?query=message:*Test*&range=300"

Use Case 2: Creating Security Event Stream with Alerts

# 1. Create security stream
STREAM_ID=$(curl -X POST -u admin:token http://localhost:9000/api/streams \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "title": "Security Events",
    "description": "Failed logins and security violations",
    "remove_matches_from_default_stream": false,
    "index_set_id": "default"
  }' | jq -r '.stream_id')

# 2. Add stream rule for failed SSH logins
curl -X POST -u admin:token \
  "http://localhost:9000/api/streams/$STREAM_ID/rules" \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "field": "message",
    "type": 1,
    "value": "Failed password",
    "inverted": false,
    "description": "SSH failed login attempts"
  }'

# 3. Start the stream
curl -X POST -u admin:token \
  "http://localhost:9000/api/streams/$STREAM_ID/resume" \
  -H 'X-Requested-By: cli'

# 4. Create email notification
curl -X POST -u admin:token http://localhost:9000/api/events/notifications \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "title": "Security Alert Email",
    "description": "Email notification for security events",
    "config": {
      "type": "email-notification-v1",
      "recipients": ["security@example.com"],
      "subject": "Security Alert: ${event.message}",
      "body_template": "Event: ${event.message}\nTimestamp: ${event.timestamp}"
    }
  }'

Use Case 3: Application Log Analysis with Extractors

# 1. Create GELF TCP input for application logs
curl -X POST -u admin:token http://localhost:9000/api/system/inputs \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "title": "Application GELF TCP",
    "type": "org.graylog2.inputs.gelf.tcp.GELFTCPInput",
    "global": true,
    "configuration": {
      "bind_address": "0.0.0.0",
      "port": 12201,
      "recv_buffer_size": 1048576
    }
  }'

# 2. Send test application log (using Python)
cat > send_log.py << 'EOF'
import logging
import graypy

logger = logging.getLogger('test_app')
logger.setLevel(logging.INFO)
handler = graypy.GELFTCPHandler('graylog-server', 12201)
logger.addHandler(handler)

logger.info('Application started', extra={
    'environment': 'production',
    'service': 'api',
    'version': '1.0.0'
})
EOF

python3 send_log.py

# 3. Create stream for application errors
curl -X POST -u admin:token http://localhost:9000/api/streams \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "title": "Application Errors",
    "description": "Application error logs",
    "rules": [{
      "field": "level",
      "type": 1,
      "value": "3",
      "inverted": false
    }]
  }'

Use Case 4: Dashboard Creation and Export

# 1. List available dashboards
curl -u admin:token http://localhost:9000/api/dashboards

# 2. Create new dashboard
DASHBOARD_ID=$(curl -X POST -u admin:token http://localhost:9000/api/dashboards \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "title": "System Overview",
    "description": "System metrics and logs"
  }' | jq -r '.dashboard_id')

# 3. Add widget to dashboard (message count)
curl -X POST -u admin:token \
  "http://localhost:9000/api/dashboards/$DASHBOARD_ID/widgets" \
  -H 'Content-Type: application/json' \
  -H 'X-Requested-By: cli' \
  -d '{
    "description": "Total Messages",
    "type": "SEARCH_RESULT_COUNT",
    "cache_time": 10,
    "config": {
      "timerange": {
        "type": "relative",
        "range": 3600
      },
      "query": "*",
      "stream_id": null
    }
  }'

# 4. Export dashboard configuration
curl -u admin:token \
  "http://localhost:9000/api/dashboards/$DASHBOARD_ID" \
  > dashboard_backup.json

Use Case 5: Index Management and Optimization

# 1. Check current index status
curl -u admin:token http://localhost:9000/api/system/indices/index_sets

# 2. Get index statistics
curl -u admin:token http://localhost:9000/api/system/indexer/indices/closed

# 3. Optimize old indices
curl -X POST -u admin:token \
  http://localhost:9000/api/system/indexer/indices/graylog_0/optimize \
  -H 'X-Requested-By: cli'

# 4. Close old indices manually
curl -X POST -u admin:token \
  http://localhost:9000/api/system/indexer/indices/graylog_0/close \
  -H 'X-Requested-By: cli'

# 5. Delete old indices (be careful!)
curl -X DELETE -u admin:token \
  http://localhost:9000/api/system/indexer/indices/indices/graylog_0 \
  -H 'X-Requested-By: cli'

# 6. Trigger index rotation
curl -X POST -u admin:token \
  http://localhost:9000/api/system/indices/index_sets/default/rotation \
  -H 'X-Requested-By: cli'

# 7. Rebuild index ranges (after maintenance)
curl -X POST -u admin:token \
  http://localhost:9000/api/system/indices/ranges/rebuild \
  -H 'X-Requested-By: cli'

Search Query Syntax

Query TypeExampleDescription
Simple texterrorSearch for “error” in any field
Field searchsource:webserverSearch specific field
Phrase search"connection refused"Exact phrase match
Boolean ANDerror AND databaseBoth terms must exist
Boolean ORerror OR warningEither term exists
Boolean NOTerror NOT timeoutExclude term
Wildcarderr*Matches error, errors, etc.
Range (numeric)http_status:[400 TO 599]Numeric range
Range (date)timestamp:[2024-01-01 TO 2024-01-31]Date range
Exists_exists_:user_idField exists
Regexmessage:/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/Regular expression
Grouping(error OR warning) AND source:appGrouped conditions
Greater thanresponse_time:>1000Numeric comparison
Less thanresponse_time:<100Numeric comparison

Pipeline Rules (Advanced Processing)

Common Pipeline Rule Examples

// Extract HTTP status code from message
rule "extract_http_status"
when
  has_field("message")
then
  let pattern = "HTTP/\\d\\.\\d\" (\\d{3})";
  let result = regex(pattern: pattern, value: to_string($message.message));
  set_field("http_status", result["0"]);