背景
原有日志方案查詢日志很不方便且效率低,而且也不支持基於日志的高級操作。如:聚合,圖形展示,關鍵字檢測等。
方案
接入阿里雲的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)。
優點:配置靈活,基本能滿足對日志處理的全部操作。
缺點:配置文檔不完整,容易踩坑。