背景
原有日誌方案查詢日誌很不方便且效率低,而且也不支援基於日誌的高階操作。如:聚合,圖形展示,關鍵字檢測等。
方案
接入阿里雲的sls日誌服務。
實施
1、通過環境變數進行日誌接入
配置如下:
欄位 | 說明 | 示例 | 注意事項 |
---|---|---|---|
aliyun_logs_{key} | - 必選項。{key}只能包含小寫字母、數字和-。 - 若不存在aliyun_logs_{key}_logstore,則預設建立並採集到名為{key}的logstore。 - 當值為stdout表示採集容器的標準輸出;其他值為容器內的日誌路徑。 |
- name: aliyun_logs_catalina stdout - name: aliyun_logs_access-log /var/log/nginx/access.log |
- 預設採集方式為極簡模式,如需解析日誌內容,建議使用日誌服務控制檯並參見通過DaemonSet-控制檯方式採集Kubernetes檔案、通過DaemonSet-控制檯方式採集Kubernetes標準輸出或通過DaemonSet-CRD方式採集日誌進行配置。 - {key}需保持在K8s叢集內唯一。 |
aliyun_logs_{key}_tags | 可選。值為{tag-key}={tag-value}型別,用於對日誌進行標識。 | - name: aliyun_logs_catalina_tags app=catalina |
- |
aliyun_logs_{key}_project | 可選。值為指定的日誌服務Project。當不存在該環境變數時為您安裝時所選的Project。 | - name: aliyun_logs_catalina_project my-k8s-project |
Project需與您的Logtail工作所在Region一致。 |
aliyun_logs_{key}_logstore | 可選。值為指定的日誌服務Logstore。當不存在該環境變數時Logstore和{key}一致。 | - name: aliyun_logs_catalina_tags my-logstore |
- |
aliyun_logs_{key}_shard | 可選。值為建立Logstore時的shard數,有效值為1~10。當不存在該環境變數時值為2。 | - name: aliyun_logs_catalina_shard 4 |
- |
aliyun_logs_{key}_ttl | 可選。值為指定的日誌儲存時間,有效值為1~3650。 - 當取值為3650時,指定日誌的儲存時間為永久儲存。 - 當不存在該環境變數時,預設指定日誌的儲存時間為90天。 |
- name: aliyun_logs_catalina_ttl 3650 |
- |
aliyun_logs_{key}_machinegroup | 可選。值為應用的機器組。當不存在該環境變數時與安裝Logtail的預設機器組一致。 | - name: aliyun_logs_catalina_machinegroup my-machine-group |
- |
優點:配置簡單,不容易出現問題。
缺點:無法使用logtail的高階功能,如regex,geoip,split等操作。
2、通過CRD進行配置
配置如下(以daemon為例):
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: daemon-log
spec:
logstore: applog
project: pre-app-log
logtailConfig:
# log file's input type is 'file'
inputType: file
# logtail config name, should be same with [metadata.name]
configName: daemon-log
inputDetail:
logType: common_reg_log
advanced:
blacklist:
dir_blacklist: ["/data/logs/dump", "/data/logs/*/xxljob", "/data/logs/*/apm"]
filepath_blacklist: []
logPath: /data/logs/daemon
filePattern: "*.log"
dockerIncludeEnv:
PROJECTID: "d0"
dockerExcludeEnv: {}
dockerFile: true
logBeginRegex: '\d+-\d+-\d+\s\d+:\d+:\d+[,|\.|\s].*'
配置過程中遇到兩個問題:
1、配置通用收集配置的時候:雲上K8S收集應用日誌的時候出現了tag開頭的欄位獲取到的pod_name,container_name等都是一個ds的資訊,不是原有pod的資訊。
示例圖如下:
原因:
由於掛載的是宿主機路徑,在配置logtail配置檔案的時候應用pod的/data/logs是docker的overlayfs的路徑,只配置到這一層的話,logtail只在docker的overlayfs檔案系統中搜尋/data/logs/**/*.log,這樣無法找到我們的/data/logs/的資料夾下日誌。
當掛載了一個子目錄(用hostpath),配置的是父目錄採集(在 docker預設目錄overlayfs),在docker裡面會認為你要採集的是 overlayfs。
所以此時我們無法進行正常的日誌採集,所有的日誌都是來自於logcleanpre掛載的/data/logs內部。
解決辦法:
i、修改我們的掛載方式:宿主機上的/var/lib/docker/logs/掛載到/data/logs,logcleanpre也需要改造。
ii、每個應用pod配置一個logtail的CRD配置。(目前通過這種方式處理)
2、增加logBeginRegex或者regex,會導致頁面重新整理有告警。但是在控制檯操作的時候正則驗證和解析都是正常的而且日誌也是按照正則正確的收集進來的。
示例圖如下:
問題已被阿里雲收錄,但是暫未解決(2020.10.23)。
優點:配置靈活,基本能滿足對日誌處理的全部操作。
缺點:配置文件不完整,容易踩坑。