原有日志方案查询日志很不方便且效率低,而且也不支持基于日志的高级操作。如:聚合,图形展示,关键字检测等。
方案接入阿里云的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 - 默认采集方式为极简模式,如需解析日志内容,建议使用日志服务控制台并参见、或进行配置。
- {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等操作。
配置如下(以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)。
优点:配置灵活,基本能满足对日志处理的全部操作。
缺点:配置文档不完整,容易踩坑。