본문 바로가기

개발/nodejs

node js 실시간 로그 수집 및 검색 -2

이번시간에는 저번에 설명해 드렸던 부분을 실제로 돌려보는 작업을 할 예정입니다.

 

* 설명한 부분이란 : nodejs로그를 kibana에서 검색 및 시각화 

 

제 개발환경은 윈도우 10 이고 docker 와 docker-compose는 이미 설치하였습니다.

 

순서대로 따라해보시면 테스트해보실 수 있습니다.

 

순서는 다음과 같습니다

 

1. git clone https://github.com/baaaaaaaaaaaaam/logsystem

2. docker-compose 설명 및 실행

3. nodejs 접속 및 로그 확인

4. kibana 접속

5. 패스워드 초기화 & 파일 수정 & 재실행

6. filebeat 에서 nodejs 로그파일 확인

 

 

 

시작합니다

 

 

1. git clone https://github.com/baaaaaaaaaaaaam/logsystem

 

 

 

clone 아니까 위처럼 생겻습니다.

 

 

2. docker-compose 설명 및 실행

 

 

 

샘플로 두가지만 설명드릴게요

elasticsearch:
    build:             ==> dockerFile 을 build 하여 image로 만든 후 container로 실행시키는 경로 선택 
      context: elasticsearch/ 
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:         ==>  파일 공유 
      - type: bind    ==>  build 시 source  경로 파일을 target 위치로  연결 ( 바로가기 or 심볼릭 링크 )  
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume   ==> OS 와 docker간의 공유 파일 ,즉 container가 지워져도 지정한 파일은 남도록 하기위함
        source: elasticsearch  ==> 아래 volume 에서 지정한 이름 
        target: /usr/share/elasticsearch/data
    ports:          ==>container input port  , 즉 외부에서 container로 접속할때 열어둘 포트 osPort : servicePort
      - "9200:9200"
      - "9300:9300"
    environment:   
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      discovery.type: single-node
    networks:      ==> 특정 네트워크 지정 
      - elk
 
 

build 와 volume에서 말한 파일은 해당 경로의 파일들을 의미함

 

------------------------------------------------------중간 생략 --------------------------------------------------------

 app:   ==> nodejs 파일
    build:
      context: ./app
    volumes:
      - log-data:/app/logs   ==> nodejs에서 로그 경로는  app/logs/xx/x.log 이다. 이 로그를 log-data라는 이름으로 OS 에 저장시켜놓음 
    ports:
      - "3000:3000"
 
/app/logs/아래 로그 쌓이는 경로 

 


 
 filebeat:
    build:
      context: ./filebeat
    volumes:
      - type: bind
        source: ./filebeat/filebeat.yml
        target: /usr/share/filebeat/filebeat.yml
      - type: volume         ==> nodejs 에서 OS에 남겨둔 로그를 filebeat에서 공유하여 logstash:5044로 보낼예정 
        source: log-data
        target: /var/log/server
    networks:
      - elk
    depends_on:
      - logstash

 

 

 

추후에 실제 경로에 로그가 잇는지 확인해 봅시다.

 

설명은 이정도로하고 실행해볼게요

 

docker-compose up -d

 

3. nodejs 접속 및 로그확인

 

위처럼 정상 실행되고 브라우져를 통해 localhost:3000으로 접속하면 hello world가 보일것 입니다.

 

이제 nodejs에 로그를 확인해 볼게여

a. docker container에서 로그확인

b. docker volume에서 로그확인 

경로 검색

 

 

해당 파일

 

 

 

4. kibana 접속

localhost:5601 로 접속하시면됩니다

 

 

아 접속이안되네요.

 

kibana container 로그를 보시면 아래와 같이 표시되는데 

 

{"type":"log","@timestamp":"2022-01-02T03:52:00+00:00","tags":["warning","plugins","security","config"],"pid":7,"message":"Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command."}

 

 

 

간단하게 패스워드 초기화해주면됩니다.. 다른방법을 못찾앗어요.. 방법을 다시 찾아봐야할듯..

 

 

5. 패스워드 초기화 & 파일 수정 & 재실행

명령어 : docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch

그리고 kibana/config/kibana.yml 과 logstash/config/logstash.yml , logstash/pipeline/logstash.conf 의 패스워드를 위에서 받은 console의 값과 매칭 하여 를 각각 바꿔주세요 

kibana.yml
logstash.yml
logstash.conf 

그리고 

docker-compose restart kibana logstash

 

그리고 나서 다시 

localhost:5601 로 접속하면 kibana가 열리는걸 볼수잇습니다.

 

elastic 유저 정보로 로그인 gogo 

 

 

 

 

6. filebeat에서 nodejs로그 파일 확인

 

7. filebeat에서 logstash로 파일 전송하는지 확인.

.

.

2022-01-02T04:33:38.699Z INFO log/input.go:152 Configured paths: [/var/log/server/*/*.log]

.

.

2022-01-02T04:33:38.701Z INFO log/harvester.go:251 Harvester started for file: /var/log/server/info/2022-01-02.log
2022-01-02T04:33:38.701Z INFO log/harvester.go:251 Harvester started for file: /var/log/server/error/2022-01-02.error.log

2022-01-02T04:33:39.701Z INFO pipeline/output.go:95 Connecting to backoff(async(tcp://logstash:5044))

.

.

2022-01-02T04:35:08.655Z INFO [monitoring] log/log.go:145 Non-zero metrics in the last 30s {"monitoring": {"metrics": {"beat":{"cpu":{"system":{"ticks":30,"time":{"ms":3}},"total":{"ticks":170,"time":{"ms":12},"value":170},"user":{"ticks":140,"time":{"ms":9}}},"handles":{"limit":{"hard":1048576,"soft":1048576},"open":8},"info":{"ephemeral_id":"aa13ea0a-6b42-4c95-a070-655d622de608","uptime":{"ms":90124}},"memstats":{"gc_next":10565664,"memory_alloc":5767472,"memory_total":12981600},"runtime":{"goroutines":30}},"filebeat":{"harvester":{"open_files":2,"running":2}},"libbeat":{"config":{"module":{"running":0}},"pipeline":{"clients":1,"events":{"active":0}}},"registrar":{"states":{"current":2}},"system":{"load":{"1":2.1,"15":0.99,"5":1.71,"norm":{"1":0.2625,"15":0.1238,"5":0.2138}}}}}}

.

.

2022-01-02T04:38:43.715Z INFO log/harvester.go:276 File is inactive: /var/log/server/error/2022-01-02.error.log. Closing because close_inactive of 5m0s reached.
2022-01-02T04:38:43.715Z INFO log/harvester.go:276 File is inactive: /var/log/server/info/2022-01-02.log. Closing because close_inactive of 5m0s reached.

 

8.kibana에서 log 파일 검색 및 확인

 

 

만약 위 화면이 안뜨고 다른 3개의 선택지를 고르라는 화면이 뜨면 filebeat로부터 log index를 못받은것입니다

nodejs를 다시접속해서 로그를 만들어내던가 index생성부분이 잘못된것입니다.

 

 

 

name에 *log* , timestamp filed 는 @timestamp로 하고 생성해주시면되요

 

그리고 다시 discover로 이동하면 아래처럼 시간별 로그기록이 볼수있습니다.

 

저는 메시지를 선택한후 검색을 할예정입니다. 

 

 

 

다음에는 실제 운영하는 테스트서버에 적용해보도록하겟습니다 

 

============================================================================추가 - 1 

패스워드 변경 방법

kibana.yml , logstash.yml , logstash.conf 에 사용할 패스워드 입력한 후 

 

docker-compose up -d 실행

(대기)

docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords interactive

Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.

>>패스워드입력

Please confirm that you would like to continue [y/N]Did not understand answer '패스워드입력'

y

패스워드입력 

.

.

.

(12번 반복)

 

Changed password for user [apm_system]
oChanged password for user [kibana_system]
Changed password for user [kibana]
bChanged password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

 

하고 다시 좀 기다렷다가 kibana로 접속하면 바로 접속이 되는것을 볼수 잇습니다.!!!!!!!!!!!!

 

 

추가-2 

 

docker-compose 실행시킬떄 ELK 를 다 활성화 시킨후에 filebeat를 실행해주세요.

아직 정확한 원인은 못찾앗으나 docker-compose 로 ELK + filebeat를 동시에 실행시키니 로그일부가 kibana에서 보이지않았습니다 ㅜㅜ