이것이 점프 투 공작소

리눅스 로그에 대해 알아보자 본문

리눅스

리눅스 로그에 대해 알아보자

겅겅겅 2022. 11. 27. 14:10

리눅스 log저장 방식(flow)

이벤트발생 -> /dev/log -> systemd-journal -> rsyslogd 또는 journalctl -> 로그파일

syslog

전통적인 로그관리 시스템입니다.

기본적으로 로그는 /var/log/syslog에 저장됩니다.

syslog를 확인

syslog설정

/etc/rsyslog.d 에 로그설정 파일들이 존재합니다.

50-default.conf

소스(중요도) - 저장위치 daemon.* /var/log/daemon.log 형식으로 설정되있습니다.

추가설명필요

기본컴프파일

cloud-init.conf

:로그태그값, 조건, 인자, 보낼위치

특정 조건에 맞는 인자가 있다면 특정 위치에 로그를 저장시킬 수 있습니다.

journal

syslog보다 개선된 방식, 메시지를 효율적으로 수집, 저장 및 검색합니다.

바이너리 형태로 로그 메시지를 저장, 커멘드라인 인터페이스 journalctl제공합니다

기본 저장 위치는 /var/log/journal 디렉토리에 저장되며, /etc/system/journal.conf 파일에서 저장위치 변경 가능합니다.

명령어 설명
journalctl -u 서비스명 해당 서비스(유닛)에 대한 로그 출력
journalctl -f follow명령
journalctl --disk-usage 디스크에 저장된 journal스토리지 공간 크기 확인
journalctl /usr/sbin/sshd 특정 위치에서 로그 확인
journalctl  --list-boots 부팅에 대한 로그 확인, 0은 현재 부팅 
journalctl -b -1 -u ssh : 저번 부팅에서의 ssh로그 확인

journalctl -u ssh.service 로 ssh의 로그를 조회 가능합니다

 

logrotate

리눅스 배포판의 표준로그 관리 유틸리티

/etc/logrotate.d 디렉토리에서 cron에 의해 매일 1회 수행됩니다 

많아지는 로그를 관리하기 위해 사용됩니다.

명령어 설명
compress 현재 버전이 아닌 모든 log파일 압축
daily, weekly, monthly 지정된 일정대로 로그 파일들을 로테이션
delaycompress 현재와 가장 최근 버전을 제외한 모든 버전 압축
endscript prerotate나 postrotate스크립트 끝을 표시
errors emaiaddr 지정된 이메일로 오류 알림 메시즈를 보냄
missingok 로그파일이 존재하지 않을때 오류처리 x
notifempty 로그파일이 비어 있으면 로테이트 처리 하지 않음
postrotate 로그 로테이션이 완료된 후 실행할 스크립트
prerotate 로그 파일의 변경 전 실행될 스크립트
rotate n 최대 n개 버전의 로그파일 유지
size logsize 로그파일이 logsize 크기를 넘어선 경우 로테이션
copytruncate  로그 데이터를 새로운 파일로 카피하고, 기존파일로 비움

 

구동 앱 로그 설정법

앱 소스

어플리케이션 폴더와 파일을 생성해줍니다.

fast-api를 사용하여 진행하였습니다.

sudo apt update
sudo apt install python3-pip
sudo pip3 install "uvicorn[standard]" gunicorn fastapi

 

폴더 : ~/demo

파일명 : ~/demo/main.py

서비스 소스

모든 서비스 파일은 /etc/systemd/system에 존재합니다.

추가로 재부팅 후에도 서비스가 시작되도록 하려면 sudo systemctl enable 서비스명 을 실행시켜주시면 됩니다.

파일 : /etc/systemd/system/hello.service

Unit : 구동할 서비스와 관련 문서 작성

Description : systemctl status로 서비스 확인 시 로그 상단에 표시되는 이름

After, Before : 부팅 과정 중 서비스 동작 전, 동작 후에 구동되어야하는 서비스 정의

EX) 하기 소스파일의 경우 network.target서비스 구동 후 실행되어야합니다.

 

Service : 실행 방식, 시작 시 구동할 스크립트 등 서비스 구동과 연관되는 부분을 작성합니다.

ExecStart : 서비스 구동 시 실행할 스크립트 지정

Restart : restart를 실행하는 상황에 정의하는 옵션

    on - 재기동 상황시 별도 지정 X

    on-failure - 비정상 종료시 재기동

    on-success - 정상 종료시 서비스 재기동합니다,

                           SIGHUP, SIGINT, SIGTERM, SIGPIP나 SuccessExitStatus옵션에 정의 된 시그널을 받아 판단합니다.

    on-abort - SuccessExitStatus, RestartPreventExitStatus에 정의되지 않은 종료 시그널 감지 시 재기동

    always - 중단되면 무조건 재기동

 

Install : 기타 설정파일 

WantedBy, RequestBy - 해당 서비스를 Enable로 전환할 경우 이 서비스들이 포함된 서비스 그룹을 지정합니다.

기본적으로 WantedBy=multi-user.target을 사용합니다.

 

 

 

서비스 시작, 동작 상태 확인

# 데몬 설정 다시 불러오기 init
sudo systemctl daemon-reload
# 해당 서비스 재시작
sudo systemct restart hello
# 서비스 상태확인
sudo systemctl status hello

정상적으로 동작하고 있습니다.

rsyslog설정 추가

파일 : /etc/rsyslog.d/30-hello.conf

어플리케이션 소스에서 local7의 로그를 생성했으므로 해당 레벨의 모든 로그를 hello.log파일에 위치시킵니다.

rsyslog설정 추가 후 어플리케이션을 재시작해주면 로그를 확인할 수 있습니다.

 

로그이벤트 생성 logrotate

추가적으로 해당 log파일의 rotate도 설정해줍니다.

파일 : /etc/logrotate.d/hello