在Docker中訪問Spring Boot日誌
- Docker
- Spring Boot
1.概述
在本教程中,我們將說明如何從本地開發到可持續的多容器解決方案訪問Docker中的Spring Boot日誌。
2.基本控制台輸出
首先,讓我們從上一篇文章構建我們的Spring Boot Docker映像:
$> mvn spring-boot:build-image
然後,當我們運行容器時,我們可以立即在控制台中看到STDOUT日誌:
$> docker run --name=demo-container docker.io/library/spring-boot-docker:0.0.1-SNAPSHOT
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.
該命令遵循類似Linux shell tail -f
命令的日誌。
application.properties
文件中添加一行來為我們的Spring Boot應用程序配置一個日誌文件追加程序:
logging.file.path=logs
然後,我們可以通過在運行容器中tail -f
$> docker exec -it demo-container tail -f /workspace/logs/spring.log > $HOME/spring.log
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.
單容器解決方案就是這樣。在下一章中,我們將學習如何分析日誌歷史記錄和組合容器的日誌輸出。
3.日誌文件的Docker卷
如果必須從主機文件系統訪問日誌文件,則必須創建一個Docker卷。
為此,我們可以使用以下命令運行應用程序容器:
$> mvn spring-boot:build-image -v /path-to-host:/workspace/logs
然後,我們可以在/path-to-host
目錄中spring.log
從上一篇有關Docker Compose的文章開始,我們可以從Docker Compose文件運行多個容器。
如果使用的是Docker Compose文件,則應添加卷配置:
network-example-service-available-to-host-on-port-1337:
image: karthequian/helloworld:latest
container_name: network-example-service-available-to-host-on-port-1337
volumes:
- /path-to-host:/workspace/logs
然後,讓我們運行文章Compose
文件:
$> docker-compose up
日誌文件位於/path-to-host
目錄中。
現在,我們已經回顧了基本的解決方案,讓我們探索更高級的docker logs
命令。
在以下各章中,我們假定將Spring Boot應用程序配置為將日誌打印到STDOUT。
4.多個容器的Docker日誌
一旦我們一次運行多個容器,我們將不再能夠從多個容器中讀取混合日誌。
我們可以在Docker Compose文檔中找到默認情況下使用json-file
日誌驅動程序設置容器的示例,該驅動程序支持docker logs
命令。
讓我們看看它如何與我們的Docker Compose示例一起工作。
首先,讓我們找到我們的容器ID:
$> docker ps
CONTAINER ID IMAGE COMMAND
877bb028a143 karthequian/helloworld:latest "/runner.sh nginx"
然後,我們可以使用docker logs -f
命令顯示容器日誌。我們可以看到,儘管使用json-file
驅動程序,輸出仍然是純文本-JSON僅在Docker內部使用:
$> docker logs -f 877bb028a143
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "
-f
選項的行為類似於tail -f
shell命令:它在生成日誌時回顯日誌。
請注意,**如果我們以Swarm模式運行容器,則應改用docker service ps
和docker service logs
**命令。
在文檔中,我們可以看到docker logs
命令支持有限的輸出選項: json-file
, local,
或journald
。
5.用於日誌聚合服務的Docker驅動程序
docker logs
命令對於即時監視特別有用:它不提供複雜的過濾器或長期統計信息。
為此, **Docker支持多個日誌聚合服務驅動程序**。在上一篇文章中研究Graylog時,我們將為此平台配置適當的驅動程序。
daemon.json
文件中的主機此配置可以是全局的。它位於Linux主機上的/etc/docker
或Windows服務器上的C:\ProgramData\docker\config
daemon.json
文件不存在,則應創建該文件:
{
"log-driver": "gelf",
"log-opts": {
"gelf-address": "udp://1.2.3.4:12201"
}
}
Graylog驅動程序稱為GELF
我們只需指定Graylog實例的IP地址即可。
我們還可以在運行單個容器時覆蓋此配置:
$> docker run \
--log-driver gelf –-log-opt gelf-address=udp://1.2.3.4:12201 \
alpine echo hello world
六,結論
在本文中,我們回顧了在Docker中訪問Spring Boot日誌的不同方法。
記錄到STDOUT使得從單個容器的執行中觀察日誌變得非常容易。
但是,如果我們想從Docker日誌記錄功能中受益,那麼使用文件追加器不是最佳選擇,因為容器與適當的服務器沒有相同的約束。