본문 바로가기
OS/Linux

[Linux] 로그 데몬 만들기 실습

by Yoon_estar 2025. 1. 19.
728x90

시나리오

  • FASTAPI 기반 HelloWorld 앱 작성
  • systemd 데몬 형태로 앱 구동
  • journalctl로 로그 출력 확인
  • rsyslog 설정으로 별도의 로그 파일로 저장
    • /var/log/hello.log
  • 로그 로테이트 설정
    • logrotate.d 디레토리에 HelloWorld 앱용 설정 추가

 

0. 파이썬 설치

외부망으로 설치해도 되나 수동 설치로 진행하였다. 

# sudo apt update
# wget https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tgz
# tar xvf Python-3.11.1.tgz
# cd Python-3.11.1
# ./configure --prefix=/APP/enhpc/python/v3.11.1 --enable-optimizations
# make && make install

 

1. 파이썬 패키지 설치

# sudo pip3 install "uvicorn[standard]" gunicorn fastapi

 

2. fastapi 앱 파일 생성

# mkdir ~/systemd_demo

# vim /home/estar987/systemd_demo/main.py

---------------------------------------------------------
from fastapi import FastAPI
from datetime import datetime
import logging
from logging.handlers import SysLogHandler

log = logging.getLogger('demo')
log.setLevel(logging.DEBUG)
handler = SysLogHandler(address='/dev/log',
        facility=SysLogHandler.LOG_LOCAL7)
handler.setFormatter(logging.Formatter('hello: %(message)s'))
log.addHandler(handler)

app = FastAPI()


@app.get("/")
def read_root():
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")
    log.debug('[{}] Hello World'.format(current_time))
    return {"Hello": "World"}

--------------------------------------------------------------------------

 

3. system unit 파일 생성

# sudo vim /etc/systemd/system/hello.service

--------------------------------------------------------------------------
[Unit]
Description=HelloWorld
After=network.target

[Service]
WorkingDirectory=/home/estar987/systemd_demo
ExecStart=/APP/enhpc/python/v3.11.1/bin/gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8787
Restart=on-failure
RestartSec=5s
SyslogIdentifier=gunicorn
SyslogFacility=local7

[Install]
WantedBy=multi-user.target

--------------------------------------------------------------------------

 

4. hello.service 시작 및 동작 상태 확인

# sudo systemctl daemon-reload
# sudo systemctl restart hello
# sudo systemctl status hello.service
● hello.service - HelloWorld
     Loaded: loaded (/etc/systemd/system/hello.service; disabled; preset: enabled)
     Active: active (running) since Wed 2025-01-15 15:15:52 KST; 20min ago
   Main PID: 1413965 (gunicorn)
      Tasks: 9 (limit: 9442)
     Memory: 146.7M (peak: 147.5M)
        CPU: 13.369s
     CGroup: /system.slice/hello.service
             ├─1413965 /APP/enhpc/python/v3.11.1/bin/python3 /APP/enhpc/python/v3.11.1/bin/gunicorn main:app --workers 4 --w>
             ├─1413970 /APP/enhpc/python/v3.11.1/bin/python3 /APP/enhpc/python/v3.11.1/bin/gunicorn main:app --workers 4 --w>
             ├─1413972 /APP/enhpc/python/v3.11.1/bin/python3 /APP/enhpc/python/v3.11.1/bin/gunicorn main:app --workers 4 --w>
             ├─1413975 /APP/enhpc/python/v3.11.1/bin/python3 /APP/enhpc/python/v3.11.1/bin/gunicorn main:app --workers 4 --w>
             └─1413976 /APP/enhpc/python/v3.11.1/bin/python3 /APP/enhpc/python/v3.11.1/bin/gunicorn main:app --workers 4 --w>

Jan 15 15:15:54 kubemaster210 gunicorn[1413970]: [2025-01-15 15:15:54 +0900] [1413970] [INFO] Application startup complete.
Jan 15 15:15:54 kubemaster210 gunicorn[1413972]: [2025-01-15 15:15:54 +0900] [1413972] [INFO] Started server process [141397>
Jan 15 15:15:54 kubemaster210 gunicorn[1413972]: [2025-01-15 15:15:54 +0900] [1413972] [INFO] Waiting for application startu>
Jan 15 15:15:54 kubemaster210 gunicorn[1413972]: [2025-01-15 15:15:54 +0900] [1413972] [INFO] Application startup complete.
Jan 15 15:15:54 kubemaster210 gunicorn[1413975]: [2025-01-15 15:15:54 +0900] [1413975] [INFO] Started server process [141397>
Jan 15 15:15:54 kubemaster210 gunicorn[1413975]: [2025-01-15 15:15:54 +0900] [1413975] [INFO] Waiting for application startu>
Jan 15 15:15:54 kubemaster210 gunicorn[1413975]: [2025-01-15 15:15:54 +0900] [1413975] [INFO] Application startup complete.
Jan 15 15:15:54 kubemaster210 gunicorn[1413976]: [2025-01-15 15:15:54 +0900] [1413976] [INFO] Started server process [141397>
Jan 15 15:15:54 kubemaster210 gunicorn[1413976]: [2025-01-15 15:15:54 +0900] [1413976] [INFO] Waiting for application startu>
Jan 15 15:15:54 kubemaster210 gunicorn[1413976]: [2025-01-15 15:15:54 +0900] [1413976] [INFO] Application startup complete.

 

5. 테스트

# curl localhost:8000
curl: (7) Failed to connect to localhost port 8000 after 0 ms: Couldn't connect to server

# curl localhost:8787
{"Hello":"World"}root@sudo journalctl -u hello -n 5ctl -u hello -n 5
Jan 15 15:15:54 kubemaster210 gunicorn[1413975]: [2025-01-15 15:15:54 +0900] [1413975] [INFO] Application startup complete.
Jan 15 15:15:54 kubemaster210 gunicorn[1413976]: [2025-01-15 15:15:54 +0900] [1413976] [INFO] Started server process [141397>
Jan 15 15:15:54 kubemaster210 gunicorn[1413976]: [2025-01-15 15:15:54 +0900] [1413976] [INFO] Waiting for application startu>
Jan 15 15:15:54 kubemaster210 gunicorn[1413976]: [2025-01-15 15:15:54 +0900] [1413976] [INFO] Application startup complete.
Jan 15 15:37:42 kubemaster210 hello[1413976]: [15:37:42] Hello World

 

6. rsyslog 설정 (/var/log/에 파일로 저장)

# sudo vim /etc/rsyslog.d/30-hello.conf

--------------------------------------------------------------------------
local7.*             /var/log/hello.log
--------------------------------------------------------------------------

 

 

7. rsyslog 데몬 재시작

# sudo systemctl restart rsyslog

 

8. 로그 이벤트 생성 및 로그 파일 저장 내용 확인

# sudo systemctl restart hello
# curl localhost:8787
{"Hello":"World"}
# cat /var/log/hello.log
2025-01-15T15:11:50.704996+09:00 kubemaster210 gunicorn[1409076]: [2025-01-15 15:11:50 +0900] [1409076] [INFO] Starting gunicorn 23.0.0
2025-01-15T15:11:50.705329+09:00 kubemaster210 gunicorn[1409076]: [2025-01-15 15:11:50 +0900] [1409076] [INFO] Listening at: http://0.0.0.0:8787 (1409076)
2025-01-15T15:11:50.705427+09:00 kubemaster210 gunicorn[1409076]: [2025-01-15 15:11:50 +0900] [1409076] [INFO] Using worker: uvicorn.workers.UvicornWorker

 

9. 로그 로테이트 설정

# vim /etc/logrotate.d/hello

--------------------------------------------------------------------------

/var/log/hello.log {
  daily
  rotate 14
  missingok
  notifempty
  copytruncate
  compress
  delaycompress
}

--------------------------------------------------------------------------