1.1 使用 Docker 容器日志
我們可以利用 docker logs
命令查看 Docker 容器內(nèi)部應(yīng)用程序運行時所產(chǎn)生的日志,可以免除首先進(jìn)入 Docker 容器,再打開應(yīng)用程序的日志文件的過程螟深。docker logs 會監(jiān)控容器中操作系統(tǒng)的標(biāo)準(zhǔn)輸出設(shè)備(STDOUT),一旦 STDOUT 有數(shù)據(jù)產(chǎn)生辐马,就會將這些數(shù)據(jù)傳輸?shù)搅硪粋€“設(shè)備”中,該 Docker 的被稱為“日志驅(qū)動(Logging Driver)”
1.2 Docker 日志驅(qū)動
例如舞虱,我們有一個容器實例 ID 為 “da6743d61e1a” ,隨后我們使用 docker logs 命令母市,查看 da6743d61e1a 容器的日志
docker logs -f da6743d61e1a
此時矾兜,Docker 日志也在同步輸出,輸出的日志類似下面這樣患久。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.3.RELEASE)
2018-08-31 14:39:34.608 INFO 8 --- [ main] com.ctego.inventory.server.Server : Starting Server on ctego-inventory-srv-55798d4965-lfdxn with PID 8 (/var/ctego/server.jar started by root in /)
2018-08-31 14:39:34.696 DEBUG 8 --- [ main] com.ctego.inventory.server.Server : Running with Spring Boot v1.5.3.RELEASE, Spring v4.3.8.RELEASE
2018-08-31 14:39:34.697 INFO 8 --- [ main] com.ctego.inventory.server.Server : No active profile set, falling back to default profiles: default
2018-08-31 14:39:46.125 INFO 8 --- [ main] c.l.s.valid.DefaultValidConfig : 開啟參數(shù)校驗
2018-08-31 14:39:48.102 INFO 8 --- [ main] org.xnio : XNIO version 3.3.6.Final
2018-08-31 14:39:48.208 INFO 8 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.3.6.Final
2018-08-31 14:39:48.602 WARN 8 --- [ main] io.undertow.websockets.jsr : UT026009: XNIO worker was not set on WebSocketDeploymentInfo, the default worker will be used
2018-08-31 14:39:48.602 WARN 8 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2018-08-31 14:39:48.701 INFO 8 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext
Docker 是怎樣做到的呢椅寺?或者說北苟,所謂的 Docker 日志驅(qū)動占调,到底做了些什么事情?
我們使用 docker info 命令迟螺,可以看到 Docker 容器的相關(guān)信息篙挽,其中有一項 Logging Driver 的字段荆萤。
docker info | grep 'Logging Driver'
通過輸入以上命令,將得到Docker 當(dāng)前所設(shè)置的日志驅(qū)動類型:journald
Logging Driver: journald
其實铣卡,Docker 已為我們提供了大量的日志驅(qū)動類型链韭。
- none:容器不輸出任何日志;
- json-file:容器輸出的日志以 JSON 格式寫入文件中(默認(rèn))算行;
- syslog:容器輸出的日志寫入宿主機的 Syslog 中梧油;
- journald:容器輸出的日志寫入宿主機的 Journald 中苫耸;
- gelf:容器輸出到日志以 GELF(Graylog Extended Log Format)格式寫入 Graylog中州邢;
- fluentd:容器輸出的日志寫入宿主機的 Fluented 中;
- awslogs:容器輸出的日志寫入 Amazon CloudWatch Logs 中褪子;
- splunk:容器輸出的日志寫入 splunk 中量淌;
- etwlogs:容器輸出的日志寫入 ETW (Event Tracing for Windows);
- mats:容器輸出的日志寫入 NATS 服務(wù)中嫌褪;
我們可以在 docker run 命令中通過 --log-driver 參數(shù)來設(shè)置具體的 Docker 日志驅(qū)動呀枢,也可以通過 --log-opt 參數(shù)來指定對應(yīng)日志驅(qū)動的相關(guān)選項。就拿 json-file 來說笼痛,其實可以這樣啟動 Docker 容器:
docker run \
-d \
-p 80:80 \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
--name nginx \
nginx
通過 --log-opt 參數(shù)為 json-file 日志驅(qū)動添加了兩個選項裙秋,max-size=10m 表示 JSON 文件最大為 10MB(超過 10MB 就會自動生成新文件),max-file=3 表示 JSON 文件最多為3個(超過3個就會自動刪除多余的舊文件)
除了在啟動 Docker 容器時缨伊,可指定日志驅(qū)動以外摘刑,還可以通過修改 Docker 配置文件來指定日志驅(qū)動。
打開配置文件 /etc/sysconfig/docker
刻坊,找到以下配置片段:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
可以看出枷恕,默認(rèn)的日志驅(qū)動為 journald,把它修改為 syslog
--log-driver=syslog
然后重啟 docker
systemctl restart docker
本文中所使用的 docker 版本為 1.13.1
新版本的docker中谭胚,已廢棄/etc/sysconfig/docker這種配置方式徐块,轉(zhuǎn)而采用/etc/docker/daemon.json來配置
詳情請閱讀 官方文檔
以上眾多日志驅(qū)動類型中未玻,較為常用 的是 Syslog,因為 Syslog 是 Linux 的日志系統(tǒng)胡控,很多日志分析工具都可以從 Syslog 中獲取日志扳剿,比如流行的 ELK(Elasticsearch、Logstash昼激、Kibana)日志中心舞终。Logstash 用于收集日志,Syslog 中寫入的日志可轉(zhuǎn)發(fā)到 Logstash 中癣猾,隨后將日志存入 Elasticsearch 中敛劝,最后可通過 Kibana 來查詢?nèi)罩尽?br> 接下來咱們的目標(biāo)是將 Docker 容器中輸出的日志寫入 Syslog,那么后面需要做的就是將 Syslog 接入 ELK 了纷宇。
1.3 Linux 日志系統(tǒng):Syslog
默認(rèn)夸盟,Linux 操作系統(tǒng)已經(jīng)安裝了 Syslog 軟件包,但它叫 Rsyslog像捶。實際上上陕,Rsyslog 是 Syslog 標(biāo)準(zhǔn)的一種實現(xiàn),還有一種叫 Syslog-ng 的第三方實現(xiàn)拓春。雖然 Syslog-ng 的功能較為強大释簿,但我們還是選擇使用 Rsyslog,因為操作系統(tǒng)已經(jīng)預(yù)裝了硼莽,我們無須單獨安裝庶溶,可以通過以下命令查看 Rsyslog 是否已安裝。
[root@uat-k8s-master1 ~]# rsyslogd -v
rsyslogd 8.24.0, compiled with:
PLATFORM: x86_64-redhat-linux-gnu
PLATFORM (lsb_release -d):
FEATURE_REGEXP: Yes
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
memory allocator: system default
Runtime Instrumentation (slow code): No
uuid support: Yes
Number of Bits in RainerScript integers: 64
如果要開啟 Rsyslog 服務(wù)懂鸵,我們必須對 Rsyslog 進(jìn)行配置偏螺,打開文件 vi /etc/rsyslog.conf
在 rsyslog.conf 文件中有一段配置,我們需要手工去開啟
$ModLoad imtcp
$InputTcpServerRun 514
重啟 Rsyslog 服務(wù)匆光,否則配置無法生效
systemctl restart rsyslog
此時套像,我們可以查看本地是否對外開啟了 514 端口
[root@uat-k8s-master1 ~]# netstat -anpt | grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 20681/rsyslogd
tcp6 0 0 :::514