Profile picture

[Linux] 로깅 수집 오픈소스 - Gray log

JaehyoJJAng2023년 05월 13일

Gray Log

서비스 구성 시 서버를 분산해서 관리하게 되는 경우가 있다.
BE,FE,DB 등의 서버가 많아지면 많아질 수록 관리는 힘들어진다.

그래서 통합 로그 관리에 대한 필요가 발생하고, 이를 손쉽게 적용할 수 있도록 오픈소스로 제공되는 여러 서비스들이 존재한다 그 중에서 graylog 오픈소스를 사용해보겠다


진행 순서는 아래와 같다

  • 로그 서버 역할을 할 서버에 도커 및 도커 컴포즈 설치
  • graylog admin 비번 생성 및 sha 설치 및 암호 생성
  • 플러그인 설치 (slack plugin)
  • 도커 이미지 빌드
  • 도커 컴포즈 실행

1. 도커 설치

  • 서버에 도커 & 도커 컴포즈 설치
  • OS: CentOS 7

아래 링크 참고하여 도커 설치
https://jaehyojjang.dev/docker-install/docker-install/


2. 디렉토리 생성

graylog 설정 파일 디렉토리 생성

mkdir -p /data/{mongo_data,es_data,graylog_journal,graylog_config}

3. admin password 생성

yum install perl-Digest-SHA -y # 설치 에러나는 경우 SHA1 설치
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/pwgen-2.08-1.el7.x86_64.rpm
yum pwgen-2.08-1.el7.x86_64.rpm
pwgen -N 1 -s 72 > GRAYLOG_PASSWORD_SECRET.txt # 이 값을 docker-compose.yml 파일의 GRAYLOG_PASSWORD_SECRET 키의 값으로 복사
echo -n [비밀번호] | shasum -a 256 > GRAYLOG_PASSWORD_SHA2 # 안되면 echo -n [비밀번호] | sha256sum 로 시도

위의 결과 값을 아래 docker-compose의 GRAYLOG_PASSWORD_SHA2 키의 값으로 복사


4. 도커파일 작성

  • 플러그인(slack)을 받아 설치하는 graylog 용 도커파일 작성
FROM graylog/graylog:2.4.3-1
RUN wget -O /usr/share/graylog/plugin/graylog-plugin-slack-3.1.0.jar https://github.com/graylog-labs/graylog-plugin-slack/releases/download/3.1.0/graylog-plugin-slack-3.1.0.jar

5. 도커 이미지 빌드

docker build -t yshrim12/graylog-with-slack

6. 포트 개방

  • 9000번 포트 허용
firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload

7. graylog config

cd /data/graylog_config
wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.4/config/graylog.conf
wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.4/config/log4j2.xml

8. 도커 컴포즈 실행

docker-compose.yml

version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: mongo:3
    volumes:
      - mongo_data:/data/db
    container_name: db

  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docker.html
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.6.6
    volumes:
      - es_data:/usr/share/elasticsearch/data
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/security-settings.html#general-security-settings
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
    container_name: es

  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    # image: graylog/graylog:2.4.3-1
    image: yshrim12/graylog-with-slack
    volumes:
      - graylog_journal:/usr/share/graylog/data/journal
      - graylog_config:/usr/share/graylog/data/config
    environment:
      # CHANGE ME!
      - GRAYLOG_PASSWORD_SECRET=[위에서 생성한 값 입력]
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=[위에서 생성한 값 입력]
      # nullvana
      - GRAYLOG_WEB_ENDPOINT_URI=http://서버IP:9000/api
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      - 9000:9000
      # Syslog TCP
      - 514:514
      # Syslog UDP
      - 514:514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp
    container_name: graylog
# Volumes for persisting data, see https://docs.docker.com/engine/admin/volumes/volumes/
volumes:
  mongo_data:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/data/mongo_data'
  es_data:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/data/es_data'
  graylog_journal:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/data/graylog_journal'
  graylog_config:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/data/graylog_config'      

volumes 구문 설명

volumes:
  mongo_data:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/data/mongo_data'
  • mongo_data: MongoDB 데이터를 저장하기 위한 볼륨입니다.
  • driver: local: local 드라이버를 사용합니다
  • type: 'none': type 옵션은 none으로 설정되어 있습니다.
  • o: 'bind': 이 옵션은 바인딩을 수행할 때 사용되는 추가 옵션을 의미하며, bind로 설정되어 있습니다.
  • device: '/data/mongo_data': 옵션은 호스트 시스템의 /data/mongo_data 경로를 바인딩 대상으로 지정합니다.

Loading script...