城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

PromtailPipeline日志处理配置

6月6日 乱人心投稿
  Promtail是Loki官方支持的日志采集端,在需要采集日志的节点上运行采集代理,再统一发送到Loki进行处理。除了使用Promtail,社区还有很多采集日志的组件,比如fluentd、fluentbit等,都是比较优秀的。
  但是Promtail是运行Kubernetes时的首选客户端,因为你可以将其配置为自动从Promtail运行的同一节点上运行的Pod中抓取日志。Promtail和Prometheus在Kubernetes中一起运行,还可以实现非常强大的调试功能,如果Prometheus和Promtail使用相同的标签,用户还可以使用Grafana根据标签集在指标和日志之间切换。
  此外如果你想从日志中提取指标,比如计算某个特定信息的出现次数,Promtail效果也是非常友好的。
  在Promtail中一个pipeline管道被用来转换一个单一的日志行、标签和它的时间戳。本文将介绍Promtail中的核心概念pipeline以及了解下如何设置Promtail来处理你的日志行数据,包括提取指标与标签等。
  1基础
  一个pipeline管道是由一组stages阶段组成的,在Promtail配置中一共有4种类型的stages。
  Parsingstages(解析阶段)用于解析当前的日志行并从中提取数据,提取的数据可供其他阶段使用。
  Transformstages(转换阶段)用于对之前阶段提取的数据进行转换。
  Actionstages(处理阶段)用于从以前阶段中提取数据并对其进行处理,包括:添加或修改现有日志行标签更改日志行的时间戳修改日志行内容在提取的数据基础上创建一个metrics指标
  Filteringstages(过滤阶段)可选择应用一个阶段的子集,或根据一些条件删除日志数据。
  一个典型的pipeline将从解析阶段开始(如regex或json阶段)从日志行中提取数据。然后有一系列的处理阶段配置,对提取的数据进行处理。最常见的处理阶段是一个labelsstage标签阶段,将提取的数据转化为标签。
  需要注意的是现在pipeline不能用于重复的日志,例如,Loki将多次收到同一条日志行:从同一文件中读取的两个抓取配置文件中重复的日志行被发送到一个pipeline,不会做重复数据删除
  然后,Loki会在查询时对那些具有完全相同的纳秒时间戳、标签与日志内容的日志进行一些重复数据删除。
  下面的配置示例可以很好地说明我们可以通过pipeline来对日志行数据实现什么功能:spanstylecolor:d19a66;lineheight:26scrapeconfigs:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26jobname:spanspanstylecolor:98c379;lineheight:26kubernetespodsnamespan
  spanstylecolor:d19a66;lineheight:26kubernetessdconfigs:spanspanstylecolor:98c379;lineheight:26。。。。span
  spanstylecolor:d19a66;lineheight:26pipelinestages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26这个阶段只有在被抓取地目标有一个标签名为name且值为promtail地时候才会执行span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{namepromtail}span
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26regex阶段解析出一个level、timestamp与component,在该阶段结束时,这几个值只为pipeline内部设置,在以后地阶段可以使用这些值并决定如何处理他们。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26。level(?Plevel〔azAZ〕)。ts(?Ptimestamp〔Td:。Z〕)。component(?Pcomponent〔azAZ〕)span
  spanstylecolor:5c6370;fontstyle:lineheight:26labels阶段从前面地regex阶段获取level、component值,并将他们变成一个标签,比如levelerror可能就是这个阶段添加地一个标签。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26level:span
  spanstylecolor:d19a66;lineheight:26component:span
  spanstylecolor:5c6370;fontstyle:lineheight:26最后,时间戳阶段采用从regex提取地timestamp,并将其变成ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的新时间戳,并解析为RFC3339Nano格式。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26timestamp:span
  spanstylecolor:d19a66;lineheight:26format:spanspanstylecolor:98c379;lineheight:26RFC3339Nanospan
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26timestampspan
  spanstylecolor:5c6370;fontstyle:lineheight:26这个阶段只有在抓取的目标标签为name,值为nginx,并且ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行中包含GET字样的时候才会执行span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{namenginx}GETspan
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26regex阶段通过匹配一些值来提取一个新的output值。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26w{1,3}。w{1,3}。w{1,3}。w{1,3}(?Poutput。)span
  spanstylecolor:5c6370;fontstyle:lineheight:26output输出阶段通过将捕获的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行设置为来自上面regex阶段的输出值来更改其内容。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26output:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26outputspan
  spanstylecolor:5c6370;fontstyle:lineheight:26这个阶段只有在抓取到目标中有标签name,值为jaegeragent时才会执行。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{namejaegeragent}span
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26JSON阶段将ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行作为JSON字符串读取,并从对象中提取level字段,以便在后续的阶段中使用。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26level:spanspanstylecolor:98c379;lineheight:26levelspan
  spanstylecolor:5c6370;fontstyle:lineheight:26将上一个阶段中的level值变成一个标签。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26level:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26jobname:spanspanstylecolor:98c379;lineheight:26kubernetespodsappspan
  spanstylecolor:d19a66;lineheight:26kubernetessdconfigs:spanspanstylecolor:98c379;lineheight:26。。。。span
  spanstylecolor:d19a66;lineheight:26pipelinestages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26这个阶段只有在被抓取的目标的标签为app,名称为grafana或prometheus时才会执行。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{appgrafanaprometheus}span
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26regex阶段将提取一个level合componet值,供后面的阶段使用,允许level被定义为lvllevel或levellevel,组件被定义为loggercomponent或componentcomponentspan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26。(lvllevel)(?Plevel〔azAZ〕)。(loggercomponent)(?Pcomponent〔azAZ〕)span
  spanstylecolor:5c6370;fontstyle:lineheight:26然后标签阶段将从上面regex阶段提取的level和component变为标签。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26level:span
  spanstylecolor:d19a66;lineheight:26component:span
  spanstylecolor:5c6370;fontstyle:lineheight:26只有当被抓取的目标有一个标签app,其值为someapp,并且ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行不包含info一词时,这个阶段才会执行。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{appsomeapp}!infospan
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:5c6370;fontstyle:lineheight:26regex阶段尝试通过查找ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a中的panic来提取panic信息span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26。(?Ppanicpanic:。)span
  spanstylecolor:5c6370;fontstyle:lineheight:26metrics阶段将增加一个Promtail暴露的panictotal指标,只有当从上面的regex阶段获取到panic值的时候,该Counter才会增加。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26metrics:span
  spanstylecolor:d19a66;lineheight:26panictotal:span
  spanstylecolor:d19a66;lineheight:26type:spanspanstylecolor:98c379;lineheight:26Counterspan
  spanstylecolor:d19a66;lineheight:26description:spanspanstylecolor:98c379;lineheight:26totalcountofpanicspan
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26panicspan
  spanstylecolor:d19a66;lineheight:26config:span
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26incspan
  下面我们先简单描述下每个阶段可以使用的数据有哪些。标签集:当前日志行的标签集合,初始化是与日志一起被抓取的标签集,标签集只由处理阶段进行修改,但过滤阶段会从中读取,最终的标签集将由Loki建立索引,并可用于查询。提取的键值对:在解析阶段提取的键值对集合,后续的阶段对提取的Map进行操作,或者对它们进行转换,或者对它们进行处理。在一个pipeline的末端,提取的Map会被丢弃掉,为了使一个解析阶段有用,它必须总要与至少一个处理阶段配对。提取的Map被初始化,其初始化标签是与日志行一起抓取的,这个初始数据允许在只操作提取的Map的pipeline阶段内对标签的值进行处理。例如,从文件中提取的日志条目有一个标签filename,其值是被提取的文件路径,当一个pipeline执行该日志时,最初提取的Map将包含使用与标签相同值的文件名。ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a时间戳:日志行的当前时间戳,处理阶段可以修改这个值。如果不设置,则默认为日志被抓取的时间。时间戳的最终值会发送给Loki。ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行:当前的日志行,以文本形式表示,初始化为Promtail抓取的文本。处理阶段可以修改这个值。日志行的最终值将作为日志的文本内容发送给Loki。2阶段
  上面我们结束了Promtail的一个pipeline中有4中类型的阶段,下面我们再分别对这4中类型阶段进行简单说明。解析阶段
  解析阶段包括:docker、cri、regex、json这几个stage。docker
  docker阶段通过使用标签的Docker日志格式来解析日志数据进行数据提取。直接使用docker:{}即表示是一个docker阶段。
  与大多数阶段不同,docker阶段不提供配置选项,只支持特定的Docker日志格式,来自Docker的每一行日志都被写成JSON格式,其键值如下。log:日志行的内容stream:stdout或者stderrtime:日志行的时间戳字符串
  例如配置下面的pipeline:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26docker:spanspanstylecolor:98c379;lineheight:26{}span
  将会解析Docker日志成如下所示格式:{
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan
  }
  在提取的数据集中,将创建以下键值对:output:logmessagestream:stderrtimestamp:20190430T02:12:41。8443515cri
  通过使用标准CRI格式解析日志行来提取数据。使用语法一样是直接使用cri:{}即可,与大多数阶段不同,cri阶段不提供配置选项,只支持特定的CRI日志格式。CRI指定的日志行是以空格分隔的值,有以下组成部分:log:整个日志行的内容stream:stdout或者stderrtime:日志行的时间戳字符串
  组件之间不允许有空白,在下面的例子中,只有第一行日志可以使用cri阶段进行正确格式化。20190101T01:00:00。000000001ZstderrPtestgood
  20190101T01:00:00。000000001Zstderrtestgood
  20190101T01:00:00。000000001Ztestgood
  例如配置下面的pipeline:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26cri:spanspanstylecolor:98c379;lineheight:26{}span
  当我们有如下所示的日志行数据:20190430T02:12:41。8443515Zstdoutxxmessage
  在提取的数据集中,将创建以下键值对:output:messagestream:stdouttimestamp:20190430T02:12:41。8443515regex
  使用正则表达式提取数据,在regex中命名的捕获组支持将数据添加到提取的Map映射中。配置格式如下所示:spanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:5c6370;fontstyle:lineheight:26RE2正则表达式,每个捕获组必须被命名。span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26stringspan
  spanstylecolor:5c6370;fontstyle:lineheight:26从指定名称中提取数据,如果为空,则使用log信息。span
  spanstylecolor:98c379;lineheight:26〔source:spanspanstylecolor:98c379;lineheight:26string〕span
  其中的expression是一个GoogleRE2正则表达式字符串,每个捕获组将被设置为到提取的Map中去,每个捕获组也必须命名:(?Pnamere),捕获组的名称将被用作提取的Map中的键。
  另外需要注意,在使用双引号时,必须转义正则表达式中的所有反斜杠。例如下面的几个表达式都是有效的:expression:wexpression:wexpression:w
  但是下面的这几个是无效的表达式:expression:w在使用双引号时才转义反斜线expression:w在使用双引号时才转义反斜线expression:w在使用双引号的时候,反斜杠必须被转义
  例如我们使用下的不带source的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26(?s)(?PtimeS?)(?Pstreamstdoutstderr)(?PflagsS?)(?Pcontent。)span
  当我们要抓取的日志数据为:20190101T01:00:00。000000001ZstderrPimalogmessage!
  该pipeline执行后以下键值对将被添加到提取的Map中去:time:20190101T01:00:00。000000001Zstream:stderrflags:Pcontent:imalogmessage
  如果我们使用带上source的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26time:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26(?Pyeard)span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26timespan
  如果需要抓取的日志数据为:{spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190101T01:00:00。000000001Zspan}
  则第一阶段将把以下键值对添加到提取的Map中:time:20190101T01:00:00。000000001Z
  而regex阶段将解析提取的Map中的时间值,并将以下键值对追加到提取的Map中去:year:2019json
  通过将日志行解析为JSON来提取数据,也可以接受JMESPath表达式来提取数据,配置格式如下所示:spanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:5c6370;fontstyle:lineheight:26JMESPath表达式的键值对集合,键将是提取的数据中的键,而表达式将是值,被评估为来自源数据的JMESPath。span
  spanstylecolor:5c6370;fontstyle:lineheight:26span
  spanstylecolor:5c6370;fontstyle:lineheight:26JMESPath表达式可以通过用双引号来包装一个键完成,然后在YAML中必须用单引号包装起来,这样它们就会被传递给JMESPath解析器进行解析。span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:98c379;lineheight:26〔spanspanstylecolor:98c379;lineheight:26string:spanspanstylecolor:98c379;lineheight:26stringspanspanstylecolor:98c379;lineheight:26。。。spanspanstylecolor:98c379;lineheight:26〕span
  spanstylecolor:98c379;lineheight:26〔source:spanspanstylecolor:98c379;lineheight:26string〕span
  该阶段使用GolangJSON反序列化,提取的数据可以持有非字符串值,本阶段不做任何类型转换,在下游阶段将需要对这些值进行必要的类型转换,可以参考后面的template阶段了解如何进行转换。
  注意:如果提取的值是一个复杂的类型,比如数组或JSON对象,它将被转换为JSON字符串,然后插入到提取的数据中去。
  例如我们使用如下所示的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26output:spanspanstylecolor:98c379;lineheight:26logspan
  spanstylecolor:d19a66;lineheight:26stream:spanspanstylecolor:98c379;lineheight:26streamspan
  spanstylecolor:d19a66;lineheight:26timestamp:spanspanstylecolor:98c379;lineheight:26timespan
  要抓取的日志行数据为:{
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan
  }
  在提取的数据集中,将创建以下键值对:output:logmessagestream:stderrtimestamp:20190430T02:12:41。8443515
  然后我们还可以用下面的pipeline配置来提前数据:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26output:spanspanstylecolor:98c379;lineheight:26logspan
  spanstylecolor:d19a66;lineheight:26stream:spanspanstylecolor:98c379;lineheight:26streamspan
  spanstylecolor:d19a66;lineheight:26timestamp:spanspanstylecolor:98c379;lineheight:26timespan
  spanstylecolor:d19a66;lineheight:26extra:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26user:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26extraspan
  要抓取的日志行数据为:{
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan,
  spanstylecolor:d19a66;lineheight:26extraspan:spanstylecolor:98c379;lineheight:26{user:marco}span
  }
  第一个json阶段执行后将在提取的数据集中创建以下键值对:output:logmessagestream:stderrtimestamp:20190430T02:12:41。8443515extra:{user:marco}
  然后经过第二个json阶段执行后将把提取数据中的extra值解析为JSON,并将以下键值对添加到提取的数据集中:user:marco
  此外我们还可以使用JMESPath表达式来解析有特殊字符的JSON字段(比如或。),比如我们现在有如下所示的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26output:spanspanstylecolor:98c379;lineheight:26logspan
  spanstylecolor:d19a66;lineheight:26stream:spanspanstylecolor:98c379;lineheight:26grpc。streamspan
  spanstylecolor:d19a66;lineheight:26timestamp:spanspanstylecolor:98c379;lineheight:26timespan
  需要抓取的日志数据如下所示:{
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26grpc。streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan
  }
  在提取的数据集中,将创建以下键值对。output:logmessagestream:stderrtimestamp:20190430T02:12:41。8443515
  需要注意的是在引用grpc。stream时,如果没有用单引号包裹的双引号,将无法正常工作。转换阶段
  转换阶段用于对之前阶段提取的数据进行转换。multiline
  多行阶段将多行日志进行合并,然后再将其传递到pipeline的下一个阶段。
  一个新的日志块由第一行正则表达式来识别,任何与表达式不匹配的行都被认为是前一个匹配块的一部分。配置格式如下所示:spanstylecolor:d19a66;lineheight:26multiline:span
  spanstylecolor:5c6370;fontstyle:lineheight:26RE2正则表达式,如果匹配将开始一个新的多行ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a块span
  spanstylecolor:5c6370;fontstyle:lineheight:26这个表达式必须被提供span
  spanstylecolor:d19a66;lineheight:26firstline:spanspanstylecolor:98c379;lineheight:26stringspan
  spanstylecolor:5c6370;fontstyle:lineheight:26解析的最大等待时间(Goduration):https:golang。orgpkgtimeParseDuration。span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果在这个最大的等待时间内没有新的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a,那么当前ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a块将被继续发送。span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果被观察的应用程序因为异常而down掉了,该参数很有用,没有新的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a出现,并且异常块会在最大等待时间过后发送span
  spanstylecolor:5c6370;fontstyle:lineheight:26默认为3sspan
  spanstylecolor:d19a66;lineheight:26maxwaittime:spanspanstylecolor:98c379;lineheight:26durationspan
  spanstylecolor:5c6370;fontstyle:lineheight:26一个多行ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a块有的最大行数,如果该块有更多的行,就会认为是新的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行span
  spanstylecolor:5c6370;fontstyle:lineheight:26默认为128行span
  spanstylecolor:d19a66;lineheight:26maxlines:spanspanstylecolor:98c379;lineheight:26integerspan
  比如现在我们有一个flask应用,下面的日志数据包含异常信息:〔2020120311:36:20〕GEThelloHTTP1。1200
  〔2020120311:36:23〕ERRORinapp:Exceptiononerror〔GET〕
  Traceback(mostrecentcalllast):
  Filehomepallets。pyenvversions3。8。5libpython3。8sitepackagesflaskapp。py,line2447,inwsgiapp
  responseself。fulldispatchrequest()
  Filehomepallets。pyenvversions3。8。5libpython3。8sitepackagesflaskapp。py,line1952,infulldispatchrequest
  rvself。handleuserexception(e)
  Filehomepallets。pyenvversions3。8。5libpython3。8sitepackagesflaskapp。py,line1821,inhandleuserexception
  reraise(exctype,excvalue,tb)
  Filehomepallets。pyenvversions3。8。5libpython3。8sitepackagesflaskcompat。py,line39,inreraise
  raisevalue
  Filehomepallets。pyenvversions3。8。5libpython3。8sitepackagesflaskapp。py,line1950,infulldispatchrequest
  rvself。dispatchrequest()
  Filehomepallets。pyenvversions3。8。5libpython3。8sitepackagesflaskapp。py,line1936,indispatchrequest
  returnself。viewfunctions〔rule。endpoint〕(req。viewargs)
  Filehomepalletssrcdeploymenttoolshello。py,line10,inerror
  raiseException(Sorry,thisroutealwaysbreaks)
  Exception:Sorry,thisroutealwaysbreaks
  〔2020120311:36:23〕GETerrorHTTP1。1500
  〔2020120311:36:26〕GEThelloHTTP1。1200
  〔2020120311:36:27〕GEThelloHTTP1。1200
  显然我们更希望将上面的Exception多行日志识别为一个日志块,在这个示例中,所有的日志块都是括号包括的时间开始的,所以我们可以用firstline正则表达式:〔d{4}d{2}d{2}d{1,2}:d{2}:d{2}〕来配置一个多行阶段,这将匹配上面我们的异常日志的开头部分,但是不会匹配后面的异常行,直到Exception:Sorry,thisroutealwaysbreaks这一行日志,这些将被识别为单个日志块,在Loki中也是以一个日志条目出现的。spanstylecolor:d19a66;lineheight:26multiline:span
  spanstylecolor:5c6370;fontstyle:lineheight:26识别时间戳作为多行ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的第一行,注意这里字符串应该使用单引号。span
  spanstylecolor:d19a66;lineheight:26firstline:spanspanstylecolor:98c379;lineheight:26〔d{4}d{2}d{2}d{1,2}:d{2}:d{2}〕span
  spanstylecolor:d19a66;lineheight:26maxwaittime:spanspanstylecolor:98c379;lineheight:263sspan
  这个示例是假设我们对日志格式没有进行控制,所以我们需要一个更复杂的正则表达式来匹配第一行日志,但是如果我们能够控制被观察的日志格式,那么我们就可以简化第一行的匹配规则。
  下面的是一个简单的AkkaHTTP服务的日志:〔2021010714:17:43,494〕〔DEBUG〕〔akka。io。TcpListener〕〔HelloAkkaHttpServerakka。actor。defaultdispatcher26〕〔akka:HelloAkkaHttpServersystemIOTCPselectorsa0〕Newconnectionaccepted
  〔2021010714:17:43,499〕〔ERROR〕〔akka。actor。ActorSystemImpl〕〔HelloAkkaHttpServerakka。actor。defaultdispatcher3〕〔akka。actor。ActorSystemImpl(HelloAkkaHttpServer)〕Errorduringprocessingofrequest:ohno!ohisunknown。Completingwith500InternalServerErrorresponse。Tochangedefaultexceptionhandlingbehavior,provideacustomExceptionHandler。
  java。lang。Exception:ohno!ohisunknown
  atcom。grafana。UserRoutes。anonfunuserRoutes6(UserRoutes。scala:28)
  atakka。http。scaladsl。server。Directive。anonfunaddByNamearyApply2(Directive。scala:166)
  atakka。http。scaladsl。server。ConjunctionMagnetanon2。anonfunapply3(Directive。scala:234)
  atakka。http。scaladsl。server。directives。BasicDirectives。anonfunmapRouteResult2(BasicDirectives。scala:68)
  atakka。http。scaladsl。server。directives。BasicDirectives。anonfuntextract2(BasicDirectives。scala:161)
  atakka。http。scaladsl。server。RouteConcatenationRouteWithConcatenation。anonfuntilde2(RouteConcatenation。scala:47)
  atakka。http。scaladsl。util。FastFuture。strictTransform1(FastFuture。scala:40)
  。。。
  简单一看和其他日志一样,我们来看看日志的格式:configuration
  filecrasher。logfile
  trueappend
  encoder
  patternZeroWidthS〔date{ISO8601}〕〔level〕〔logger〕〔thread〕〔X{akkaSource}〕msgnpattern
  encoder
  appender
  queueSize1024queueSize
  neverBlocktrueneverBlock
  appender
  rootlevelDEBUG
  root
  configuration
  对于Logback配置来说,没有什么特别之处,除了在每个日志行的开头有一个ZeroWidthS,这是零宽度空格的HTML代码,它使得识别第一行变得更加简单了,这里我们使用的第一行匹配正则表达式为:x{200B}〔,200B是零宽度空格字符的Unicode编码:spanstylecolor:d19a66;lineheight:26multiline:span
  spanstylecolor:5c6370;fontstyle:lineheight:26将零宽度的空格确定为多行块的第一行,注意该字符串应使用单引号。span
  spanstylecolor:d19a66;lineheight:26firstline:spanspanstylecolor:98c379;lineheight:26x{200B}〔span
  spanstylecolor:d19a66;lineheight:26maxwaittime:spanspanstylecolor:98c379;lineheight:263sspan
  template
  template阶段可以使用Go模板语法来操作提取的数据。模板阶段主要用于在将数据设置为标签之前对其他阶段的数据进行操作,例如用下划线替换空格,或者将大写的字符串转换为小写的字符串。模板也可以用来构建具有多个键的信息。模板阶段也可以在提取的数据中创建新的键。
  配置格式如下所示:spanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:5c6370;fontstyle:lineheight:26要解析的提取数据中的名称,如果提前数据中的key不存在,将为其添加一个新的值span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26stringspan
  spanstylecolor:5c6370;fontstyle:lineheight:26使用的Go模板字符串。除了正常的模板之外span
  spanstylecolor:5c6370;fontstyle:lineheight:26functions,ToLower,ToUpper,Replace,Trim,TrimLeft,TrimRight,span
  spanstylecolor:5c6370;fontstyle:lineheight:26TrimPrefix,TrimSuffix,andTrimSpace都是可以使用的函数。span
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26stringsspan
  比如下面的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26newkeyspan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26helloworld!span
  假如还没有任何数据被添加到提取的数据中,这个阶段将首先在提取的数据Map中添加一个空白值的newkey,然后它的值将被设置为helloworld!。
  在看下面的模板阶段配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26appspan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26spanstylecolor:d19a66;lineheight:26{{。Value}}spansomesuffixspan
  这个pipeline在现有提取的数据中获取键为app的值,并将somsuffix附加到值后面。例如,如果提前的数据Map的键为app,值为loki,那么这个阶段将把值从loki修改为lokisomsuffix。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26appspan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26spanstylecolor:d19a66;lineheight:26{{ToLower。Value}}spanspan
  这个pipeline从提取的数据中获取键为app的值,并将其值转换为小写。例如,如果提取的数据键app的值为LOKI,那么这个阶段将把值转换为小写的loki。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26outputmsgspan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26spanstylecolor:d19a66;lineheight:26{{。level}}spanforappspanstylecolor:d19a66;lineheight:26{{ToUpper。app}}spanspan
  这个pipeline从提取的数据中获取level与app的值,一个新的outputmsg将被添加到提取的数据中,值为上面模板的计算结果。
  例如,如果提取的数据中包含键为app,值为loki的数据,level的值为warn,那么经过该阶段后会添加一个新的数据,键为outputmsg,其值为warnforappLOKI。
  任何先前提取的键都可以在模板中使用,所有提取的键都可用于模板的扩展。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26appspan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26spanstylecolor:d19a66;lineheight:26{{。level}}spanforappspanstylecolor:d19a66;lineheight:26{{ToUpper。Value}}spaninmodulespanstylecolor:d19a66;lineheight:26{{。module}}spanspan
  上面的这个pipeline从提取的数据中获取level、app和module值。例如,如果提取的数据包含值为loki的app,level的值为warn,moudule的值为test,则这个阶段会将提取数据app的值更改为warnforappLOKIinmoduletest。
  任何之前获取的键都可以在模板中使用,此外,如果source是可用的,它可以在模板中被称为。Value,我们这里app被当成了source,所以它可以在模板中通过。Value使用。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26appspan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26spanstylecolor:d19a66;lineheight:26{{Replace。Valuelokiblokey1}}spanspan
  这里的模板使用Go的string。Replace函数,当模板执行时,从提取的Map数据中的键为app的全部内容将最多有1个loki的实例被改为blokey。
  另外有一个名为Entry的特殊键可以用来引用当前行,当你需要追加或预设日志行的时候,这应该会很有用。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26template:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26messagespan
  spanstylecolor:d19a66;lineheight:26template:spanspanstylecolor:98c379;lineheight:26spanstylecolor:d19a66;lineheight:26{{。app}}span:spanstylecolor:d19a66;lineheight:26{{。Entry}}spanspan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26output:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26messagespan
  例如,上面的片段会在日志行前加上应用程序的名称。
  在Loki2。3中,所有的sprig函数都被添加到了当前的模板阶段,包括ToLowerToUpper、Replace、Trim、Regex、Hash和Sha2Hash函数。处理阶段
  用于从以前阶段中提取数据并对其进行处理。timestamp
  设置日志条目的时间戳值,当时间戳阶段不存在时,日志行的时间戳默认为日志条目被抓取的时间。
  配置格式如下所示:spanstylecolor:d19a66;lineheight:26timestamp:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26stringspan
  spanstylecolor:5c6370;fontstyle:lineheight:26解析时间字符串的格式,可以只有预定义的格式有:〔ANSICUnixDateRubyDateRFC822span
  spanstylecolor:5c6370;fontstyle:lineheight:26RFC822ZRFC850RFC1123RFC1123ZRFC3339RFC3339NanoUnixspan
  spanstylecolor:5c6370;fontstyle:lineheight:26UnixMsUnixUsUnixNs〕。span
  spanstylecolor:d19a66;lineheight:26format:spanspanstylecolor:98c379;lineheight:26stringspan
  spanstylecolor:5c6370;fontstyle:lineheight:26如果格式无法解析,可尝试的fallback的格式span
  spanstylecolor:98c379;lineheight:26〔fallbackformats:spanspanstylecolor:98c379;lineheight:26〔〕string〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26IANA时区数据库字符串span
  spanstylecolor:98c379;lineheight:26〔location:spanspanstylecolor:98c379;lineheight:26string〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26在时间戳无法提取或解析的情况下,应采取何种行动。有效值为:〔skip,fudge〕,默认为fudge。span
  spanstylecolor:98c379;lineheight:26〔actiononfailure:spanspanstylecolor:98c379;lineheight:26string〕span
  其中的format字段可以参考格式如下所示:ANSIC:MonJan215:04:052006UnixDate:MonJan215:04:05MST2006RubyDate:MonJan0215:04:0507002006RFC822:02Jan0615:04MSTRFC822Z:02Jan0615:040700RFC850:Monday,02Jan0615:04:05MSTRFC1123:Mon,02Jan200615:04:05MSTRFC1123Z:Mon,02Jan200615:04:050700RFC3339:20060102T15:04:0507:00RFC3339Nano:20060102T15:04:05。99999999907:00
  另外支持常见的Unix时间戳:Unix:1562708916orwithfractions1562708916。000000123UnixMs:1562708916414UnixUs:1562708916414123UnixNs:1562708916000000123
  自定义格式是直接传递给GO的time。Parse函数中的layout参数,如果自定义格式没有指定year,Promtail会认为应该使用系统时钟的当前年份。
  自定义格式使用的语法是使用时间戳的每个组件的特定值来定义日期和时间(例如MonJan215:04:050700MST2006),下表显示了应在自定义格式中支持的参考值。
  actiononfailure设置定义了在提取的数据中不存在source字段或时间戳解析失败的情况下,应该如何处理,支持的动作有:fudge(默认):将时间戳更改为最近的已知时间戳,总计1纳秒(以保证日志顺序)skip:不改变时间戳,保留日志被Promtail抓取的时间
  比如使用下面的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26timestamp:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26timespan
  spanstylecolor:d19a66;lineheight:26format:spanspanstylecolor:98c379;lineheight:26RFC3339Nanospan
  经过上面的timestamp阶段在提取的数据中查找一个time字段,并以RFC3339Nano格式化其值(例如,20060102T15:04:05。999999907:00),所得的时间值将作为时间戳与日志行一起发送给Loki。output
  设置日志行文本,配置格式如下所示:spanstylecolor:d19a66;lineheight:26output:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26stringspan
  比如我们有一个如下配置的pipeline:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26user:spanspanstylecolor:98c379;lineheight:26userspan
  spanstylecolor:d19a66;lineheight:26message:spanspanstylecolor:98c379;lineheight:26messagespan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26user:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26output:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26messagespan
  需要收集的日志为:{spanstylecolor:d19a66;lineheight:26userspan:spanstylecolor:98c379;lineheight:26alexisspan,spanstylecolor:d19a66;lineheight:26messagespan:spanstylecolor:98c379;lineheight:26hello,world!span}
  在经过第一个json阶段后将提前以下键值对到数据中:user:alexismessage:hello,world!
  然后第二个label阶段将把useralexis添加到输出的日志标签集中,最后的output阶段将把日志数据从原来的JSON更改为message的值hello,world!输出。labels
  更新日志的标签集,并一起发送给Loki。配置格式如下所示:spanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:5c6370;fontstyle:lineheight:26Key是必须的,是将被创建的标签名称。span
  spanstylecolor:5c6370;fontstyle:lineheight:26Values是可选的,提取的数据中的名称,其值将被用于标签的值。span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果是空的,值将被推断为与键相同。span
  spanstylecolor:98c379;lineheight:26〔spanspanstylecolor:98c379;lineheight:26string:spanspanstylecolor:98c379;lineheight:26〔string〕spanspanstylecolor:98c379;lineheight:26。。。spanspanstylecolor:98c379;lineheight:26〕span
  比如我们有一个如下所示的pipeline配置:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26stream:spanspanstylecolor:98c379;lineheight:26streamspan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26stream:span
  需要处理的日志数据为:{
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan
  }
  第一个json阶段将提取stream到Map数据中,其值为stderr。然后在第二个labels阶段将把这个键值对变成一个标签,在发送到Loki的日志行中将包括标签stream,值为stderr。metrics
  根据提取的数据计算指标。需要注意的是,创建的metrics指标不会被推送到Loki,而是通过Promtail的metrics端点暴露出去,Prometheus应该被配置为可以抓取Promtail的指标,以便能够检索这个阶段所配置的指标数据。
  配置格式如下所示:spanstylecolor:5c6370;fontstyle:lineheight:26一个映射,key为metric的名称,value是特定的metric类型span
  spanstylecolor:d19a66;lineheight:26metrics:span
  spanstylecolor:98c379;lineheight:26〔string:spanspanstylecolor:98c379;lineheight:26〔spanspanstylecolor:98c379;lineheight:26metriccounterspanspanstylecolor:98c379;lineheight:26spanspanstylecolor:98c379;lineheight:26metricgaugespanspanstylecolor:98c379;lineheight:26spanspanstylecolor:98c379;lineheight:26metrichistogramspanspanstylecolor:98c379;lineheight:26〕spanspanstylecolor:98c379;lineheight:26。。。〕span
  metriccounter:定义一个Counter类型的指标,其值只会不断增加。metricgauge:定义一个Gauge类型的指标,其值可以增加或减少。metrichistogram:定义一个直方图指标。
  比如我们有一个如下所示的pipeline配置用于定义一个Counter指标:spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26metrics:span
  spanstylecolor:d19a66;lineheight:26loglinestotal:span
  spanstylecolor:d19a66;lineheight:26type:spanspanstylecolor:98c379;lineheight:26Counterspan
  spanstylecolor:d19a66;lineheight:26description:spanspanstylecolor:98c379;lineheight:26totalnumberofloglinesspan
  spanstylecolor:d19a66;lineheight:26prefix:spanspanstylecolor:98c379;lineheight:26mypromtailcustomspan
  spanstylecolor:d19a66;lineheight:26maxidleduration:spanspanstylecolor:98c379;lineheight:2624hspan
  spanstylecolor:d19a66;lineheight:26config:span
  spanstylecolor:d19a66;lineheight:26matchall:spanspanstylecolor:56b6c2;lineheight:26truespan
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26incspan
  spanstylecolor:d19a66;lineheight:26logbytestotal:span
  spanstylecolor:d19a66;lineheight:26type:spanspanstylecolor:98c379;lineheight:26Counterspan
  spanstylecolor:d19a66;lineheight:26description:spanspanstylecolor:98c379;lineheight:26totalbytesofloglinesspan
  spanstylecolor:d19a66;lineheight:26prefix:spanspanstylecolor:98c379;lineheight:26mypromtailcustomspan
  spanstylecolor:d19a66;lineheight:26maxidleduration:spanspanstylecolor:98c379;lineheight:2624hspan
  spanstylecolor:d19a66;lineheight:26config:span
  spanstylecolor:d19a66;lineheight:26matchall:spanspanstylecolor:56b6c2;lineheight:26truespan
  spanstylecolor:d19a66;lineheight:26countentrybytes:spanspanstylecolor:56b6c2;lineheight:26truespan
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26addspan
  这个流水线先创建了一个loglinestotal的Counter,通过使用matchall:true参数为每一个接收到的日志行增加。
  然后还创建了一个logbytestotal的Counter指标,通过使用countentrybytes:true参数,将收到的每个日志行的字节大小加入到指标中。
  这两个指标如果没有收到新的数据,将在24h后小时。另外这些阶段应该放在pipeline的末端,在任何标签阶段之后。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26。(?Pordersuccessordersuccessful)。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26metrics:span
  spanstylecolor:d19a66;lineheight:26successfulorderstotal:span
  spanstylecolor:d19a66;lineheight:26type:spanspanstylecolor:98c379;lineheight:26Counterspan
  spanstylecolor:d19a66;lineheight:26description:spanspanstylecolor:98c379;lineheight:26loglineswiththemessageordersuccessfulspan
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26ordersuccessspan
  spanstylecolor:d19a66;lineheight:26config:span
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26incspan
  比如上面这个pipeline首先尝试在日志中找到成功的订单,将其提取为ordersuccess字段,然后在metrics阶段创建一个名为successfulorderstotal的Counter指标,其值是在只有提取的数据中有ordersuccess的时候才会增加。这个pipeline的结果是一个指标,其值只有在Promtail抓取的日志中带有ordersuccessful文本的日志时才会增加。spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26regex:span
  spanstylecolor:d19a66;lineheight:26expression:spanspanstylecolor:98c379;lineheight:26。orderstatus(?Porderstatus。?)。span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26metrics:span
  spanstylecolor:d19a66;lineheight:26successfulorderstotal:span
  spanstylecolor:d19a66;lineheight:26type:spanspanstylecolor:98c379;lineheight:26Counterspan
  spanstylecolor:d19a66;lineheight:26description:spanspanstylecolor:98c379;lineheight:26successfulordersspan
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26orderstatusspan
  spanstylecolor:d19a66;lineheight:26config:span
  spanstylecolor:d19a66;lineheight:26value:spanspanstylecolor:98c379;lineheight:26successspan
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26incspan
  spanstylecolor:d19a66;lineheight:26failedorderstotal:span
  spanstylecolor:d19a66;lineheight:26type:spanspanstylecolor:98c379;lineheight:26Counterspan
  spanstylecolor:d19a66;lineheight:26description:spanspanstylecolor:98c379;lineheight:26failedordersspan
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26orderstatusspan
  spanstylecolor:d19a66;lineheight:26config:span
  spanstylecolor:d19a66;lineheight:26value:spanspanstylecolor:98c379;lineheight:26failspan
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26incspan
  上面这个pipeline首先会尝试在日志中找到格式为orderstatusvalue的文本,将value提取到orderstatus中。该指标阶段创建了successfulorderstotal和failedorderstotal指标,只有当提取数据中的orderstatus的值分别为success或fail时才会增加。tenant
  设置日志要使用的租户ID值,从提取数据中的一个字段获取,如果该字段缺失,将使用默认的Promtail客户端租户ID。配置格式如下所示:spanstylecolor:d19a66;lineheight:26tenant:span
  spanstylecolor:5c6370;fontstyle:lineheight:26source或value配置选项是必须的,但二者不能同时使用(它们是互斥的)span
  spanstylecolor:98c379;lineheight:26〔spanspanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26stringspanspanstylecolor:98c379;lineheight:26〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26当前阶段执行时用来设置租户ID的值。span
  spanstylecolor:5c6370;fontstyle:lineheight:26当这个阶段被包含在一个带有match的条件管道中时非常有用。span
  spanstylecolor:98c379;lineheight:26〔spanspanstylecolor:d19a66;lineheight:26value:spanspanstylecolor:98c379;lineheight:26stringspanspanstylecolor:98c379;lineheight:26〕span
  比如我们有如下所示的pipeline配置:spanstylecolor:d19a66;lineheight:26pipelinestages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26customerid:spanspanstylecolor:98c379;lineheight:26customeridspan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26tenant:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26customeridspan
  需要获取的日志数据为:{
  spanstylecolor:d19a66;lineheight:26customeridspan:spanstylecolor:98c379;lineheight:261span,
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan
  }
  第一个json阶段将提取customerid的值到Map中,值为1。在第二个租户阶段将把XScopeOrgID请求Header头(Loki用来识别租户)设置为提取的customerid的值,也就是1。
  另外一种场景是用配置的值来覆盖租户ID,如下所示的pipeline配置:spanstylecolor:d19a66;lineheight:26pipelinestages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26app:span
  spanstylecolor:d19a66;lineheight:26message:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26app:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{appapi}span
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26tenant:span
  spanstylecolor:d19a66;lineheight:26value:spanspanstylecolor:98c379;lineheight:26teamapispan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26output:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26messagespan
  需要收集的日志数据为:{
  spanstylecolor:d19a66;lineheight:26appspan:spanstylecolor:98c379;lineheight:26apispan,
  spanstylecolor:d19a66;lineheight:26logspan:spanstylecolor:98c379;lineheight:26logmessagespan,
  spanstylecolor:d19a66;lineheight:26streamspan:spanstylecolor:98c379;lineheight:26stderrspan,
  spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620190430T02:12:41。8443515Zspan
  }
  这个pipeline将:DecodeJSON日志设置标签appapi处理匹配阶段,检查{appapi}选择器是否匹配,如果匹配了则执行子阶段,也就是这里的租户阶段,覆盖值为teamapi的租户。
  此外在处理阶段还有labeldrop阶段,它从标签集中删除标签,这些标签与日志条目一起被发送到Loki。还有一个labelallow阶段,它只允许将所提供的标签包含在与日志条目一起发送给Loki的标签集中。过滤阶段
  可选择应用一个阶段的子集,或根据一些条件删除日志数据。match
  当一个日志条目与可配置的LogQL流选择器和过滤表达式相匹配时,有条件地应用一组阶段或删除日志数据。配置语法格式如下所示:spanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:5c6370;fontstyle:lineheight:26LogQL流选择器合过滤表达式。span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26stringspan
  spanstylecolor:5c6370;fontstyle:lineheight:26pipeline名称,当定义的时候,在pipelinedurationseconds直方图中创建一个额外的标签,该值与jobname使用下划线连接。span
  spanstylecolor:98c379;lineheight:26〔pipelinename:spanspanstylecolor:98c379;lineheight:26string〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26决定当选择器与ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行匹配时采取什么动作。span
  spanstylecolor:5c6370;fontstyle:lineheight:26默认是keep,当设置为drop时,ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a将被删除,以后的指标将不会被记录。span
  spanstylecolor:98c379;lineheight:26〔action:spanspanstylecolor:98c379;lineheight:26stringspanspanstylecolor:98c379;lineheight:26spanspanstylecolor:98c379;lineheight:26defaultspanspanstylecolor:98c379;lineheight:26spanspanstylecolor:98c379;lineheight:26keepspanspanstylecolor:98c379;lineheight:26〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果你指定了action:drop那么logentrydroppedlinestotal这个指标将为每一个被丢弃的行而增加span
  spanstylecolor:5c6370;fontstyle:lineheight:26默认情况下,reaseon标签是matchstage,但是你可以选择指定一个自定义值用于该指标的reason标签。span
  spanstylecolor:98c379;lineheight:26〔dropcounterreason:spanspanstylecolor:98c379;lineheight:26stringspanspanstylecolor:98c379;lineheight:26spanspanstylecolor:98c379;lineheight:26defaultspanspanstylecolor:98c379;lineheight:26spanspanstylecolor:98c379;lineheight:26matchstagespanspanstylecolor:98c379;lineheight:26〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26只有当选择器与ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的标签相匹配时,才会出现嵌套的流水线阶段:span
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:98c379;lineheight:26〔span
  spanstylecolor:98c379;lineheight:26regexstagespan
  spanstylecolor:98c379;lineheight:26jsonstagespanspanstylecolor:98c379;lineheight:26
  templatestage
  matchstage
  timestampstage
  outputstage
  labelsstage
  metricsstage
  tenantstage
  spanspanstylecolor:98c379;lineheight:26〕span
  比如我们现在有一个如下所示的pipeline配置:spanstylecolor:d19a66;lineheight:26pipelinestages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26app:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26labels:span
  spanstylecolor:d19a66;lineheight:26app:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{apploki}span
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26msg:spanspanstylecolor:98c379;lineheight:26messagespan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26pipelinename:spanspanstylecolor:98c379;lineheight:26app2span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{apppokey}span
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26keepspan
  spanstylecolor:d19a66;lineheight:26stages:span
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26json:span
  spanstylecolor:d19a66;lineheight:26expressions:span
  spanstylecolor:d19a66;lineheight:26msg:spanspanstylecolor:98c379;lineheight:26msgspan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26match:span
  spanstylecolor:d19a66;lineheight:26selector:spanspanstylecolor:98c379;lineheight:26{apppromtail}。noisyerror。span
  spanstylecolor:d19a66;lineheight:26action:spanspanstylecolor:98c379;lineheight:26dropspan
  spanstylecolor:d19a66;lineheight:26dropcounterreason:spanspanstylecolor:98c379;lineheight:26promtailnoisyerrorspan
  spanstylecolor:61lineheight:26spanspanstylecolor:d19a66;lineheight:26output:span
  spanstylecolor:d19a66;lineheight:26source:spanspanstylecolor:98c379;lineheight:26msgspan
  要处理的日志数据为:{spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620121101T22:08:4100:00span,spanstylecolor:d19a66;lineheight:26appspan:spanstylecolor:98c379;lineheight:26lokispan,spanstylecolor:d19a66;lineheight:26componentspan:〔spanstylecolor:98c379;lineheight:26parserspan,spanstylecolor:98c379;lineheight:26typespan〕,spanstylecolor:d19a66;lineheight:26levelspan:spanstylecolor:98c379;lineheight:26WARNspan,spanstylecolor:d19a66;lineheight:26messagespan:spanstylecolor:98c379;lineheight:26app1loglinespan}
  {spanstylecolor:d19a66;lineheight:26timespan:spanstylecolor:98c379;lineheight:2620121101T22:08:4100:00span,spanstylecolor:d19a66;lineheight:26appspan:spanstylecolor:98c379;lineheight:26promtailspan,spanstylecolor:d19a66;lineheight:26componentspan:〔spanstylecolor:98c379;lineheight:26parserspan,spanstylecolor:98c379;lineheight:26typespan〕,spanstylecolor:d19a66;lineheight:26levelspan:spanstylecolor:98c379;lineheight:26ERRORspan,spanstylecolor:d19a66;lineheight:26messagespan:spanstylecolor:98c379;lineheight:26foonoisyerrorspan}
  第一个json阶段将在第一个日志行的提取Map数据中添加值apploki,然后经过第二个labels阶段将app转换成一个标签。对于第二行日志也遵循同样的流程,只是值变成了promtail。
  然后在第三个match阶段使用LogQL表达式{apploki}进行匹配,只有在标签apploki的时候才会执行嵌套json阶段,这里合我们的第一行日志是匹配的,然后嵌套的json阶段将message数据提取到Map数据中,key变成了msg,值为app1logline。
  接下来执行第四个match阶段,需要匹配apppokey,很显然这里我们都不匹配,所以嵌套的json子阶段不会被执行。
  然后执行的第五个match阶段,将会删掉任何具有apppromtail标签并包括noisyerror文本的日志数据,并且还将增加logentrydroplinestotal指标,标签为reasonpromtailnoisyerror。
  最后的output输出阶段将日志行的内容改为提取数据中的msg的值。我们这里的示例最后输出为app1logline。drop
  drop阶段可以让我们根据配置来删除日志。需要注意的是,如果你提供多个选项配置,它们将被视为AND子句,其中每个选项必须为真才能删除日志。如果你想用一个OR子句来删除,那么就指定多个删除阶段。配置语法格式如下所示:spanstylecolor:d19a66;lineheight:26drop:span
  spanstylecolor:98c379;lineheight:26〔source:spanspanstylecolor:98c379;lineheight:26string〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26RE2正则表达式,如果提供了source,则会尝试匹配sourcespan
  spanstylecolor:5c6370;fontstyle:lineheight:26如果没有提供source,则会尝试匹配ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行数据span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果提供的正则匹配了ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行或者source,则该行ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a将被删除。span
  spanstylecolor:98c379;lineheight:26〔expression:spanspanstylecolor:98c379;lineheight:26string〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26只有在指定source源的情况下才能指定value值。span
  spanstylecolor:5c6370;fontstyle:lineheight:26指定value与regex是错误的。span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果提供的值与source完全匹配,该行将被删除。span
  spanstylecolor:98c379;lineheight:26〔value:spanspanstylecolor:98c379;lineheight:26string〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26olderthan被解析为Goduration格式span
  spanstylecolor:5c6370;fontstyle:lineheight:26如果ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行的时间戳大于当前时间减去所提供的时间,则将被删除span
  spanstylecolor:98c379;lineheight:26〔olderthan:spanspanstylecolor:98c379;lineheight:26duration〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26longerthan是一个以bytes为单位的值,任何超过这个值的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行都将被删除。span
  spanstylecolor:5c6370;fontstyle:lineheight:26可以指定为整数格式的字节数:8192,或者带后缀的8kbspan
  spanstylecolor:98c379;lineheight:26〔longerthan:spanspanstylecolor:98c379;lineheight:26stringint〕span
  spanstylecolor:5c6370;fontstyle:lineheight:26每当一个ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a行数据被删除,指标logentrydroppedlinestotal都。。。
投诉 评论 转载

全球银行最大分布式核心系统全面上线,邮储银行做到了!2022年4月,中国邮政储蓄银行(以下简称邮储银行)新一代个人业务分布式核心系统全面投产上线。该系统是首个由大型银行同时采用企业级业务建模和分布式微服务架构打造的个人业务分布式……PromtailPipeline日志处理配置Promtail是Loki官方支持的日志采集端,在需要采集日志的节点上运行采集代理,再统一发送到Loki进行处理。除了使用Promtail,社区还有很多采集日志的组件,比如fl……中国传音,非洲之王,却走不出低端困局文虚渊玄2月27日,巴塞罗那MWC2023世界移动通信大会正式开幕,来自全球的移动通信企业向世界展示了最新的移动通信技术与产品。后疫情时代,在全球智能手机销量下滑的……全国人大代表薛超加快发展互联网教育支持宁夏创建国家教育数字化2018年,宁夏获批建设全国互联网教育示范省(区),大力发展互联网教育,实现数字教育资源覆盖基础教育所有学科,200M互联网接入、在线互动教室建设、数字校园建设覆盖所有学校,数……从奇想照进现实雅典Freak二十二年进化史〔腕表之家钟表文化〕硅,被称作钟表业最跨时代的革新,雅典作为最先将硅材质领入制表界的品牌,在2001年,以Freak奇想的诞生,开创了钟表领域的硅时代。前一阵,品牌正携多款珍稀……这些流行的滋补品,还不如鸡蛋有营养?别乱交智商税了上了年纪后,大家开始注重养生和健康。平时坚持运动,吃好睡好外很多人会通过营养品保健品来滋补自己的身体。比如海参,燕窝,桃胶,鱼翅等等。平时逢年过节,老人也会收到这样的礼品。很多……春天10道鲜香可口的诱人美食,营养丰富又简单,第七道真解馋春耕进行时大家好,欢迎大家来到我的美食自媒体,我是美食领域创作者锦绣V山东:专注美食,让生活更有味。今天为大家带来了几道家常美食的做法,这几道美食也是深受大家的喜欢,而且是很常……申京1610火箭8人得分上双胜马刺终结11连败!NBA常规赛3月5日继续进行,最终,火箭以122110战胜马刺,火箭终结了自己的11连败!首节开始,双方开场打到88平手后波特发威连拿6分率队打出一波102拉开分差。格拉……与ModelY同台拆车!看看中国品牌的真正实力!特斯拉所带来的鲶鱼效应,在中国新能源车市场体现得淋漓尽致,自从他们的上海工厂落地并实现投产以来,国内的智能电动车市场瞬间变得风起云涌。由于前期进口身份的ModelX和Model……春天多吃甘,一年病不沾,建议大家多吃5样,滋养肝脾,少生病导语:春天多吃甘,一年病不沾,建议大家多吃5样,滋养肝脾,少生病春天是养生的好时节,要懂得在饮食上多调整,吃对了身体更健康!俗话说春食甘,病不沾,大家可以多吃些甘味食物,……杨幂起诉黑粉,庭审内容露马脚,还不承认整容?互联网的兴起,让网上有了越来越多的键盘侠。明星对网络维权意识也越来越强烈,有很多明星都起诉过发表诋毁和造谣文章的黑粉,比如说像王鸥、张艺兴、杨幂等等。用法律手段为自己维权……自从孩子学舞蹈后,我才知道什么是北美妈妈们的高级卷看点在北美,舞蹈向来是北美妈妈圈们最为青睐的兴趣班之一。下文中的华人妈妈Nana,以自己的亲身经历,讲述了有关北美舞蹈妈妈们丰富多彩的推娃故事。她发现在培养女儿舞蹈兴趣和爱好上……
闪投什么意思投放中零展现怎么办高价词怎么会匹配到从士官生到总司令拿破仑故事之一军事造句用军事造句大全上海国企现代企业制度的发展现状与趋势薏米红豆黑豆粥的做法有哪些假期莫让孩子心理感冒方天造句用方天造句大全云顶之弈双人模式法师永恩双T0组合成型必吃分,抢节奏无惧同行边城绥芬河绘就浪漫山水画卷周公解读大全梦见发工资和涨工资到底是好是坏当它造句用当它造句大全共享系素养

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找