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
}
--------------------------------------------------------------------------
'OS > Linux' 카테고리의 다른 글
[Linux] hwclock 명령어 (0) | 2025.01.23 |
---|---|
[Linux]iproute2: 현대적인 네트워킹 명령어 (1) | 2025.01.20 |
[Linux]리눅스 로그 관리 (0) | 2025.01.18 |
[Linux] 리눅스 프로세스와 쓰레드 관리 (0) | 2025.01.17 |
[계정 관리] 서버 간 계정 동기화하기 (0) | 2025.01.16 |