Docker / Log харах ба удирдах

Log харах ба удирдах

Аппликейшн ямар алдаа гаргасан, хэзээ хүсэлт ирсэн, юу болсныг мэдэхийн тулд log чухал. Docker container-ийн log-уудыг хэрхэн харах, хадгалах, удирдах талаар энэ хичээлд үзнэ.

docker logs

bash
# Log бүгдийг харах
docker logs mycontainer

# Сүүлийн 50 мөр
docker logs --tail 50 mycontainer

# Бодит цагт дагаж харах
docker logs -f mycontainer

# Хоёуланг нь
docker logs -f --tail 100 mycontainer

# Тодорхой цагаас хойших log
docker logs --since 2024-01-15T10:00:00 mycontainer
docker logs --since 30m mycontainer     # сүүлийн 30 минут
docker logs --since 2h mycontainer      # сүүлийн 2 цаг

# Тодорхой цагийн өмнөх log
docker logs --until 2024-01-15T12:00:00 mycontainer

# Хооронд нь
docker logs --since 10:00 --until 11:00 mycontainer

# Timestamp харуулах
docker logs -t mycontainer

Stdout ба stderr

Docker нь аппликейшний stdout болон stderr-ийг log болгон цуглуулна. Тиймээс аппликейшн log-оо stdout руу гаргах ёстой:

python
# ✅ Docker log-д орно
print("Серверт холбогдлоо")
import sys; print("Алдаа гарлаа", file=sys.stderr)

# ❌ Docker log-д ороогүй — файлд хадгалагдсан
with open("/app/logs/app.log", "w") as f:
    f.write("Серверт холбогдлоо")
javascript
// ✅ Docker log-д орно
console.log("Серверт холбогдлоо");
console.error("Алдаа гарлаа");

Logging driver

Docker нь log-уудыг хэрхэн хадгалах, дамжуулахыг logging driver-ээр тодорхойлно.

json-file (анхдагч)

bash
# Log файл хаана байна вэ
docker inspect --format='{{.LogPath}}' mycontainer
# /var/lib/docker/containers/<id>/<id>-json.log

Log файлын форматыг харах:

json
{
  "log": "Сервер 3000 порт дээр ажиллаж байна\n",
  "stream": "stdout",
  "time": "2024-01-15T10:00:00Z"
}

Log rotation тохируулах

Логийн файл хязгааргүй өсвөл диск дүүрнэ. Rotation тохируулна:

bash
# Container ажиллуулахдаа
docker run -d \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  --name myapp \
  myimage

max-size=10m — нэг log файл 10MB хүртэл
max-file=3 — хамгийн ихдээ 3 файл (нийт 30MB)
Гурав дахь файл дүүрэхэд хамгийн эхний устна.

Docker daemon дээр глобал тохируулах

/etc/docker/daemon.json файлд:

json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
bash
sudo systemctl restart docker

Docker Compose-д log тохируулах

yaml
services:
  app:
    image: myapp
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Бусад logging driver-ууд

syslog

Системийн syslog руу дамжуулна:

bash
docker run -d \
  --log-driver syslog \
  --log-opt syslog-address=udp://logserver:514 \
  myimage

none

Log огт хадгалахгүй:

bash
docker run -d --log-driver none myimage

Test container эсвэл маш их log гаргадаг, гэхдээ хадгалах шаардлагагүй тохиолдолд.

Logging driver харьцуулалт

| Driver | Хэрэглэх үед | | ----------- | ------------------------------------- | | json-file | Анхдагч, ихэнх тохиолдолд тохиромжтой | | local | json-file-аас хурдан, нягтруулсан | | syslog | Системийн log aggregation | | journald | systemd ашиглах Linux | | none | Log хадгалах шаардлагагүй | | awslogs | AWS CloudWatch | | gcplogs | Google Cloud Logging |

Docker Compose-ийн logs команд

bash
# Бүх сервисийн log
docker compose logs

# Тодорхой сервис
docker compose logs app

# Дагаж харах
docker compose logs -f

# Сүүлийн 100 мөр
docker compose logs --tail 100

# Timestamp-тай
docker compose logs -t app

Практик жишээ: алдаа олох

bash
# 1. Container зогссон уу?
docker ps -a

# 2. Зогссон container-ийн сүүлийн log
docker logs --tail 50 mycontainer

# 3. Сүүлийн цагийн log stderr-тэй
docker logs --since 1h 2>&1 mycontainer | grep -i error

# 4. Бодит цагт ажиллаж байгаа log дагах
docker logs -f mycontainer

Дараагийн хичээлд:

Docker-ийн аюулгүй байдал — root-аар ажиллуулахгүй байх, minimal image, нууц мэдээлэл зохицуулах.