Mục tiêu bài học
- Sử dụng
docker container logsđể xem log - Gửi log ứng dụng ra
STDOUT/STDERR - Hiểu nguyên lý log theo chuẩn Twelve-Factor App – Log (#11)
- Gỡ lỗi container khi bị lỗi khởi động
1. Tạo container mẫu có log
docker container run -d \
--name weather-app \
-p 80:3000 \
linuxacademycontent/weather-app
Node.js chạy ở cổng 3000 bên trong container.
2. Xem log container bằng lệnh logs
docker container logs weather-app
-> App listening on port 3000
Sau khi gửi request đến web (vd: truy cập IP → nhập “Dallas”), bạn sẽ thấy log được ghi lại:
City requested: Dallas
City requested: San Antonio
Invalid city error: not found
3. Ứng dụng gửi log ra đâu?
Ứng dụng viết theo Twelve-Factor App:
“Log là dòng sự kiện (event stream), được ghi không đệm (unbuffered) ra STDOUT hoặc STDERR”.
Trong Node.js:
console.log("Info") // STDOUT
console.error("Error") // STDERR
Trong Python:
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Info message")
Trong Ruby:
require 'logger'
logger = Logger.new(STDOUT)
logger.info("Hello logs!")
4. Symlink log file vào STDOUT/STDERR (vd: nginx)
Trong container Nginx:
access.log -> /dev/stdout
error.log -> /dev/stderr
💡 Đây là cách để app cũ vẫn ghi log ra file nhưng Docker vẫn đọc được.
5. Gỡ lỗi khi container khởi động lỗi
Tạo lỗi bằng ghost_blog không có MySQL:
docker container run -d --name ghost_blog ghost
Kiểm tra:
docker container ls -a
## ghost_blog exited with status code 1
Xem log lỗi:
docker container logs ghost_blog
Kết quả log lỗi:
Error: Cannot connect to database!
Exit code 1= lỗi khởi độngExit code 0= chạy & thoát bình thường
Tổng kết
| Lệnh / Khái niệm | Mô tả |
|---|---|
docker container logs <name> | Xem log từ container (stdout/stderr) |
console.log / error | In log từ Node.js |
logger / logging | In log từ Ruby, Python |
status code | 0: OK, 1: Lỗi |
Symlink /dev/stdout | Gửi log file ra ngoài container |
Note:
- Ghi log đúng chuẩn = STDOUT / STDERR
docker container logslà công cụ số 1 để gỡ lỗi khi container “chết”- Đừng cố ghi file log trong container – để hệ thống log xử lý bên ngoài