mirror of https://github.com/loggie-io/docs.git
				
				
				
			
							parent
							
								
									bf3910fc6f
								
							
						
					
					
						commit
						8df0093942
					
				|  | @ -0,0 +1,67 @@ | |||
| # Copyright (c) 2016-2021 Martin Donath <martin.donath@squidfunk.com> | ||||
| 
 | ||||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| # of this software and associated documentation files (the "Software"), to | ||||
| # deal in the Software without restriction, including without limitation the | ||||
| # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||||
| # sell copies of the Software, and to permit persons to whom the Software is | ||||
| # furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| # The above copyright notice and this permission notice shall be included in | ||||
| # all copies or substantial portions of the Software. | ||||
| 
 | ||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE | ||||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||||
| # IN THE SOFTWARE. | ||||
| 
 | ||||
| # ----------------------------------------------------------------------------- | ||||
| # Node, TypeScript, Python | ||||
| # ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| # Dependencies | ||||
| /node_modules | ||||
| /__pycache__ | ||||
| /venv | ||||
| /.venv | ||||
| 
 | ||||
| # Build files | ||||
| /build | ||||
| /MANIFEST | ||||
| /site | ||||
| 
 | ||||
| # Distribution files | ||||
| /dist | ||||
| /mkdocs_material.egg-info | ||||
| 
 | ||||
| # Caches and logs | ||||
| *.cpuprofile | ||||
| *.log | ||||
| *.tsbuildinfo | ||||
| .cache | ||||
| .eslintcache | ||||
| 
 | ||||
| # ----------------------------------------------------------------------------- | ||||
| # General | ||||
| # ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| # Never ignore .gitkeep files | ||||
| !**/.gitkeep | ||||
| 
 | ||||
| # Husky hooks | ||||
| .husky/.gitignore | ||||
| .husky/_ | ||||
| 
 | ||||
| # macOS internals | ||||
| .DS_Store | ||||
| 
 | ||||
| # Temporary files | ||||
| TODO | ||||
| tmp | ||||
| 
 | ||||
| # IDEs | ||||
| .vscode | ||||
| .idea | ||||
|  | @ -0,0 +1,83 @@ | |||
| # 版本和Release发布流程 | ||||
| 
 | ||||
| ## 版本发布涉及工程 | ||||
| - Loggie 主工程 | ||||
| - Loggie-installation 部署脚本工程 | ||||
| - Loggie docs 文档项目(暂时为最新的版本文档,后续会支持多版本) | ||||
| 
 | ||||
| ## 代码分支策略 | ||||
| - 版本参考[Semantic语义](https://semver.org/) | ||||
| - 使用main主分支为开发分支,日常所有代码PR均合入main分支 | ||||
| - 新版本使用release分支,格式为`release-vA.B`,例如`release-v1.1`,这里只使用版本前两位 | ||||
| - 基于release分支打上tag表示具体版本,例如`v1.1.0` | ||||
| - bugfix 除了肯定会合入main分支外,根据严重情况cherry-pick至具体的release分支,同时打上tag,需要升级最小版本,例如`v1.1.1` | ||||
| 
 | ||||
| ## 发布新版本步骤 | ||||
| 
 | ||||
| #### 1. 创建新的release分支 | ||||
| 
 | ||||
| 确认版本需要的所有功能已经合入,main分支为最新提交: | ||||
| 
 | ||||
| ``` bash | ||||
| git checkout main | ||||
| git pull upstream main -r | ||||
| ``` | ||||
| 
 | ||||
| 基于main分支创建新的release分支,例如`release-v1.1`: | ||||
| ```bash | ||||
| git checkout -b release-v${A.B} | ||||
| ``` | ||||
| 
 | ||||
| #### 2. 填写CHANGELOG | ||||
| 基于该分支填写CHANGELOG,提交至工程中合入 | ||||
| 
 | ||||
| ```bash | ||||
| git add . | ||||
| git commit -m'Release: add v${A.B.C} changelog' | ||||
| git push upstream release-v${A.B.C} | ||||
| ``` | ||||
| 
 | ||||
| #### 3. release Loggie-installation | ||||
| release Loggie-installationation部署脚本工程,和上述1,2步骤相同 | ||||
| 
 | ||||
| 请注意: | ||||
| 
 | ||||
| - 请勿忘记修改Chart.yaml中的版本号 | ||||
| 
 | ||||
| #### 4. 回归测试 | ||||
| 基于release分支进行回归测试。   | ||||
| release分支push至Github后,会触发action进行镜像构建,使用该镜像进行回归测试。   | ||||
| 这里的测试会使用loggie-installationation部署脚本里相应的release分支,同时回归验证部署脚本正确性。   | ||||
| 如果测试发现Bug,提交PR合入release分支,重新进行回归。   | ||||
| 
 | ||||
| #### 5. 打上版本tag | ||||
| 
 | ||||
| 测试通过后,基于该release分支打上相应的版本tag,比如`v1.1.0` | ||||
| ```bash | ||||
| git pull upstream release-v${A.B.C} | ||||
| git tag v${A.B.C} | ||||
| git push v${A.B.C} | ||||
| ``` | ||||
| 注意Loggie工程和Loggie-installationation部署脚本均需要。 | ||||
| 
 | ||||
| #### 6. 在Github上发布release | ||||
| 
 | ||||
| - Loggie工程复制项目中的CHANGELOG即可 | ||||
| - Loggie installation工程需要提供`loggie-linux-amd64`二进制和`loggie-v${A.B.C}.tgz` helm chart包。 | ||||
|   - 二进制需要找台linux amd64机器进行`make build` | ||||
|   - helm chart包需要基于对应版本的loggie installation项目,执行`helm package ./helm-chart`即可。 | ||||
| 
 | ||||
| #### 7. 更新Loggie docs文档 | ||||
| 
 | ||||
| - 更新Loggie docs文档,并提PR合入 | ||||
| - 注意修改Loggie镜像和版本号等 | ||||
| 
 | ||||
| 
 | ||||
| #### 8. 将release分支合入main | ||||
| 提PR将release分支合入main,可等稳定一段时间后再合入,注意Loggie工程和Loggie-installation部署脚本均需要。 | ||||
| 
 | ||||
| 
 | ||||
| ## 有BugFix时 | ||||
| 
 | ||||
| - 如果是不重要的bug,基于main分支提交修改即可,可以不合入release分支 | ||||
| - 如果为重要的bug,需要修复,确定需要修复的版本release分支(可为最近一个或者多个),除了提交至main分支外,还需要cherry-pick至指定release分支,同时打上tag,新增最小版本号,同时需要确认Loggie-installation和docs是否同步修改。 | ||||
|  | @ -10,7 +10,7 @@ | |||
| ### 下载helm-chart包 | ||||
| 
 | ||||
| ```bash | ||||
| helm pull https://github.com/loggie-io/installation/releases/download/v1.1.0/loggie-v1.1.0.tgz && tar xvzf loggie-v1.1.0.tgz | ||||
| helm pull https://github.com/loggie-io/installation/releases/download/v1.2.0/loggie-v1.2.0.tgz && tar xvzf loggie-v1.2.0.tgz | ||||
| ``` | ||||
| 
 | ||||
| ### 修改配置 | ||||
|  | @ -25,7 +25,7 @@ cd installation/helm-chart | |||
| 
 | ||||
| #### 镜像 | ||||
| ```yaml | ||||
| image: hub.c.163.com/loggie/loggie:v1.1.0 | ||||
| image: hub.c.163.com/loggie/loggie:v1.2.0 | ||||
| ``` | ||||
| loggie的镜像。 | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ Loggie使用Golang编译成二进制,可根据自身需求对接各类部署 | |||
| ## 下载二进制 | ||||
| 
 | ||||
| ``` | ||||
| mkdir /opt/loggie && curl https://github.com/loggie-io/installation/releases/download/v1.1.0/loggie-linux-amd64 -o /opt/loggie/loggie && chmod +x /opt/loggie/loggie | ||||
| mkdir /opt/loggie && curl https://github.com/loggie-io/installation/releases/download/v1.2.0/loggie-linux-amd64 -o /opt/loggie/loggie && chmod +x /opt/loggie/loggie | ||||
| ``` | ||||
| 
 | ||||
| ## 添加配置文件 | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ | |||
| #### 下载chart再部署 | ||||
| 
 | ||||
| ```bash | ||||
| helm pull https://github.com/loggie-io/installation/releases/download/v1.1.0/loggie-v1.1.0.tgz && tar xvzf loggie-v1.1.0.tgz | ||||
| helm pull https://github.com/loggie-io/installation/releases/download/v1.2.0/loggie-v1.2.0.tgz && tar xvzf loggie-v1.2.0.tgz | ||||
| ``` | ||||
| 尝试修改一下其中的values.yaml。 | ||||
| 
 | ||||
|  | @ -40,7 +40,7 @@ helm install loggie ./loggie -nloggie --create-namespace | |||
| #### 直接部署: | ||||
| 
 | ||||
| ```bash | ||||
| helm install loggie -nloggie --create-namespace https://github.com/loggie-io/installation/releases/download/v1.1.0/loggie-v1.1.0.tgz | ||||
| helm install loggie -nloggie --create-namespace https://github.com/loggie-io/installation/releases/download/v1.2.0/loggie-v1.2.0.tgz | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
|  | @ -107,6 +107,35 @@ spec: | |||
| EOF | ||||
| ``` | ||||
| 
 | ||||
| 可以看到,上面使用了sinkRef引用了刚才创建的`sink default CR`。当然,我们还可以直接在Logconfig中使用sink字段,示例如下: | ||||
| 
 | ||||
| ```yaml | ||||
| cat << EOF | kubectl apply -f - | ||||
| apiVersion: loggie.io/v1beta1 | ||||
| kind: LogConfig | ||||
| metadata: | ||||
|   name: nginx | ||||
|   namespace: default | ||||
| spec: | ||||
|   selector: | ||||
|     type: pod | ||||
|     labelSelector: | ||||
|       app: nginx | ||||
|   pipeline: | ||||
|     sources: | | ||||
|       - type: file | ||||
|         name: mylog | ||||
|         paths: | ||||
|         - stdout | ||||
|     sink: | | ||||
|       type: dev | ||||
|       printEvents: true | ||||
|       codec: | ||||
|         type: json | ||||
|         pretty: true | ||||
| EOF | ||||
| ``` | ||||
| 
 | ||||
| 创建完之后,我们可以使用`kubectl get lgc`查看到创建的CRD实例。 | ||||
| 
 | ||||
| 同时,我们还可以通过`kubectl describe lgc nginx`查看LogConfig的事件,以获取最新的状态。 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| ### 1. 下载可执行文件 | ||||
| 请找一台Linux服务器节点,下载Loggie二进制可执行文件 | ||||
| ```shell | ||||
| curl -LJ https://github.com/loggie-io/installation/releases/download/v1.1.0/loggie-linux-amd64 -o loggie | ||||
| curl -LJ https://github.com/loggie-io/installation/releases/download/v1.2.0/loggie-linux-amd64 -o loggie | ||||
| ``` | ||||
| ### 2. 添加配置文件 | ||||
| 
 | ||||
|  |  | |||
|  | @ -107,9 +107,10 @@ namespace级别CRD,表示一个日志采集任务,用于采集Pod容器日 | |||
| | containerName | string  |    非必填    |      | 表示指定采集的容器名称,建议在Pod里包含多个容器时填写 | | ||||
| | excludeContainerPatterns | string数组  |    非必填    |      | 排除的容器名称,使用正则表达式形式 | | ||||
| | matchFields |   |    非必填    |      | 将Pod中的信息加入到Fields中  | | ||||
| | matchFields.labelKey | string数组  |    非必填    |      | 指定增加的Pod上的Label Key值,比如Pod上包含Label: `app: demo`,此处填写`labelKey: app`,此时会将Pod上的`app: demo` label增加到file source fields中,采集到的日志会被加上该label信息。适用于匹配的Pod的label存在不一致的场景。 | | ||||
| | matchFields.annotationKey | string数组  |    非必填    |      | 和上面labelKey类似,注入的为Pod Annoatation的值 | | ||||
| | matchFields.env | string数组  |    非必填    |      | 和上面labelKey类似,注入的为Pod Env环境变量的值 | | ||||
| | matchFields.labelKey | string数组  |    非必填    |      | 指定增加的Pod上的Label Key值,比如Pod上包含Label: `app: demo`,此处填写`labelKey: app`,此时会将Pod上的`app: demo` label增加到file source fields中,采集到的日志会被加上该label信息。适用于匹配的Pod的label存在不一致的场景。支持配置为"*"的方式获取所有的label | | ||||
| | matchFields.annotationKey | string数组  |    非必填    |      | 和上面labelKey类似,注入的为Pod Annoatation的值,支持配置为"*"的方式获取所有的annotation | | ||||
| | matchFields.env | string数组  |    非必填    |      | 和上面labelKey类似,注入的为Pod Env环境变量的值,支持配置为"*"的方式获取所有的env | | ||||
| 
 | ||||
| 
 | ||||
| !!! example | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
| ## 日志参数:   | ||||
| 
 | ||||
| - `-log.level`: 日志级别,默认为info,可配置为debug、info、warn和error | ||||
| - `-log.jsonFormat`: 是否将日志输出为json格式,默认为true | ||||
| - `-log.jsonFormat`: 是否将日志输出为json格式,默认为false | ||||
| - `-log.enableStdout`: 是否输出标准输出日志,默认为true | ||||
| - `-log.enableFile`: 是否输出日志文件,默认为false,即不输出日志文件,默认打印到标准输出 | ||||
| - `-log.directory`: 日志文件的路径,默认为/var/log,当log.enableFile=true时生效 | ||||
|  | @ -23,6 +23,7 @@ | |||
| - `-log.maxBackups`: 日志轮转最多保留的文件个数,默认为3 | ||||
| - `-log.maxAge`: 日志轮转最大保留的天数,默认为7 | ||||
| - `-log.timeFormat`: 每行日志输出的时间格式,默认格式为`2006-01-02 15:04:05` | ||||
| - `-log.noColor`: 输出是否有颜色美化,默认为false,即有颜色美化,对于从标准输出查看日志比较方便。如果输出到日志文件中,建议设置为true,避免引入额外的格式。 | ||||
| 
 | ||||
| !!! info | ||||
|     Loggie的日志轮转使用[lumberjack](`https://github.com/natefinch/lumberjack`)库 | ||||
|  |  | |||
|  | @ -8,12 +8,13 @@ | |||
|       enabled: true | ||||
|       kubernetes: | ||||
|         cluster: aggregator | ||||
|         fields: | ||||
|           container.name: containername | ||||
|           logConfig: logconfig | ||||
|           namespace: namespace | ||||
|           node.name: nodename | ||||
|           pod.name: podname | ||||
|         containerRuntime: containerd | ||||
|         k8sFields:  | ||||
|           logconfig: "${_k8s.logconfig}" | ||||
|           namespace: "${_k8s.pod.namespace}" | ||||
|           nodename: "${_k8s.node.name}" | ||||
|           podname: "${_k8s.pod.name}" | ||||
|           containername: "${_k8s.pod.container.name}" | ||||
| 
 | ||||
|     ``` | ||||
| 
 | ||||
|  | @ -32,14 +33,21 @@ | |||
| | kubeconfig | string  |    非必填    |     |  指定请求Kubernetes集群API的kubeconfig文件。通常在Loggie部署到Kubernetes集群中无需填写,此时为inCluster模式。如果Loggie部署在Kubernetes集群外(例如本地调试时),需要指定该kubeconfig文件。 | | ||||
| | master | string  |    非必填    |     | 指定请求Kubernetes集群API的master地址,inCluster模式一般无需填写 | | ||||
| | containerRuntime | string  |    非必填    |  docker   | 容器运行时,可选`docker`和`containerd` | | ||||
| | dockerDataRoot | string  |    非必填    |  /var/lib/docker   | docker的rootfs路径 | | ||||
| | rootFsCollectionEnabled | bool  |    非必填    |  false   | 是否开启采集root filesystem里的日志,用于不挂载日志volume的场景 | | ||||
| | parseStdout | bool  |    非必填    |  false   | 是否开启自动提取容器标准输出原始内容 | | ||||
| | kubeletRootDir | string  |    非必填    |  /var/lib/kubelet   | kubelet的root路径 | | ||||
| | podLogDirPrefix | string  |    非必填    |  /var/log/pods   | kubernetes默认放置的pod标准输出路径 | | ||||
| | fields | map  |    非必填    |    | 自动添加的元信息 | | ||||
| | fields.node.name | string  |    非必填    |  node.name  | 添加所在节点node name作为元信息,同时使用该值为key | | ||||
| | fields.node.ip | string  |    非必填    |  node.ip  | 添加所在节点node ip作为元信息,同时使用该值为key | | ||||
| | fields.namespace | string  |    非必填    |  namespace  | 添加namespace作为元信息,同时使用该值为key | | ||||
| | fields.pod.name | string  |    非必填    |  pod.name  | 添加pod name作为元信息,同时使用该值为key | | ||||
| | fields.pod.ip | string  |    非必填    |  pod.ip  | 添加pod ip作为元信息,同时使用该值为key | | ||||
| | fields.container.name | string  |    非必填    |  container.name  | 添加container name作为元信息,同时使用该值为key | | ||||
| | fields.logConfig | string  |    非必填    |  logConfig  | 添加logConfig name作为元信息,同时使用该值为key | | ||||
| | k8sFields | map  |    非必填    |    | 自动添加的kubernetes相关元信息,key即为添加的元信息key,value请使用${_k8s.XX}的方式指定 | | ||||
| 
 | ||||
| 
 | ||||
| "${_k8s.XX}"的方式可填写以下参数: | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | ${_k8s.node.name} | string  |    非必填    |  node.name  | 添加所在节点node name作为元信息 | | ||||
| | ${_k8s.node.ip} | string  |    非必填    |  node.ip  | 添加所在节点node ip作为元信息 | | ||||
| | ${_k8s.pod.namespace} | string  |    非必填    |  namespace  | 添加namespace作为元信息 | | ||||
| | ${_k8s.logconfig}| string  |    非必填    |  logConfig  | 添加logConfig name作为元信息 | | ||||
| | ${_k8s.pod.name} | string  |    非必填    |  pod.name  | 添加pod name作为元信息 | | ||||
| | ${_k8s.pod.ip} | string  |    非必填    |  pod.ip  | 添加pod ip作为元信息 | | ||||
| | ${_k8s.pod.container.name} | string  |    非必填    |  container.name  | 添加container name作为元信息 | | ||||
|  | @ -0,0 +1,35 @@ | |||
| # sys listener | ||||
| 
 | ||||
| Loggie本身的CPU和Memory指标 | ||||
| 
 | ||||
| ## 配置 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | period | time.Duration  |    非必填    |   10s   |  listener消费处理数据的时间间隔 | | ||||
| 
 | ||||
| 
 | ||||
| ## Metrics | ||||
| 
 | ||||
| #### cpu_percent | ||||
| 
 | ||||
| ``` | ||||
| # HELP loggie_sys_cpu_percent Loggie cpu percent | ||||
| # TYPE loggie_sys_cpu_percent gauge | ||||
| loggie_sys_cpu_percent 0.37 | ||||
| ``` | ||||
| 
 | ||||
| * HELP: Loggie的cpu使用率 | ||||
| * TYPE: gauge | ||||
| 
 | ||||
| 
 | ||||
| #### mem_rss | ||||
| 
 | ||||
| ``` | ||||
| # HELP loggie_sys_mem_rss Loggie memory rss bytes | ||||
| # TYPE loggie_sys_mem_rss gauge | ||||
| loggie_sys_mem_rss 2.5853952e+07 | ||||
| ``` | ||||
| 
 | ||||
| * HELP: Loggie的内存占用字节数 | ||||
| * TYPE: gauge | ||||
| 
 | ||||
|  | @ -1,12 +1,12 @@ | |||
| # addK8sMeta | ||||
| 
 | ||||
| 用于从event中的某些字段(比如日志文件的路径中),提取到: | ||||
| 用于从event中的某些字段(比如日志文件的路径中),获取到: | ||||
| 
 | ||||
| - `pod.uid` | ||||
| - `namespace`与`pod.name` | ||||
| - `container.id` | ||||
| 
 | ||||
| 以上3种任意其一,此时Loggie可索引到具体的Pod信息,并添加`${node.name}`、`${namespace}`、`${pod.uid}`、`${pod.name}`等元信息作加入到event中,用于后续的分析处理。   | ||||
| 以上3种任意其一的索引信息,此时Loggie可根据该索引查询到具体的Pod,并添加额外的kubernetes`${node.name}`、`${namespace}`、`${pod.uid}`、`${pod.name}`等元信息作加入到event中,用于后续的分析处理。   | ||||
| 属于source interceptor。 | ||||
| 
 | ||||
| !!! example | ||||
|  | @ -21,12 +21,6 @@ | |||
|         podname: "${pod.name}" | ||||
|     ``` | ||||
| 
 | ||||
| ## patternFields | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | patternFields | string  |    非必填    |  默认会从event中获取系统字段里的filename    | 用于提取的字段 | | ||||
| 
 | ||||
| ## pattern | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
|  | @ -43,6 +37,12 @@ | |||
| 
 | ||||
| 比如:`/var/log/${pod.uid}/${pod.name}/` | ||||
| 
 | ||||
| ## patternFields | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | patternFields | string  |    非必填    |  默认会从event中获取系统字段里的filename,此时需要使用file source    | 从event中用于提取的pattern的字段 | | ||||
| 
 | ||||
| ## fieldsName | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
|  | @ -57,7 +57,10 @@ | |||
| 
 | ||||
| 目前支持添加的元信息字段有: | ||||
| 
 | ||||
| - `${cluster}`:集群信息,为系统配置中`discovery.kubernetes.cluster`字段。 | ||||
| - `${node.name}` | ||||
| - `${namespace}` | ||||
| - `${workload.kind}`:Deployment/StatefulSet/DaemonSet/Job等 | ||||
| - `${workload.name}`:工作负载的名称 | ||||
| - `${pod.uid}` | ||||
| - `${pod.name}` | ||||
|  | @ -55,6 +55,7 @@ | |||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | regex.pattern | string  |    必填    |  无    | 正则解析规则 | | ||||
| | regex.target | string  |    非必填    |  body    | 正则解析的目标字段 | | ||||
| | regex.ignoreError | bool  |    非必填    |  false    | 是否忽略错误 | | ||||
| 
 | ||||
| !!! example | ||||
|     ```yaml | ||||
|  | @ -88,6 +89,8 @@ | |||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | jsonDecode.target | string  |    非必填    |  body    | json decode的目标字段 | | ||||
| | jsonDecode.ignoreError | bool  |    非必填    |  false    | 是否忽略错误 | | ||||
| 
 | ||||
| 
 | ||||
| !!! example | ||||
|     ```yaml | ||||
|  | @ -107,6 +110,7 @@ | |||
| | split.separator | string  |    必填    |  无    | 分隔符 | | ||||
| | split.max | int  |    非必填    |  -1    | 通过分割符分割后得到的最多的字段数 | | ||||
| | split.keys | string数组  |    必填    |  无   | 分割后字段对应的key | | ||||
| | split.ignoreError | bool  |    非必填    |  false    | 是否忽略错误 | | ||||
| 
 | ||||
| !!! example | ||||
|     === "base" | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ | |||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | codec |   |    非必填    |    | sink发送数据给下游时,数据使用的格式 | | ||||
| | codec.type | string  |    非必填    |   json | 使用json格式发送 | | ||||
| | codec.type | string  |    非必填    |   json | codec类型 | | ||||
| 
 | ||||
| #### type: json | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,61 @@ | |||
| # sls | ||||
| 
 | ||||
| sls sink用于将日志发送至阿里云SLS存储。   | ||||
| 
 | ||||
| !!! example | ||||
| 
 | ||||
|     ```yaml | ||||
|     sink: | ||||
|       type: sls | ||||
|       name: demo | ||||
|       endpoint: cn-hangzhou.log.aliyuncs.com | ||||
|       accessKeyId: ${id} | ||||
|       accessKeySecret: ${secret} | ||||
|       project: test | ||||
|       logstore: test1 | ||||
|       topic: myservice | ||||
|     ``` | ||||
| 
 | ||||
| ## endpoint | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | endpoint | string  |    必填    |      | sls存储的访问域名 | | ||||
| 
 | ||||
| 你可以在具体project页面的项目概览中查看到。 | ||||
| 
 | ||||
| ## accessKeyId | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | accessKeyId | string  |    必填    |      | 访问的accessKeyId,请查看阿里云账号的访问凭证管理 | | ||||
| 
 | ||||
| 建议使用阿里云的子账号,子账号需要有对应project、logstore的权限。 | ||||
| 
 | ||||
| ## accessKeySecret | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | accessKeySecret | string  |    必填    |      | 访问的accessKeySecret,请查看阿里云账号的访问凭证管理 | | ||||
| 
 | ||||
| ## project | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | project | string  |    必填    |      | SLS存储的project名称 | | ||||
| 
 | ||||
| ## logstore | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | logstore | string  |    必填    |      | SLS存储的logstore名称 | | ||||
| 
 | ||||
| ## topic | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | topic | string  |    非必填    |      | 日志主题(Topic)是日志服务的基础管理单元。您可在采集日志时指定Topic,用于区分日志  | | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -108,3 +108,77 @@ sources字段为数组,一个Pipeline中可填写多个source组件配置。 | |||
|     } | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ### codec | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | codec |   |    非必填    |    | source接收到数据的时候用于解析预处理 | | ||||
| | codec.type | string  |    非必填    |   无 |  | | ||||
| 
 | ||||
| 请注意:目前仅`file source`支持source codec。 | ||||
| 
 | ||||
| #### type: json | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | codec.bodyFields |   |    必填    |    | 使用解析读取到的json数据中的该字段作为`body` | | ||||
| 
 | ||||
| 配置示例: | ||||
| !!! example "type: json" | ||||
| 
 | ||||
|     ```yaml | ||||
|       sources: | ||||
|       - type: file | ||||
|         name: nginx | ||||
|         paths: | ||||
|         - /var/log/*.log | ||||
|         codec: | ||||
|           type: json | ||||
|           bodyFields: log | ||||
|     ``` | ||||
| 
 | ||||
| 如果采集到的日志为: | ||||
| ```json | ||||
| {"log":"I0610 08:29:07.698664 Waiting for caches to sync\n", "stream":"stderr", "time:"2021-06-10T08:29:07.698731204Z"} | ||||
| ``` | ||||
| 则codec后得到的event为: | ||||
| ``` | ||||
| body: "I0610 08:29:07.698664 Waiting for caches to sync" | ||||
| ``` | ||||
| 
 | ||||
| 请注意:目前非bodyFields的字段均会被丢弃。 | ||||
| 
 | ||||
| 
 | ||||
| #### type: regex | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | codec.pattern |   |    必填    |    | 正则表达式 | | ||||
| | codec.bodyFields |   |    必填    |    | 使用正则提取到的该字段作为`body` | | ||||
| 
 | ||||
| 配置示例: | ||||
| !!! example "type: regex" | ||||
| 
 | ||||
|     ```yaml | ||||
|       sources: | ||||
|       - type: file | ||||
|         name: nginx | ||||
|         paths: | ||||
|         - /var/log/*.log | ||||
|         codec: | ||||
|           type: regex | ||||
|           pattern: ^(?P<time>[^ ^Z]+Z) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) (?P<log>.*)$ | ||||
|           bodyFields: log | ||||
|     ``` | ||||
| 
 | ||||
| 如果采集到的日志为: | ||||
| ``` | ||||
| 2021-12-01T03:13:58.298476921Z stderr F INFO [main] Starting service [Catalina] | ||||
| ``` | ||||
| 则codec后得到的event为: | ||||
| ``` | ||||
| body: "INFO [main] Starting service [Catalina]" | ||||
| ``` | ||||
| 
 | ||||
| 请注意:目前非bodyFields的字段均会被丢弃。 | ||||
|  | @ -35,3 +35,25 @@ | |||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | toJson | bool  |    非必填    |  false   | 是否将抓取到的prometheus原生指标,转换成JSON格式 | | ||||
| 
 | ||||
| ## labels | ||||
| 
 | ||||
| |    `字段`   |    `类型`    |  `是否必填`  |  `默认值`  |  `含义`  | | ||||
| | ---------- | ----------- | ----------- | --------- | -------- | | ||||
| | labels | map  |    非必填    |     | 给所有metrics指标增加额外的label | | ||||
| 
 | ||||
| labels支持配置${_env.XX}的方式获取环境变量。 | ||||
| 例如,配置: | ||||
| !!! example "labels" | ||||
| 
 | ||||
|     ```yaml | ||||
|         sources: | ||||
|         - type: prometheusExporter | ||||
|           name: metric | ||||
|           endpoints: | ||||
|           - "http://127.0.0.1:9196/metrics" | ||||
|           labels: | ||||
|             svc: ${_env.SVC} | ||||
|      | ||||
|     ``` | ||||
| 假设环境变量SVC=test,会将所有的metrics加上svc=test的label。 | ||||
|  | @ -25,6 +25,9 @@ | |||
| 这种结构化的数据,存储的时候便于过滤查询,或者根据日志里的时间来排序,而不是采集的时间戳,或者根据日志级别进行一些过滤,可以方便查询到ERROR级别的日志等等。   | ||||
| 当然不仅仅是像以上tomcat的运维类日志,还有诸如业务的一些订单等等日志,都有类似的需求和使用场景。   | ||||
| 
 | ||||
| !!! caution "关于stdout日志的解析提取" | ||||
|     以下示例仅提供日志切分处理的参考思路,如果你需要提取容器标准输出的原始日志,请参考[采集容器日志](../use-in-kubernetes/collect-container-logs.md#_5)。 | ||||
| 
 | ||||
| ## 功能 | ||||
| 目前已经支持的功能有: | ||||
| 
 | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 127 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 35 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 262 KiB | 
|  | @ -0,0 +1,115 @@ | |||
| # 使用阿里云SLS日志存储 | ||||
| 
 | ||||
| 不管你的服务部署在阿里云还是使用混合云的架构,Loggie同样支持采集日志数据至阿里云SLS日志存储。 | ||||
| 而你只需要使用`sls sink`即可。 | ||||
| 
 | ||||
| 
 | ||||
| ## 准备:创建SLS日志存储Project | ||||
| 
 | ||||
| 为了使用阿里云SLS日志存储,我们需要先创建一个对应的Project。 | ||||
| 如下所示,在阿里云SLS页面中,点击`创建Project`,填入project名称和对应的地域,创建完之后同步创建相应的Logstore。 | ||||
|  | ||||
| 
 | ||||
| 然后我们可以准备一下`sls sink`的配置,示例如下所示,具体可参考[sls sink 配置参数](../../reference/pipelines/sink/sls.md): | ||||
| 
 | ||||
| !!! example "sls sink" | ||||
| 
 | ||||
|     ```yaml | ||||
|         sink: | ||||
|           type: sls | ||||
|           name: demo | ||||
|           endpoint: cn-hangzhou.log.aliyuncs.com | ||||
|           accessKeyId: xxxx | ||||
|           accessKeySecret: xxxx | ||||
|           project: test | ||||
|           logstore: test1 | ||||
|           topic: myservice | ||||
|     ``` | ||||
| 
 | ||||
| ## 采集ECS上的日志 | ||||
| 
 | ||||
| 参考[主机部署](../../getting-started/install/node.md)的方式,我们可以修改pipeline.yml,加上sls sink的配置即可。 | ||||
| 
 | ||||
| Pipeline配置参考示例如下: | ||||
| 
 | ||||
| !!! example "sls pipeline" | ||||
| 
 | ||||
|     ```yaml | ||||
|     pipelines: | ||||
|       - name: test | ||||
|         sources: | ||||
|           - type: file | ||||
|             name: demo | ||||
|             addonMeta: true | ||||
|             paths: | ||||
|               - /tmp/log/*.log | ||||
|         sink: | ||||
|           type: sls | ||||
|           endpoint: cn-hangzhou.log.aliyuncs.com | ||||
|           accessKeyId: ${accessKeyId} | ||||
|           accessKeySecret: ${accessKeySecret} | ||||
|           project: loggietest | ||||
|           logstore: demo1 | ||||
|           topic: myservice | ||||
|     ``` | ||||
| 
 | ||||
| ## 采集ACK Kubernetes集群的日志 | ||||
| 
 | ||||
| 和自建Kubernetes集群一样,Loggie同样可以部署在阿里云ACK的Kubernetes集群中。 | ||||
| 我们可以根据ACK提供的kubeconfig文件,使用kubectl或者helm来部署。可参考[Kubernetes部署](../../getting-started/install/kubernetes.md)。 | ||||
| 
 | ||||
| 请注意: | ||||
| 
 | ||||
| - 如果希望采集未挂载emptyDir/hostPath的Pod日志,请确保values.yaml里系统配置中`discovery.kubernetes.rootFsCollectionEnabled`设置为true。 | ||||
| - 配置`discovery.kubernetes.containerRuntime`为匹配的Kubernetes集群的容器运行时,默认配置为containerd。 | ||||
| 
 | ||||
| 部署完之后,和常规的Kubernetes集群下的使用姿势类似,同样可以使用ClusterLogConfig/LogConfig/Interceptor/Sink CR的方式。 | ||||
| 
 | ||||
| ACK提供了CRD的使用页面,我们可以直接在该页面中进行创建和修改。 | ||||
|  | ||||
| 
 | ||||
| 采集某个服务的日志示例参考如下,只需使用`sls sink`即可。当然也可以使用单独创建一个sink CR存储`sls sink`配置,在LogConfig中通过sinkRef引用。 | ||||
| 
 | ||||
| !!! example "logconfig" | ||||
| 
 | ||||
|     ```yaml | ||||
|     apiVersion: loggie.io/v1beta1 | ||||
|     kind: LogConfig | ||||
|     metadata: | ||||
|       name: tomcat | ||||
|       namespace: default | ||||
|     spec: | ||||
|       selector: | ||||
|         labelSelector: | ||||
|           app: tomcat | ||||
|         type: pod | ||||
|      | ||||
|       pipeline: | ||||
|         sources: | | ||||
|           - type: file | ||||
|             name: stdout | ||||
|             paths: | ||||
|               - stdout | ||||
|           - type: file | ||||
|             name: access | ||||
|             ignoreOlder: 3d | ||||
|             paths: | ||||
|               - /usr/local/tomcat/logs/*.log | ||||
|      | ||||
|         sink: | | ||||
|           type: sls | ||||
|           endpoint: cn-hangzhou.log.aliyuncs.com | ||||
|           accessKeyId: ${accessKeyId} | ||||
|           accessKeySecret: ${accessKeySecret}  | ||||
|           project: loggietest | ||||
|           logstore: demo1 | ||||
|           topic: myservice | ||||
|     ``` | ||||
| 
 | ||||
| ## 查看日志 | ||||
| 
 | ||||
| 我们可以在SLS具体的Project中查看采集的日志,如下图所示: | ||||
|  | ||||
| 
 | ||||
| 具体的元信息的添加和日志字段修改,可参考[日志切分处理](../best-practice/log-process.md)以及[日志增加元信息](../best-practice/log-enrich.md)。 | ||||
| 
 | ||||
|  | @ -301,7 +301,102 @@ Events: | |||
| 
 | ||||
| 发送成功后,我们可以在Kibana上查询到采集到的日志。   | ||||
| 
 | ||||
| 
 | ||||
| ## 自动解析容器标准输出原始日志 | ||||
| 
 | ||||
| 正常情况下,我们采集到的标准输出并不是打印的日志内容,而是被容器运行时增加了一层封装。   | ||||
| 
 | ||||
| 例如docker的标准输出为json形式: | ||||
| ```json | ||||
| {"log":"I0610 08:29:07.698664 Waiting for caches to sync\n", "stream":"stderr", "time:"2021-06-10T08:29:07.698731204Z"} | ||||
| ``` | ||||
| 业务打印的原始日志内容存储在log字段里。 | ||||
| 
 | ||||
| containerd的标准输出形式类似如下: | ||||
| ``` | ||||
| 2021-12-01T03:13:58.298476921Z stderr F INFO [main] Starting service [Catalina] | ||||
| ``` | ||||
| 前面`2021-12-01T03:13:58.298476921Z stderr F `为运行时增加的前缀内容,后面则为原始的日志。 | ||||
| 
 | ||||
| 特别是如果我们配置了日志采集多行配置,因为采集到的日志内容和业务输出的日志不一致,会导致采集标准输出日志匹配多行有问题。 | ||||
| 
 | ||||
| 所以,Loggie提供了一键开关配置,在系统配置中,将`parseStdout`参数设置为true即可。 | ||||
| 
 | ||||
| !!! example "parseStdout" | ||||
| 
 | ||||
|     ```yaml | ||||
|     config: | ||||
|       loggie: | ||||
|         discovery: | ||||
|           enabled: true | ||||
|           kubernetes: | ||||
|             parseStdout: true | ||||
|     ``` | ||||
| 
 | ||||
| Loggie会在渲染LogConfig的时候自动增加source codec解析出原始的业务日志。 | ||||
| 
 | ||||
| 需要注意的是: | ||||
| 
 | ||||
| - 仅当LogConfig配置里的paths单独为`stdout`时有效:   | ||||
|   【有效】 | ||||
|     ```yaml | ||||
|             sources: | | ||||
|               - type: file | ||||
|                 name: common | ||||
|                 paths: | ||||
|                   - stdout | ||||
|     ``` | ||||
|   【无效】 | ||||
|   ```yaml | ||||
|           sources: | | ||||
|             - type: file | ||||
|               name: common | ||||
|               paths: | ||||
|                 - stdout | ||||
|                 - /usr/local/tomcat/logs/*.log | ||||
|   ``` | ||||
|   上面需要改成两个source:   | ||||
|   【有效】 | ||||
|   ```yaml | ||||
|           sources: | | ||||
|             - type: file | ||||
|               name: stdout | ||||
|               paths: | ||||
|                 - stdout | ||||
|             - type: file | ||||
|               name: tomcat | ||||
|               paths: | ||||
|                 - /usr/local/tomcat/logs/*.log | ||||
|   ``` | ||||
| 
 | ||||
| - 目前只会保留原始的日志内容到`body`中,其余运行时附加的字段会被丢弃。 | ||||
| - 自动解析stdout实际上是在LogConfig渲染成Pipeline配置时自动增加source codec来实现。 | ||||
| 
 | ||||
| 
 | ||||
| ## 无需挂载volume的容器日志采集 | ||||
| 
 | ||||
| 虽然我们建议使用挂载volume(emptyDir/hostPath+subPathExpr)的方式将日志文件挂出给Loggie采集,但仍然存在很多情况我们没办法将业务的Pod统一挂载出日志路径。   | ||||
| 比如一些基础组件无法配置独立的日志volume,或者业务单纯的不愿意改部署配置。 | ||||
| 
 | ||||
| Loggie提供了无需挂载即可采集容器日志的能力,可自动识别并采集容器root filesystem里的日志文件。 | ||||
| 
 | ||||
| 你只需要将部署的helm chart中values.yml里的配置`rootFsCollectionEnabled`设置为true, | ||||
| 同时填上实际环境的容器运行时(docker/containerd),如下所示: | ||||
| 
 | ||||
| !!! example "rootFsCollectionEnabled" | ||||
| 
 | ||||
|     ```yaml | ||||
|     config: | ||||
|       loggie: | ||||
|         discovery: | ||||
|           enabled: true | ||||
|           kubernetes: | ||||
|             containerRuntime: containerd | ||||
|             rootFsCollectionEnabled: false | ||||
|     ``` | ||||
| 
 | ||||
| 修改完成后,重新helm upgrade即可。   | ||||
| helm模版会自动渲染增加额外的一些挂载路径和配置,如果你从低版本升级,需要额外修改部署的Daemonset yaml。 | ||||
| 具体原理请参考issues [#208](https://github.com/loggie-io/loggie/issues/208)。 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -202,6 +202,12 @@ Pv的访问模式包括: | |||
| 
 | ||||
| 另外,鉴于一些Agent对采集docker stdout有一定的支持,所以还存在一些使用上变种,比如利用webhook注入一个sidecar,读取Pod里的日志文件,转换成sidecar的stdout,然后采集sidecar的stdout日志,这里不再详述。   | ||||
| 
 | ||||
| **(4)不挂载** | ||||
| 
 | ||||
| 很多情况下,用户都疏于挂载日志路径volume,或者对接一个已经存在的系统,往往业务方不愿意更改,这个时候能采集容器里的日志文件吗? | ||||
| 
 | ||||
| Loggie尝试解决了这个问题,可以通过配置开启,不过这种方式仍然需要更多长期生产实践的检验。欢迎试用,具体开关请参考下一节。 | ||||
| 
 | ||||
| 
 | ||||
| #### Sidecar + Stdout/日志文件 | ||||
| 如果需要采用sidecar的方式,需要将日志Agent同时挂载相同的日志路径,Agent的配置文件也一般使用ConfigMap挂载出来。 | ||||
|  |  | |||
							
								
								
									
										4
									
								
								nav.yml
								
								
								
								
							
							
						
						
									
										4
									
								
								nav.yml
								
								
								
								
							|  | @ -41,6 +41,7 @@ nav: | |||
| 
 | ||||
|       - 企业实战: | ||||
|         - 日志系统架构与演进: user-guide/enterprise-practice/architecture-and-evolution.md | ||||
|         - 使用阿里云SLS日志存储: user-guide/enterprise-practice/sls.md | ||||
| 
 | ||||
|       - 运维排障: | ||||
|         - 日志采集快速排障指南: user-guide/troubleshot/log-collection.md | ||||
|  | @ -73,6 +74,7 @@ nav: | |||
|         - grpc: reference/pipelines/sink/grpc.md | ||||
|         - file: reference/pipelines/sink/file.md | ||||
|         - dev: reference/pipelines/sink/dev.md | ||||
|         - sls: reference/pipelines/sink/sls.md | ||||
| 
 | ||||
|       - Interceptor: | ||||
|         - Overview: reference/pipelines/interceptor/overview.md | ||||
|  | @ -96,6 +98,7 @@ nav: | |||
|         - sink: reference/monitor/sink.md | ||||
|         - queue: reference/monitor/queue.md | ||||
|         - logAlert: reference/monitor/logalert.md | ||||
|         - sys: reference/monitor/sys.md | ||||
| 
 | ||||
|       - Kubernetes CRD:  | ||||
|         - LogConfig: reference/discovery/kubernetes/logconfig.md | ||||
|  | @ -108,3 +111,4 @@ nav: | |||
|       - 本地开发: developer-guide/development.md | ||||
|       - 代码规范: developer-guide/code/coding-guide.md | ||||
|       - 组件开发: developer-guide/component/component-guide.md | ||||
|       - 版本发布流程: developer-guide/release.md | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue