DEV Community

Kevin Fiseneck
Kevin Fiseneck

Posted on • Updated on

Manage logs with Symfony and Graylog

Logging with Symfony - Graylog

Docker-compose configuration

Graylog need elasticsearch and mongodb to store and index data.
Let's create our docker-compose file:


version: '3.7'

services:
    #[...]

     elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
        environment:
            - node.name=elasticsearch
            - cluster.name=docker-cluster
            - bootstrap.memory_lock=true
            - discovery.type=single-node
            - xpack.security.enabled=false
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
            memlock:
                soft: -1
                hard: -1
        volumes:
            - esdata:/usr/share/elasticsearch/data
        ports:
            - 9200:9200
    mongodb:
        image: "mongo:4.2"
        restart: always

    graylog:
        image: "graylog/graylog:4.3.2"
        depends_on:
            -   elasticsearch
            -   mongodb
        entrypoint: "/usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh"
        environment:
            GRAYLOG_PASSWORD_SECRET: somepasswordpepper
            # to generate a password hash, type: echo -n admin | shasum -a 256
            GRAYLOG_ROOT_PASSWORD_SHA2: 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
            GRAYLOG_HTTP_BIND_ADDRESS: "0.0.0.0:9001"
            GRAYLOG_HTTP_EXTERNAL_URI: "http://localhost:9001/"
            GRAYLOG_ELASTICSEARCH_HOSTS: "http://elasticsearch:9200"
            GRAYLOG_MONGODB_URI: "mongodb://mongodb:27017/graylog"
        ports:
            - "5044:5044/tcp"   # Beats
            - "5140:5140/udp"   # Syslog
            - "5140:5140/tcp"   # Syslog
            - "5555:5555/tcp"   # RAW TCP
            - "5555:5555/udp"   # RAW TCP
            - "9001:9001/tcp"   # Server API
            - "12201:12201/tcp" # GELF TCP
            - "12201:12201/udp" # GELF UDP
            - "13301:13301/tcp" # Forwarder data
            - "13302:13302/tcp" # Forwarder config
volumes:
    esdata:
Enter fullscreen mode Exit fullscreen mode

Install Monolog on your project

Monolog bundle integrates Monolog into Symfony, it comes with many handlers like slack, elasticsearch and Graylog

composer require symfony/monolog-bundle
Enter fullscreen mode Exit fullscreen mode

Install the gelf implementation in php

composer require graylog2/gelf-php
Enter fullscreen mode Exit fullscreen mode

Now go to the /config/packages/dev/monolog.yaml

As you can see the there are 2 handlers:
- "streams" write all logs into a file
- "console" allow you to see logs on your terminal when you execute a task with the option -vvv

Now add the new handler to send all logs in graylog:

monolog:
    handlers:
        # [...]
        graylog:
            type: gelf
            publisher:
                hostname: "%env(GRAYLOG_HOST)%"
                port: "%env(GRAYLOG_PORT)%"
            level: debug
Enter fullscreen mode Exit fullscreen mode

Then add this 2 new env variable in your .env file

#[...]
GRAYLOG_HOST=localhost
GRAYLOG_PORT=12201
Enter fullscreen mode Exit fullscreen mode

Configure a new input in graylog

Go to http://localhost:9001/ then connect you with the credentials: admin/admin

Then go to System/Inputs, select "GELF UDP" then click on launch input.

Test

Go to your website then go back to your graylog dashboard, now you can see all the logs :)

Discussion (0)