1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Loki日志系統(tǒng)詳解

        共 65155字,需瀏覽 131分鐘

         ·

        2021-09-27 12:34

        一鍵生成Springboot & Vue項目!【畢設(shè)神器】背景


        最近,在對公司容器云的日志方案進行設(shè)計的時候,發(fā)現(xiàn)主流的ELK或者EFK比較重,再加上現(xiàn)階段對于ES復(fù)雜的搜索功能很多都用不上最終選擇了Grafana開源的Loki日志系統(tǒng),下面介紹下Loki的背景。

        背景和動機

        當我們的容器云運行的應(yīng)用或者某個節(jié)點出現(xiàn)問題了,解決思路應(yīng)該如下:


        我們的監(jiān)控使用的是基于Prometheus體系進行改造的,Prometheus中比較重要的是Metric和Alert,Metric是來說明當前或者歷史達到了某個值,Alert設(shè)置Metric達到某個特定的基數(shù)觸發(fā)了告警,但是這些信息明顯是不夠的。我們都知道,Kubernetes的基本單位是Pod,Pod把日志輸出到stdout和stderr,平時有什么問題我們通常在界面或者通過命令查看相關(guān)的日志,舉個例子:當我們的某個Pod的內(nèi)存變得很大,觸發(fā)了我們的Alert,這個時候管理員,去頁面查詢確認是哪個Pod有問題,然后要確認Pod內(nèi)存變大的原因,我們還需要去查詢Pod的日志,如果沒有日志系統(tǒng),那么我們就需要到頁面或者使用命令進行查詢了:



        如果,這個時候應(yīng)用突然掛了,這個時候我們就無法查到相關(guān)的日志了,所以需要引入日志系統(tǒng),統(tǒng)一收集日志,而使用ELK的話,就需要在Kibana和Grafana之間切換,影響用戶體驗。所以 ,loki的第一目的就是最小化度量和日志的切換成本,有助于減少異常事件的響應(yīng)時間和提高用戶的體驗。

        ELK存在的問題

        現(xiàn)有的很多日志采集的方案都是采用全文檢索對日志進行索引(如ELK方案),優(yōu)點是功能豐富,允許復(fù)雜的操作。但是,這些方案往往規(guī)模復(fù)雜,資源占用高,操作苦難。很多功能往往用不上,大多數(shù)查詢只關(guān)注一定時間范圍和一些簡單的參數(shù)(如host、service等),使用這些解決方案就有點殺雞用牛刀的感覺了。


        因此,Loki的第二個目的是,在查詢語言的易操作性和復(fù)雜性之間可以達到一個權(quán)衡。

        成本

        全文檢索的方案也帶來成本問題,簡單的說就是全文搜索(如ES)的倒排索引的切分和共享的成本較高。后來出現(xiàn)了其他不同的設(shè)計方案如:OKlog,采用最終一致的、基于網(wǎng)格的分布策略。這兩個設(shè)計決策提供了大量的成本降低和非常簡單的操作,但是查詢不夠方便。因此,Loki的第三個目的是,提高一個更具成本效益的解決方案。


        架構(gòu)


        整體架構(gòu)

        Loki的架構(gòu)如下:


        不難看出,Loki的架構(gòu)非常簡單,使用了和Prometheus一樣的標簽來作為索引,也就是說,你通過這些標簽既可以查詢?nèi)罩镜膬?nèi)容也可以查詢到監(jiān)控的數(shù)據(jù),不但減少了兩種查詢之間的切換成本,也極大地降低了日志索引的存儲。Loki將使用與Prometheus相同的服務(wù)發(fā)現(xiàn)和標簽重新標記庫,編寫了pormtail,在Kubernetes中promtail以DaemonSet方式運行在每個節(jié)點中,通過Kubernetes API等到日志的正確元數(shù)據(jù),并將它們發(fā)送到Loki。下面是日志的存儲架構(gòu):


        讀寫

        日志數(shù)據(jù)的寫主要依托的是Distributor和Ingester兩個組件,整體的流程如下:


        Distributor

        一旦promtail收集日志并將其發(fā)送給loki,Distributor就是第一個接收日志的組件。由于日志的寫入量可能很大,所以不能在它們傳入時將它們寫入數(shù)據(jù)庫。這會毀掉數(shù)據(jù)庫。我們需要批處理和壓縮數(shù)據(jù)。

        Loki通過構(gòu)建壓縮數(shù)據(jù)塊來實現(xiàn)這一點,方法是在日志進入時對其進行g(shù)zip操作,組件ingester是一個有狀態(tài)的組件,負責(zé)構(gòu)建和刷新chunck,當chunk達到一定的數(shù)量或者時間后,刷新到存儲中去。每個流的日志對應(yīng)一個ingester,當日志到達Distributor后,根據(jù)元數(shù)據(jù)和hash算法計算出應(yīng)該到哪個ingester上面。


        此外,為了冗余和彈性,我們將其復(fù)制n(默認情況下為3)次。

        Ingester

        Ingester接收到日志并開始構(gòu)建chunk:


        基本上就是將日志進行壓縮并附加到chunk上面。一旦chunk“填滿”(數(shù)據(jù)達到一定數(shù)量或者過了一定期限),ingester將其刷新到數(shù)據(jù)庫。我們對塊和索引使用單獨的數(shù)據(jù)庫,因為它們存儲的數(shù)據(jù)類型不同。


        刷新一個chunk之后,ingester然后創(chuàng)建一個新的空chunk并將新條目添加到該chunk中。

        Querier

        讀取就非常簡單了,由Querier負責(zé)給定一個時間范圍和標簽選擇器,Querier查看索引以確定哪些塊匹配,并通過greps將結(jié)果顯示出來。它還從Ingester獲取尚未刷新的最新數(shù)據(jù)。

        對于每個查詢,一個查詢器將為您顯示所有相關(guān)日志。實現(xiàn)了查詢并行化,提供分布式grep,使即使是大型查詢也是足夠的。


        可擴展性

        Loki的索引存儲可以是cassandra/bigtable/dynamodb,而chuncks可以是各種對象存儲,Querier和Distributor都是無狀態(tài)的組件。對于ingester他雖然是有狀態(tài)的但是,當新的節(jié)點加入或者減少,整節(jié)點間的chunk會重新分配,已適應(yīng)新的散列環(huán)。而Loki底層存儲的實現(xiàn)Cortex已經(jīng) 在實際的生產(chǎn)中投入使用多年了。有了這句話,我可以放心的在環(huán)境中實驗一把了。


        部署


        Loki的安裝非常簡單。

        創(chuàng)建namespace

        oc new-project loki


        權(quán)限設(shè)置

        oc adm policy add-scc-to-user anyuid -z default -n loki
        oc adm policy add-cluster-role-to-user cluster-admin system:serviceaccount:loki:default


        安裝Loki

        安裝命令:

        oc create -f statefulset.json -n loki

        statefulset.json如下:

        {
            "apiVersion""apps/v1",
            "kind""StatefulSet",
            "metadata": {
                "name""loki"
            },
            "spec": {
                "podManagementPolicy""OrderedReady",
                "replicas": 1,
                "revisionHistoryLimit": 10,
                "selector": {
                    "matchLabels": {
                        "app""loki"
                    }
                },
                "serviceName""womping-stoat-loki-headless",
                "template": {
                    "metadata": {
                        "annotations": {
                            "checksum/config""da297d66ee53e0ce68b58e12be7ec5df4a91538c0b476cfe0ed79666343df72b",
                            "prometheus.io/port""http-metrics",
                            "prometheus.io/scrape""true"
                        },
                        "creationTimestamp": null,
                        "labels": {
                            "app""loki",
                            "name""loki"
                        }
                    },
                    "spec": {
                        "affinity": {},
                        "containers": [
                            {
                                "args": [
                                    "-config.file=/etc/loki/local-config.yaml"
                                ],
                                "image""grafana/loki:latest",
                                "imagePullPolicy""IfNotPresent",
                                "livenessProbe": {
                                    "failureThreshold": 3,
                                    "httpGet": {
                                        "path""/ready",
                                        "port""http-metrics",
                                        "scheme""HTTP"
                                    },
                                    "initialDelaySeconds": 45,
                                    "periodSeconds": 10,
                                    "successThreshold": 1,
                                    "timeoutSeconds": 1
                                },
                                "name""loki",
                                "ports": [
                                    {
                                        "containerPort": 3100,
                                        "name""http-metrics",
                                        "protocol""TCP"
                                    }
                                ],
                                "readinessProbe": {
                                    "failureThreshold": 3,
                                    "httpGet": {
                                        "path""/ready",
                                        "port""http-metrics",
                                        "scheme""HTTP"
                                    },
                                    "initialDelaySeconds": 45,
                                    "periodSeconds": 10,
                                    "successThreshold": 1,
                                    "timeoutSeconds": 1
                                },
                                "resources": {},
                                "terminationMessagePath""/dev/termination-log",
                                "terminationMessagePolicy""File",
                                "volumeMounts": [
                                    {
                                        "mountPath""/tmp/loki",
                                        "name""storage"
                                    }
                                ]
                            }
                        ],
                        "dnsPolicy""ClusterFirst",
                        "restartPolicy""Always",
                        "schedulerName""default-scheduler",
                        "terminationGracePeriodSeconds": 30,
                        "volumes": [
                            {
                                "emptyDir": {},
                                "name""storage"
                            }
                        ]
                    }
                },
                "updateStrategy": {
                    "type""RollingUpdate"
                }
            }
        }


        安裝Promtail

        安裝命令:

        oc create -f configmap.json -n loki

        configmap.json如下:

        {
            "apiVersion""v1",
            "data": {
                "promtail.yaml""client:\n  backoff_config:\n    maxbackoff: 5s\n    maxretries: 5\n    minbackoff: 100ms\n  batchsize: 102400\n  batchwait: 1s\n  external_labels: {}\n  timeout: 10s\npositions:\n  filename: /run/promtail/positions.yaml\nserver:\n  http_listen_port: 3101\ntarget_config:\n  sync_period: 10s\n\nscrape_configs:\n- job_name: kubernetes-pods-name\n  pipeline_stages:\n    - docker: {}\n    \n  kubernetes_sd_configs:\n  - role: pod\n  relabel_configs:\n  - source_labels:\n    - __meta_kubernetes_pod_label_name\n    target_label: __service__\n  - source_labels:\n    - __meta_kubernetes_pod_node_name\n    target_label: __host__\n  - action: drop\n    regex: ^$\n    source_labels:\n    - __service__\n  - action: labelmap\n    regex: __meta_kubernetes_pod_label_(.+)\n  - action: replace\n    replacement: $1\n    separator: /\n    source_labels:\n    - __meta_kubernetes_namespace\n    - __service__\n    target_label: job\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_namespace\n    target_label: namespace\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_name\n    target_label: instance\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_container_name\n    target_label: container_name\n  - replacement: /var/log/pods/*$1/*.log\n    separator: /\n    source_labels:\n    - __meta_kubernetes_pod_uid\n    - __meta_kubernetes_pod_container_name\n    target_label: __path__\n- job_name: kubernetes-pods-app\n  pipeline_stages:\n    - docker: {}\n    \n  kubernetes_sd_configs:\n  - role: pod\n  relabel_configs:\n  - action: drop\n    regex: .+\n    source_labels:\n    - __meta_kubernetes_pod_label_name\n  - source_labels:\n    - __meta_kubernetes_pod_label_app\n    target_label: __service__\n  - source_labels:\n    - __meta_kubernetes_pod_node_name\n    target_label: __host__\n  - action: drop\n    regex: ^$\n    source_labels:\n    - __service__\n  - action: labelmap\n    regex: __meta_kubernetes_pod_label_(.+)\n  - action: replace\n    replacement: $1\n    separator: /\n    source_labels:\n    - __meta_kubernetes_namespace\n    - __service__\n    target_label: job\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_namespace\n    target_label: namespace\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_name\n    target_label: instance\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_container_name\n    target_label: container_name\n  - replacement: /var/log/pods/*$1/*.log\n    separator: /\n    source_labels:\n    - __meta_kubernetes_pod_uid\n    - __meta_kubernetes_pod_container_name\n    target_label: __path__\n- job_name: kubernetes-pods-direct-controllers\n  pipeline_stages:\n    - docker: {}\n    \n  kubernetes_sd_configs:\n  - role: pod\n  relabel_configs:\n  - action: drop\n    regex: .+\n    separator: ''\n    source_labels:\n    - __meta_kubernetes_pod_label_name\n    - __meta_kubernetes_pod_label_app\n  - action: drop\n    regex: ^([0-9a-z-.]+)(-[0-9a-f]{8,10})$\n    source_labels:\n    - __meta_kubernetes_pod_controller_name\n  - source_labels:\n    - __meta_kubernetes_pod_controller_name\n    target_label: __service__\n  - source_labels:\n    - __meta_kubernetes_pod_node_name\n    target_label: __host__\n  - action: drop\n    regex: ^$\n    source_labels:\n    - __service__\n  - action: labelmap\n    regex: __meta_kubernetes_pod_label_(.+)\n  - action: replace\n    replacement: $1\n    separator: /\n    source_labels:\n    - __meta_kubernetes_namespace\n    - __service__\n    target_label: job\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_namespace\n    target_label: namespace\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_name\n    target_label: instance\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_container_name\n    target_label: container_name\n  - replacement: /var/log/pods/*$1/*.log\n    separator: /\n    source_labels:\n    - __meta_kubernetes_pod_uid\n    - __meta_kubernetes_pod_container_name\n    target_label: __path__\n- job_name: kubernetes-pods-indirect-controller\n  pipeline_stages:\n    - docker: {}\n    \n  kubernetes_sd_configs:\n  - role: pod\n  relabel_configs:\n  - action: drop\n    regex: .+\n    separator: ''\n    source_labels:\n    - __meta_kubernetes_pod_label_name\n    - __meta_kubernetes_pod_label_app\n  - action: keep\n    regex: ^([0-9a-z-.]+)(-[0-9a-f]{8,10})$\n    source_labels:\n    - __meta_kubernetes_pod_controller_name\n  - action: replace\n    regex: ^([0-9a-z-.]+)(-[0-9a-f]{8,10})$\n    source_labels:\n    - __meta_kubernetes_pod_controller_name\n    target_label: __service__\n  - source_labels:\n    - __meta_kubernetes_pod_node_name\n    target_label: __host__\n  - action: drop\n    regex: ^$\n    source_labels:\n    - __service__\n  - action: labelmap\n    regex: __meta_kubernetes_pod_label_(.+)\n  - action: replace\n    replacement: $1\n    separator: /\n    source_labels:\n    - __meta_kubernetes_namespace\n    - __service__\n    target_label: job\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_namespace\n    target_label: namespace\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_name\n    target_label: instance\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_container_name\n    target_label: container_name\n  - replacement: /var/log/pods/*$1/*.log\n    separator: /\n    source_labels:\n    - __meta_kubernetes_pod_uid\n    - __meta_kubernetes_pod_container_name\n    target_label: __path__\n- job_name: kubernetes-pods-static\n  pipeline_stages:\n    - docker: {}\n    \n  kubernetes_sd_configs:\n  - role: pod\n  relabel_configs:\n  - action: drop\n    regex: ^$\n    source_labels:\n    - __meta_kubernetes_pod_annotation_kubernetes_io_config_mirror\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_label_component\n    target_label: __service__\n  - source_labels:\n    - __meta_kubernetes_pod_node_name\n    target_label: __host__\n  - action: drop\n    regex: ^$\n    source_labels:\n    - __service__\n  - action: labelmap\n    regex: __meta_kubernetes_pod_label_(.+)\n  - action: replace\n    replacement: $1\n    separator: /\n    source_labels:\n    - __meta_kubernetes_namespace\n    - __service__\n    target_label: job\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_namespace\n    target_label: namespace\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_name\n    target_label: instance\n  - action: replace\n    source_labels:\n    - __meta_kubernetes_pod_container_name\n    target_label: container_name\n  - replacement: /var/log/pods/*$1/*.log\n    separator: /\n    source_labels:\n    - __meta_kubernetes_pod_annotation_kubernetes_io_config_mirror\n    - __meta_kubernetes_pod_container_name\n    target_label: __path__\n"
            },
            "kind""ConfigMap",
            "metadata": {
                "creationTimestamp""2019-09-05T01:05:03Z",
                "labels": {
                    "app""promtail",
                    "chart""promtail-0.12.0",
                    "heritage""Tiller",
                    "release""lame-zorse"
                },
                "name""lame-zorse-promtail",
                "namespace""loki",
                "resourceVersion""17921611",
                "selfLink""/api/v1/namespaces/loki/configmaps/lame-zorse-promtail",
                "uid""30fcb896-cf79-11e9-b58e-e4a8b6cc47d2"
            }
        }




        oc create -f daemonset.json -n loki

        daemonset.json如下:

             {
                    "apiVersion""apps/v1",
                    "kind""DaemonSet",
                    "metadata": {
                        "annotations": {
                            "deployment.kubernetes.io/revision""2"
                        },
                        "creationTimestamp""2019-09-05T01:16:37Z",
                        "generation": 2,
                        "labels": {
                            "app""promtail",
                            "chart""promtail-0.12.0",
                            "heritage""Tiller",
                            "release""lame-zorse"
                        },
                        "name""lame-zorse-promtail",
                        "namespace""loki"
                    },
                    "spec": {
                        "progressDeadlineSeconds": 600,
                        "replicas": 1,
                        "revisionHistoryLimit": 10,
                        "selector": {
                            "matchLabels": {
                                "app""promtail",
                                "release""lame-zorse"
                            }
                        },
                        "strategy": {
                            "rollingUpdate": {
                                "maxSurge": 1,
                                "maxUnavailable": 1
                            },
                            "type""RollingUpdate"
                        },
                        "template": {
                            "metadata": {
                                "annotations": {
                                    "checksum/config""75a25ee4f2869f54d394bf879549a9c89c343981a648f8d878f69bad65dba809",
                                    "prometheus.io/port""http-metrics",
                                    "prometheus.io/scrape""true"
                                },
                                "creationTimestamp": null,
                                "labels": {
                                    "app""promtail",
                                    "release""lame-zorse"
                                }
                            },
                            "spec": {
                                "affinity": {},
                                "containers": [
                                    {
                                        "args": [
                                            "-config.file=/etc/promtail/promtail.yaml",
                                            "-client.url=http://loki.loki.svc:3100/api/prom/push"
                                        ],
                                        "env": [
                                            {
                                                "name""HOSTNAME",
                                                "valueFrom": {
                                                    "fieldRef": {
                                                        "apiVersion""v1",
                                                        "fieldPath""spec.nodeName"
                                                    }
                                                }
                                            }
                                        ],
                                        "image""grafana/promtail:v0.3.0",
                                        "imagePullPolicy""IfNotPresent",
                                        "name""promtail",
                                        "ports": [
                                            {
                                                "containerPort": 3101,
                                                "name""http-metrics",
                                                "protocol""TCP"
                                            }
                                        ],
                                        "readinessProbe": {
                                            "failureThreshold": 5,
                                            "httpGet": {
                                                "path""/ready",
                                                "port""http-metrics",
                                                "scheme""HTTP"
                                            },
                                            "initialDelaySeconds": 10,
                                            "periodSeconds": 10,
                                            "successThreshold": 1,
                                            "timeoutSeconds": 1
                                        },
                                        "resources": {},
                                        "securityContext": {
                                            "readOnlyRootFilesystem"true,
                                            "runAsUser": 0
                                        },
                                        "terminationMessagePath""/dev/termination-log",
                                        "terminationMessagePolicy""File",
                                        "volumeMounts": [
                                            {
                                                "mountPath""/etc/promtail",
                                                "name""config"
                                            },
                                            {
                                                "mountPath""/run/promtail",
                                                "name""run"
                                            },
                                            {
                                                "mountPath""/var/lib/docker/containers",
                                                "name""docker",
                                                "readOnly"true
                                            },
                                            {
                                                "mountPath""/var/log/pods",
                                                "name""pods",
                                                "readOnly"true
                                            }
                                        ]
                                    }
                                ],
                                "dnsPolicy""ClusterFirst",
                                "restartPolicy""Always",
                                "schedulerName""default-scheduler",
                                "securityContext": {},
                                "terminationGracePeriodSeconds": 30,
                                "volumes": [
                                    {
                                        "configMap": {
                                            "defaultMode": 420,
                                            "name""lame-zorse-promtail"
                                        },
                                        "name""config"
                                    },
                                    {
                                        "hostPath": {
                                            "path""/run/promtail",
                                            "type"""
                                        },
                                        "name""run"
                                    },
                                    {
                                        "hostPath": {
                                            "path""/var/lib/docker/containers",
                                            "type"""
                                        },
                                        "name""docker"
                                    },
                                    {
                                        "hostPath": {
                                            "path""/var/log/pods",
                                            "type"""
                                        },
                                        "name""pods"
                                    }
                                ]
                            }
                        }
                    }
                }


        安裝服務(wù)

        oc create -f service.json -n loki

        service.json的內(nèi)容如下:

        {
            "apiVersion""v1",
            "kind""Service",
            "metadata": {
                "creationTimestamp""2019-09-04T09:37:49Z",
                "name""loki",
                "namespace""loki",
                "resourceVersion""17800188",
                "selfLink""/api/v1/namespaces/loki/services/loki",
                "uid""a87fe237-cef7-11e9-b58e-e4a8b6cc47d2"
            },
            "spec": {
                "externalTrafficPolicy""Cluster",
                "ports": [
                    {
                        "name""lokiport",
                        "port": 3100,
                        "protocol""TCP",
                        "targetPort": 3100
                    }
                ],
                "selector": {
                    "app""loki"
                },
                "sessionAffinity""None",
                "type""NodePort"
            },
            "status": {
                "loadBalancer": {}
            }


        語法


        Loki提供了HTTP接口,我們這里就不詳解了,大家可以看:https://github.com/grafana/loki/blob/master/docs/api.md

        我們這里說下查詢的接口如何使用。

        第一步,獲取當前Loki的元數(shù)據(jù)類型:

        curl http://192.168.25.30:30972/api/prom/label
        {
         "values": ["alertmanager""app""component""container_name""controller_revision_hash""deployment""deploymentconfig""docker_registry""draft""filename""instance""job""logging_infra""metrics_infra""name""namespace""openshift_io_component""pod_template_generation""pod_template_hash""project""projectname""prometheus""provider""release""router""servicename""statefulset_kubernetes_io_pod_name""stream""tekton_dev_pipeline""tekton_dev_pipelineRun""tekton_dev_pipelineTask""tekton_dev_task""tekton_dev_taskRun""type""webconsole"]
        }

        第二步,獲取某個元數(shù)據(jù)類型的值:

        curl http://192.168.25.30:30972/api/prom/label/namespace/values
        {"values":["cicd","default","gitlab","grafanaserver","jenkins","jx-staging","kube-system","loki","mysql-exporter","new2","openshift-console","openshift-infra","openshift-logging","openshift-monitoring","openshift-node","openshift-sdn","openshift-web-console","tekton-pipelines","test111"]}

        第三步,根據(jù)label進行查詢,例如:

        http://192.168.25.30:30972/api/prom/query?direction=BACKWARD&limit=1000&regexp=&query={namespace="cicd"}&start=1567644457221000000&end=1567730857221000000&refId=A

        參數(shù)解析:

        • query:一種查詢語法詳細見下面章節(jié),{name=~“mysql.+”} or {namespace=“cicd”} |= "error"表示查詢,namespace為CI/CD的日志中,有error字樣的信息。

        • limit:返回日志的數(shù)量

        • start:開始時間,Unix時間表示方法 默認為,一小時前時間

        • end:結(jié)束時間,默認為當前時間

        • direction:forward或者backward,指定limit時候有用,默認為 backward

        • regexp:對結(jié)果進行regex過濾


        LogQL語法

        選擇器

        對于查詢表達式的標簽部分,將放在{}中,多個標簽表達式用逗號分隔:

        {app="mysql",name="mysql-backup"}

        支持的符號有:

        • =:完全相同。

        • !=:不平等。

        • =~:正則表達式匹配。

        • !~:不要正則表達式匹配。


        過濾表達式

        編寫日志流選擇器后,您可以通過編寫搜索表達式進一步過濾結(jié)果。搜索表達式可以文本或正則表達式。

        如:

        • {job=“mysql”} |= “error”

        • {name=“kafka”} |~ “tsdb-ops.*io:2003”

        • {instance=~“kafka-[23]”,name=“kafka”} != kafka.server:type=ReplicaManager


        支持多個過濾:

        • {job=“mysql”} |= “error” != “timeout”


        目前支持的操作符:

        • |= line包含字符串。

        • != line不包含字符串。

        • |~ line匹配正則表達式。

        • !~ line與正則表達式不匹配。


        表達式遵循h(huán)ttps://github.com/google/re2/wiki/Syntax語法。

        作者:

        來源:https://blog.csdn.net/Linkthaha/article/details/100575278

        http://blog.csdn.net/Linkthaha/article/details/100575651

        https://blog.csdn.net/Linkthaha/article/details/100582422

        https://blog.csdn.net/Linkthaha/article/details/10058258

        版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認,我們都會標明作者及出處,如有侵權(quán)煩請告知,我們會立即刪除并表示歉意。謝謝!


        推薦閱讀

        一鍵生成Springboot & Vue項目!【畢設(shè)神器】



        END


        順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,

        GitHub地址:https://github.com/javadevbooks/books

        Gitee地址:https://gitee.com/javadevbooks/books

        電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..






        瀏覽 76
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久久久久a亚洲欧洲aⅴ96 | 女人被强行糟蹋过程h电影 | 亚洲 欧美 手机 在线观看 | 国产女偷窥洗澡系列在线视频 | 91人人视频 | 北条麻妃中文字幕在线视频 | 中文字幕在线视频观看 | 欧美老妪AAAA特黄 | 国产又大又粗又长的视频 | 日逼电影网站 |