<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LogQL: Log query language on Grafana Labs</title><link>https://grafana.com/docs/loki/v2.9.x/query/</link><description>Recent content in LogQL: Log query language on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/loki/v2.9.x/query/index.xml" rel="self" type="application/rss+xml"/><item><title>Log queries</title><link>https://grafana.com/docs/loki/v2.9.x/query/log_queries/</link><pubDate>Thu, 10 Apr 2025 12:15:54 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/log_queries/</guid><content><![CDATA[&lt;h1 id=&#34;log-queries&#34;&gt;Log queries&lt;/h1&gt;
&lt;p&gt;All LogQL queries contain a &lt;strong&gt;log stream selector&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;./query_components.png&#34;
  alt=&#34;parts of a query&#34;/&gt;&lt;/p&gt;
&lt;p&gt;Optionally, the log stream selector can be followed by a &lt;strong&gt;log pipeline&lt;/strong&gt;. A log pipeline is a set of stage expressions that are chained together and applied to the selected log streams. Each expression can filter out, parse, or mutate log lines and their respective labels.&lt;/p&gt;
&lt;p&gt;The following example shows a full log query in action:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{container=&amp;#34;query-frontend&amp;#34;,namespace=&amp;#34;loki-dev&amp;#34;} |= &amp;#34;metrics.go&amp;#34; | logfmt | duration &amp;gt; 10s and throughput_mb &amp;lt; 500&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The query is composed of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a log stream selector &lt;code&gt;{container=&amp;quot;query-frontend&amp;quot;,namespace=&amp;quot;loki-dev&amp;quot;}&lt;/code&gt; which targets the &lt;code&gt;query-frontend&lt;/code&gt; container  in the &lt;code&gt;loki-dev&lt;/code&gt; namespace.&lt;/li&gt;
&lt;li&gt;a log pipeline &lt;code&gt;|= &amp;quot;metrics.go&amp;quot; | logfmt | duration &amp;gt; 10s and throughput_mb &amp;lt; 500&lt;/code&gt; which will filter out log that contains the word &lt;code&gt;metrics.go&lt;/code&gt;, then parses each log line to extract more labels and filter with them.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;To avoid escaping special characters you can use the &lt;code&gt;`&lt;/code&gt;(backtick) instead of &lt;code&gt;&amp;quot;&lt;/code&gt; when quoting strings.
For example &lt;code&gt;`\w&#43;`&lt;/code&gt; is the same as &lt;code&gt;&amp;quot;\\w&#43;&amp;quot;&lt;/code&gt;.
This is specially useful when writing a regular expression which contains multiple backslashes that require escaping.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;log-stream-selector&#34;&gt;Log stream selector&lt;/h2&gt;
&lt;p&gt;The stream selector determines which log streams to include in a query&amp;rsquo;s results.
A log stream is a unique source of log content, such as a file.
A more granular log stream selector then reduces the number of searched streams to a manageable volume.
This means that the labels passed to the log stream selector will affect the relative performance of the query&amp;rsquo;s execution.&lt;/p&gt;
&lt;p&gt;The log stream selector is specified by one or more comma-separated key-value pairs. Each key is a log label and each value is that label&amp;rsquo;s value.
Curly braces (&lt;code&gt;{&lt;/code&gt; and &lt;code&gt;}&lt;/code&gt;) delimit the stream selector.&lt;/p&gt;
&lt;p&gt;Consider this stream selector:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{app=&amp;#34;mysql&amp;#34;,name=&amp;#34;mysql-backup&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All log streams that have both a label of &lt;code&gt;app&lt;/code&gt; whose value is &lt;code&gt;mysql&lt;/code&gt;
and a label of &lt;code&gt;name&lt;/code&gt; whose value is &lt;code&gt;mysql-backup&lt;/code&gt; will be included in
the query results.
A stream may contain other pairs of labels and values,
but only the specified pairs within the stream selector are used to determine
which streams will be included within the query results.&lt;/p&gt;
&lt;p&gt;The same rules that apply for &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/basics/#instant-vector-selectors&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Prometheus Label Selectors&lt;/a&gt; apply for Grafana Loki log stream selectors.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;=&lt;/code&gt; operator after the label name is a &lt;strong&gt;label matching operator&lt;/strong&gt;.
The following label matching operators are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;=&lt;/code&gt;: exactly equal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!=&lt;/code&gt;: not equal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;=~&lt;/code&gt;: regex matches&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!~&lt;/code&gt;: regex does not match&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regex log stream examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{name =~ &amp;quot;mysql.&#43;&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{name !~ &amp;quot;mysql.&#43;&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{name !~ `mysql-\d&#43;`}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Unlike the &lt;a href=&#34;#line-filter-expression&#34;&gt;line filter regex expressions&lt;/a&gt;, the &lt;code&gt;=~&lt;/code&gt; and &lt;code&gt;!~&lt;/code&gt; regex operators are fully anchored.
This means that the regex expression must match against the &lt;em&gt;entire&lt;/em&gt; string, &lt;strong&gt;including newlines&lt;/strong&gt;.
The regex &lt;code&gt;.&lt;/code&gt; character does not match newlines by default. If you want the regex dot character to match newlines you can use the single-line flag, like so: &lt;code&gt;(?s)search_term.&#43;&lt;/code&gt; matches &lt;code&gt;search_term\n&lt;/code&gt;.
Alternatively, you can use the &lt;code&gt;\s&lt;/code&gt; (match whitespaces, including newline) in combination with &lt;code&gt;\S&lt;/code&gt; (match not whitespace characters) to match all characters, including newlines.
Refer to &lt;a href=&#34;https://github.com/google/re2/wiki/Syntax&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google&amp;rsquo;s RE2 syntax&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;Regex log stream newlines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{name =~ &amp;quot;.*mysql.*&amp;quot;}&lt;/code&gt;: does not match log label values with newline character&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{name =~ &amp;quot;(?s).*mysql.*}&lt;/code&gt;: match log label values with newline character&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{name =~ &amp;quot;[\S\s]*mysql[\S\s]*}&lt;/code&gt;: match log label values with newline character&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;log-pipeline&#34;&gt;Log pipeline&lt;/h2&gt;
&lt;p&gt;A log pipeline can be appended to a log stream selector to further process and filter log streams. It is composed of a set of expressions. Each expression is executed in left to right sequence for each log line. If an expression filters out a log line, the pipeline will stop processing the current log line and start processing the next log line.&lt;/p&gt;
&lt;p&gt;Some expressions can mutate the log content and respective labels,
which will be then be available for further filtering and processing in subsequent expressions.
An example that mutates is the expression&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;| line_format &amp;#34;{{.status_code}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Log pipeline expressions fall into one of four categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filtering expressions: &lt;a href=&#34;#line-filter-expression&#34;&gt;line filter expressions&lt;/a&gt;
and
&lt;a href=&#34;#label-filter-expression&#34;&gt;label filter expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#parser-expression&#34;&gt;Parsing expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Formatting expressions: &lt;a href=&#34;#line-format-expression&#34;&gt;line format expressions&lt;/a&gt;
and
&lt;a href=&#34;#labels-format-expression&#34;&gt;label format expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Labels expressions: &lt;a href=&#34;#drop-labels-expression&#34;&gt;drop labels expression&lt;/a&gt; and &lt;a href=&#34;#keep-labels-expression&#34;&gt;keep labels expression&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;line-filter-expression&#34;&gt;Line filter expression&lt;/h3&gt;
&lt;p&gt;The line filter expression does a distributed &lt;code&gt;grep&lt;/code&gt;
over the aggregated logs from the matching log streams.
It searches the contents of the log line,
discarding those lines that do not match the case-sensitive expression.&lt;/p&gt;
&lt;p&gt;Each line filter expression has a &lt;strong&gt;filter operator&lt;/strong&gt;
followed by text or a regular expression.
These filter operators are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;|=&lt;/code&gt;: Log line contains string&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!=&lt;/code&gt;: Log line does not contain string&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|~&lt;/code&gt;: Log line contains a match to the regular expression&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!~&lt;/code&gt;: Log line does not contain a match to the regular expression&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Unlike the &lt;a href=&#34;#log-stream-selector&#34;&gt;label matcher regex operators&lt;/a&gt;, the &lt;code&gt;|~&lt;/code&gt; and &lt;code&gt;!~&lt;/code&gt; regex operators are not fully anchored.
This means that the &lt;code&gt;.&lt;/code&gt; regex character matches all characters, &lt;strong&gt;including newlines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Line filter expression examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Keep log lines that have the substring &amp;ldquo;error&amp;rdquo;:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;|= &amp;#34;error&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A complete query using this example:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{job=&amp;#34;mysql&amp;#34;} |= &amp;#34;error&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Discard log lines that have the substring &amp;ldquo;kafka.server:type=ReplicaManager&amp;rdquo;:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;!= &amp;#34;kafka.server:type=ReplicaManager&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A complete query using this example:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{instance=~&amp;#34;kafka-[23]&amp;#34;,name=&amp;#34;kafka&amp;#34;} != &amp;#34;kafka.server:type=ReplicaManager&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep log lines that contain a substring that starts with &lt;code&gt;tsdb-ops&lt;/code&gt; and ends with &lt;code&gt;io:2003&lt;/code&gt;. A complete query with a regular expression:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{name=&amp;#34;kafka&amp;#34;} |~ &amp;#34;tsdb-ops.*io:2003&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep log lines that contain a substring that starts with &lt;code&gt;error=&lt;/code&gt;,
and is followed by 1 or more word characters. A complete query with a regular expression:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{name=&amp;#34;cassandra&amp;#34;} |~  `error=\w&amp;#43;`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Filter operators can be chained.
Filters are applied sequentially.
Query results will have satisfied every filter.
This complete query example will give results that include the string &lt;code&gt;error&lt;/code&gt;,
and do not include the string &lt;code&gt;timeout&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;mysql&amp;#34;} |= &amp;#34;error&amp;#34; != &amp;#34;timeout&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When using &lt;code&gt;|~&lt;/code&gt; and &lt;code&gt;!~&lt;/code&gt;, Go (as in &lt;a href=&#34;https://golang.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Golang&lt;/a&gt;) &lt;a href=&#34;https://github.com/google/re2/wiki/Syntax&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;RE2 syntax&lt;/a&gt; regex may be used.
The matching is case-sensitive by default.
Switch to case-insensitive matching by prefixing the regular expression
with &lt;code&gt;(?i)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;While line filter expressions could be placed anywhere within a log pipeline,
it is almost always better to have them at the beginning.
Placing them at the beginning improves the performance of the query,
as it only does further processing when a line matches.
For example,
while the results will be the same,
the query specified with&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{job=&amp;#34;mysql&amp;#34;} |= &amp;#34;error&amp;#34; | json | line_format &amp;#34;{{.err}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will always run faster than&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{job=&amp;#34;mysql&amp;#34;} | json | line_format &amp;#34;{{.message}}&amp;#34; |= &amp;#34;error&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Line filter expressions are the fastest way to filter logs once the
log stream selectors have been applied.&lt;/p&gt;
&lt;p&gt;Line filter expressions have support matching IP addresses. See &lt;a href=&#34;../ip/&#34;&gt;Matching IP addresses&lt;/a&gt; for details.&lt;/p&gt;
&lt;h3 id=&#34;removing-color-codes&#34;&gt;Removing color codes&lt;/h3&gt;
&lt;p&gt;Line filter expressions support stripping ANSI sequences (color codes) from
the line:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{job=&amp;#34;example&amp;#34;} | decolorize&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;label-filter-expression&#34;&gt;Label filter expression&lt;/h3&gt;
&lt;p&gt;Label filter expression allows filtering log line using their original and extracted labels. It can contain multiple predicates.&lt;/p&gt;
&lt;p&gt;A predicate contains a &lt;strong&gt;label identifier&lt;/strong&gt;, an &lt;strong&gt;operation&lt;/strong&gt; and a &lt;strong&gt;value&lt;/strong&gt; to compare the label with.&lt;/p&gt;
&lt;p&gt;For example with &lt;code&gt;cluster=&amp;quot;namespace&amp;quot;&lt;/code&gt; the cluster is the label identifier, the operation is &lt;code&gt;=&lt;/code&gt; and the value is &amp;ldquo;namespace&amp;rdquo;. The label identifier is always on the left side of the operation.&lt;/p&gt;
&lt;p&gt;We support multiple &lt;strong&gt;value&lt;/strong&gt; types which are automatically inferred from the query input.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt; is double quoted or backticked such as &lt;code&gt;&amp;quot;200&amp;quot;&lt;/code&gt; or `&lt;code&gt;us-central1&lt;/code&gt;`.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://golang.org/pkg/time/#ParseDuration&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Duration&lt;/a&gt;&lt;/strong&gt; is a sequence of decimal numbers, each with optional fraction and a unit suffix, such as &amp;ldquo;300ms&amp;rdquo;, &amp;ldquo;1.5h&amp;rdquo; or &amp;ldquo;2h45m&amp;rdquo;. Valid time units are &amp;ldquo;ns&amp;rdquo;, &amp;ldquo;us&amp;rdquo; (or &amp;ldquo;µs&amp;rdquo;), &amp;ldquo;ms&amp;rdquo;, &amp;ldquo;s&amp;rdquo;, &amp;ldquo;m&amp;rdquo;, &amp;ldquo;h&amp;rdquo;. The value of the label identifier used for comparison must be a string with a unit suffix to be parsed correctly, such as &amp;ldquo;0.10ms&amp;rdquo; or &amp;ldquo;1h30m&amp;rdquo;. Optionally, &lt;code&gt;label_format&lt;/code&gt; can be used to modify the value and append the unit before making the comparison.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Number&lt;/strong&gt; are floating-point number (64bits), such as&lt;code&gt;250&lt;/code&gt;, &lt;code&gt;89.923&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bytes&lt;/strong&gt; is a sequence of decimal numbers, each with optional fraction and a unit suffix, such as &amp;ldquo;42MB&amp;rdquo;, &amp;ldquo;1.5KiB&amp;rdquo; or &amp;ldquo;20B&amp;rdquo;. Valid bytes units are &amp;ldquo;B&amp;rdquo;, &amp;ldquo;kB&amp;rdquo;, &amp;ldquo;MB&amp;rdquo;, &amp;ldquo;GB&amp;rdquo;, &amp;ldquo;TB&amp;rdquo;, &amp;ldquo;KB&amp;rdquo;, &amp;ldquo;KiB&amp;rdquo;, &amp;ldquo;MiB&amp;rdquo;, &amp;ldquo;GiB&amp;rdquo;, &amp;ldquo;TiB&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;String type work exactly like Prometheus label matchers use in &lt;a href=&#34;#log-stream-selector&#34;&gt;log stream selector&lt;/a&gt;. This means you can use the same operations (&lt;code&gt;=&lt;/code&gt;,&lt;code&gt;!=&lt;/code&gt;,&lt;code&gt;=~&lt;/code&gt;,&lt;code&gt;!~&lt;/code&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The string type is the only one that can filter out a log line with a label &lt;code&gt;__error__&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Using Duration, Number and Bytes will convert the label value prior to comparision and support the following comparators:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;==&lt;/code&gt; or &lt;code&gt;=&lt;/code&gt; for equality.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!=&lt;/code&gt; for inequality.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;gt;=&lt;/code&gt; for greater than and greater than or equal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;lt;=&lt;/code&gt; for lesser than and lesser than or equal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For instance, &lt;code&gt;logfmt | duration &amp;gt; 1m and bytes_consumed &amp;gt; 20MB&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If the conversion of the label value fails, the log line is not filtered and an &lt;code&gt;__error__&lt;/code&gt; label is added. To filters those errors see the &lt;a href=&#34;../#pipeline-errors&#34;&gt;pipeline errors&lt;/a&gt; section.&lt;/p&gt;
&lt;p&gt;You can chain multiple predicates using &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; which respectively express the &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; binary operations. &lt;code&gt;and&lt;/code&gt; can be equivalently expressed by a comma, a space or another pipe. Label filters can be place anywhere in a log pipeline.&lt;/p&gt;
&lt;p&gt;This means that all the following expressions are equivalent:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;| duration &amp;gt;= 20ms or size == 20KB and method!~&amp;#34;2..&amp;#34;
| duration &amp;gt;= 20ms or size == 20KB | method!~&amp;#34;2..&amp;#34;
| duration &amp;gt;= 20ms or size == 20KB , method!~&amp;#34;2..&amp;#34;
| duration &amp;gt;= 20ms or size == 20KB  method!~&amp;#34;2..&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The precedence for evaluation of multiple predicates is left to right. You can wrap predicates with parenthesis to force a different precedence.&lt;/p&gt;
&lt;p&gt;These examples are equivalent:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;| duration &amp;gt;= 20ms or method=&amp;#34;GET&amp;#34; and size &amp;lt;= 20KB
| ((duration &amp;gt;= 20ms or method=&amp;#34;GET&amp;#34;) and size &amp;lt;= 20KB)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To evaluate the logical &lt;code&gt;and&lt;/code&gt; first, use parenthesis, as in this example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;| duration &amp;gt;= 20ms or (method=&amp;#34;GET&amp;#34; and size &amp;lt;= 20KB)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Label filter expressions are the only expression allowed after the unwrap expression. This is mainly to allow filtering errors from the metric extraction.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Label filter expressions have support matching IP addresses. See &lt;a href=&#34;../ip/&#34;&gt;Matching IP addresses&lt;/a&gt; for details.&lt;/p&gt;
&lt;h3 id=&#34;parser-expression&#34;&gt;Parser expression&lt;/h3&gt;
&lt;p&gt;Parser expression can parse and extract labels from the log content. Those extracted labels can then be used for filtering using &lt;a href=&#34;#label-filter-expression&#34;&gt;label filter expressions&lt;/a&gt; or for &lt;a href=&#34;../metric_queries/&#34;&gt;metric aggregations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Extracted label keys are automatically sanitized by all parsers, to follow Prometheus metric name convention.(They can only contain ASCII letters and digits, as well as underscores and colons. They cannot start with a digit.)&lt;/p&gt;
&lt;p&gt;For instance, the pipeline &lt;code&gt;| json&lt;/code&gt; will produce the following mapping:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JSON&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;{ &amp;#34;a.b&amp;#34;: {c: &amp;#34;d&amp;#34;}, e: &amp;#34;f&amp;#34; }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;-&amp;gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{a_b_c=&amp;#34;d&amp;#34;, e=&amp;#34;f&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In case of errors, for instance if the line is not in the expected format, the log line won&amp;rsquo;t be filtered but instead will get a new &lt;code&gt;__error__&lt;/code&gt; label added.&lt;/p&gt;
&lt;p&gt;If an extracted label key name already exists in the original log stream, the extracted label key will be suffixed with the &lt;code&gt;_extracted&lt;/code&gt; keyword to make the distinction between the two labels. You can forcefully override the original label using a &lt;a href=&#34;#labels-format-expression&#34;&gt;label formatter expression&lt;/a&gt;. However, if an extracted key appears twice, only the first label value will be kept.&lt;/p&gt;
&lt;p&gt;Loki supports  &lt;a href=&#34;#json&#34;&gt;JSON&lt;/a&gt;, &lt;a href=&#34;#logfmt&#34;&gt;logfmt&lt;/a&gt;, &lt;a href=&#34;#pattern&#34;&gt;pattern&lt;/a&gt;, &lt;a href=&#34;#regular-expression&#34;&gt;regexp&lt;/a&gt; and &lt;a href=&#34;#unpack&#34;&gt;unpack&lt;/a&gt; parsers.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easier to use the predefined parsers &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;logfmt&lt;/code&gt; when you can. If you can&amp;rsquo;t, the &lt;code&gt;pattern&lt;/code&gt; and &lt;code&gt;regexp&lt;/code&gt; parsers can be used for log lines with an unusual structure. The &lt;code&gt;pattern&lt;/code&gt; parser is easier and faster to write; it also outperforms the &lt;code&gt;regexp&lt;/code&gt; parser.
Multiple parsers can be used by a single log pipeline. This is useful for parsing complex logs. There are examples in &lt;a href=&#34;../query_examples/#examples-that-use-multiple-parsers&#34;&gt;Multiple parsers&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;json&#34;&gt;JSON&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;json&lt;/strong&gt; parser operates in two modes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;without&lt;/strong&gt; parameters:&lt;/p&gt;
&lt;p&gt;Adding &lt;code&gt;| json&lt;/code&gt; to your pipeline will extract all json properties as labels if the log line is a valid json document.
Nested properties are flattened into label keys using the &lt;code&gt;_&lt;/code&gt; separator.&lt;/p&gt;
&lt;p&gt;Note: &lt;strong&gt;Arrays are skipped&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example the json parsers will extract from the following document:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JSON&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;#34;protocol&amp;#34;: &amp;#34;HTTP/2.0&amp;#34;,
    &amp;#34;servers&amp;#34;: [&amp;#34;129.0.1.1&amp;#34;,&amp;#34;10.2.1.3&amp;#34;],
    &amp;#34;request&amp;#34;: {
        &amp;#34;time&amp;#34;: &amp;#34;6.032&amp;#34;,
        &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;,
        &amp;#34;host&amp;#34;: &amp;#34;foo.grafana.net&amp;#34;,
        &amp;#34;size&amp;#34;: &amp;#34;55&amp;#34;,
        &amp;#34;headers&amp;#34;: {
          &amp;#34;Accept&amp;#34;: &amp;#34;*/*&amp;#34;,
          &amp;#34;User-Agent&amp;#34;: &amp;#34;curl/7.68.0&amp;#34;
        }
    },
    &amp;#34;response&amp;#34;: {
        &amp;#34;status&amp;#34;: 401,
        &amp;#34;size&amp;#34;: &amp;#34;228&amp;#34;,
        &amp;#34;latency_seconds&amp;#34;: &amp;#34;6.031&amp;#34;
    }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following list of labels:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;protocol&amp;#34; =&amp;gt; &amp;#34;HTTP/2.0&amp;#34;
&amp;#34;request_time&amp;#34; =&amp;gt; &amp;#34;6.032&amp;#34;
&amp;#34;request_method&amp;#34; =&amp;gt; &amp;#34;GET&amp;#34;
&amp;#34;request_host&amp;#34; =&amp;gt; &amp;#34;foo.grafana.net&amp;#34;
&amp;#34;request_size&amp;#34; =&amp;gt; &amp;#34;55&amp;#34;
&amp;#34;response_status&amp;#34; =&amp;gt; &amp;#34;401&amp;#34;
&amp;#34;response_size&amp;#34; =&amp;gt; &amp;#34;228&amp;#34;
&amp;#34;response_latency_seconds&amp;#34; =&amp;gt; &amp;#34;6.031&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;with&lt;/strong&gt; parameters:&lt;/p&gt;
&lt;p&gt;Using &lt;code&gt;| json label=&amp;quot;expression&amp;quot;, another=&amp;quot;expression&amp;quot;&lt;/code&gt; in your pipeline will extract only the
specified json fields to labels. You can specify one or more expressions in this way, the same
as &lt;a href=&#34;#labels-format-expression&#34;&gt;&lt;code&gt;label_format&lt;/code&gt;&lt;/a&gt;; all expressions must be quoted.&lt;/p&gt;
&lt;p&gt;Currently, we only support field access (&lt;code&gt;my.field&lt;/code&gt;, &lt;code&gt;my[&amp;quot;field&amp;quot;]&lt;/code&gt;) and array access (&lt;code&gt;list[0]&lt;/code&gt;), and any combination
of these in any level of nesting (&lt;code&gt;my.list[0][&amp;quot;field&amp;quot;]&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;| json first_server=&amp;quot;servers[0]&amp;quot;, ua=&amp;quot;request.headers[\&amp;quot;User-Agent\&amp;quot;]&lt;/code&gt; will extract from the following document:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JSON&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;#34;protocol&amp;#34;: &amp;#34;HTTP/2.0&amp;#34;,
    &amp;#34;servers&amp;#34;: [&amp;#34;129.0.1.1&amp;#34;,&amp;#34;10.2.1.3&amp;#34;],
    &amp;#34;request&amp;#34;: {
        &amp;#34;time&amp;#34;: &amp;#34;6.032&amp;#34;,
        &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;,
        &amp;#34;host&amp;#34;: &amp;#34;foo.grafana.net&amp;#34;,
        &amp;#34;size&amp;#34;: &amp;#34;55&amp;#34;,
        &amp;#34;headers&amp;#34;: {
          &amp;#34;Accept&amp;#34;: &amp;#34;*/*&amp;#34;,
          &amp;#34;User-Agent&amp;#34;: &amp;#34;curl/7.68.0&amp;#34;
        }
    },
    &amp;#34;response&amp;#34;: {
        &amp;#34;status&amp;#34;: 401,
        &amp;#34;size&amp;#34;: &amp;#34;228&amp;#34;,
        &amp;#34;latency_seconds&amp;#34;: &amp;#34;6.031&amp;#34;
    }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following list of labels:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;first_server&amp;#34; =&amp;gt; &amp;#34;129.0.1.1&amp;#34;
&amp;#34;ua&amp;#34; =&amp;gt; &amp;#34;curl/7.68.0&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If an array or an object returned by an expression, it will be assigned to the label in json format.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;| json server_list=&amp;quot;servers&amp;quot;, headers=&amp;quot;request.headers&amp;quot;&lt;/code&gt; will extract:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;server_list&amp;#34; =&amp;gt; `[&amp;#34;129.0.1.1&amp;#34;,&amp;#34;10.2.1.3&amp;#34;]`
&amp;#34;headers&amp;#34; =&amp;gt; `{&amp;#34;Accept&amp;#34;: &amp;#34;*/*&amp;#34;, &amp;#34;User-Agent&amp;#34;: &amp;#34;curl/7.68.0&amp;#34;}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If the label to be extracted is same as the original JSON field, expression can be written as just &lt;code&gt;| json &amp;lt;label&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For example, to extract &lt;code&gt;servers&lt;/code&gt; fields as label, expression can be written as following&lt;/p&gt;
&lt;p&gt;&lt;code&gt;| json servers&lt;/code&gt; will extract:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;servers&amp;#34; =&amp;gt; `[&amp;#34;129.0.1.1&amp;#34;,&amp;#34;10.2.1.3&amp;#34;]`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that &lt;code&gt;| json servers&lt;/code&gt; is same as &lt;code&gt;| json servers=&amp;quot;servers&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;logfmt&#34;&gt;logfmt&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;logfmt&lt;/strong&gt; parser can operate in two modes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;without&lt;/strong&gt; parameters:&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;logfmt&lt;/strong&gt; parser can be added using &lt;code&gt;| logfmt&lt;/code&gt; and will extract all keys and values from the &lt;a href=&#34;https://brandur.org/logfmt&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;logfmt&lt;/a&gt; formatted log line.&lt;/p&gt;
&lt;p&gt;For example the following log line:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logfmt&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logfmt&#34;&gt;at=info method=GET path=/ host=grafana.net fwd=&amp;#34;124.133.124.161&amp;#34; service=8ms status=200&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will result in having the following labels extracted:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;at&amp;#34; =&amp;gt; &amp;#34;info&amp;#34;
&amp;#34;method&amp;#34; =&amp;gt; &amp;#34;GET&amp;#34;
&amp;#34;path&amp;#34; =&amp;gt; &amp;#34;/&amp;#34;
&amp;#34;host&amp;#34; =&amp;gt; &amp;#34;grafana.net&amp;#34;
&amp;#34;fwd&amp;#34; =&amp;gt; &amp;#34;124.133.124.161&amp;#34;
&amp;#34;service&amp;#34; =&amp;gt; &amp;#34;8ms&amp;#34;
&amp;#34;status&amp;#34; =&amp;gt; &amp;#34;200&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;with&lt;/strong&gt; parameters:&lt;/p&gt;
&lt;p&gt;Similar to &lt;a href=&#34;#json&#34;&gt;JSON&lt;/a&gt;, using &lt;code&gt;| logfmt label=&amp;quot;expression&amp;quot;, another=&amp;quot;expression&amp;quot;&lt;/code&gt; in the pipeline will result in extracting only the fields specified by the labels.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;| logfmt host, fwd_ip=&amp;quot;fwd&amp;quot;&lt;/code&gt; will extract the labels &lt;code&gt;host&lt;/code&gt; and &lt;code&gt;fwd&lt;/code&gt; from the following log line:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logfmt&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logfmt&#34;&gt;at=info method=GET path=/ host=grafana.net fwd=&amp;#34;124.133.124.161&amp;#34; service=8ms status=200&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And rename &lt;code&gt;fwd&lt;/code&gt; to &lt;code&gt;fwd_ip&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;host&amp;#34; =&amp;gt; &amp;#34;grafana.net&amp;#34;
&amp;#34;fwd_ip&amp;#34; =&amp;gt; &amp;#34;124.133.124.161&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The logfmt parser also supports the following flags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--strict&lt;/code&gt; to enable strict parsing&lt;/p&gt;
&lt;p&gt;With strict parsing enabled, the logfmt parser immediately stops scanning the log line and returns early with an error when it encounters any poorly formatted key/value pair.&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;// accepted key/value pairs
key=value key=&amp;#34;value in double quotes&amp;#34;

// invalid key/value pairs
=value // no key
foo=bar=buzz
fo&amp;#34;o=bar&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Without the &lt;code&gt;--strict&lt;/code&gt; flag the parser skips invalid key/value pairs and continues parsing the rest of the log line.
Non-strict mode offers the flexibility to parse semi-structed log lines, though note that this is only best-effort.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--keep-empty&lt;/code&gt; to retain standalone keys with empty value&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;--keep-empty&lt;/code&gt; flag set, the logfmt parser retains standalone keys(keys without a value) as labels with value set to empty string.
If the standalone key is explicitly requested using label extraction parameters, there is no need to add this flag.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: flags if any should appear right after logfmt and before label extraction parameters&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;| logfmt --strict
| logfmt --strict host, fwd_ip=&amp;#34;fwd&amp;#34;
| logfmt --keep-empty --strict host&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;pattern&#34;&gt;Pattern&lt;/h4&gt;
&lt;p&gt;The pattern parser allows the explicit extraction of fields from log lines by defining a pattern expression (&lt;code&gt;| pattern &amp;quot;&amp;lt;pattern-expression&amp;gt;&amp;quot;&lt;/code&gt;). The expression matches the structure of a log line.&lt;/p&gt;
&lt;p&gt;Consider this NGINX log line.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;log&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-log&#34;&gt;0.191.12.2 - - [10/Jun/2021:09:14:29 &amp;#43;0000] &amp;#34;GET /api/plugins/versioncheck HTTP/1.1&amp;#34; 200 2 &amp;#34;-&amp;#34; &amp;#34;Go-http-client/2.0&amp;#34; &amp;#34;13.76.247.102, 34.120.177.193&amp;#34; &amp;#34;TLSv1.2&amp;#34; &amp;#34;US&amp;#34; &amp;#34;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This log line can be parsed with the expression&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;ip&amp;gt; - - &amp;lt;_&amp;gt; &amp;quot;&amp;lt;method&amp;gt; &amp;lt;uri&amp;gt; &amp;lt;_&amp;gt;&amp;quot; &amp;lt;status&amp;gt; &amp;lt;size&amp;gt; &amp;lt;_&amp;gt; &amp;quot;&amp;lt;agent&amp;gt;&amp;quot; &amp;lt;_&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;to extract these fields:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;ip&amp;#34; =&amp;gt; &amp;#34;0.191.12.2&amp;#34;
&amp;#34;method&amp;#34; =&amp;gt; &amp;#34;GET&amp;#34;
&amp;#34;uri&amp;#34; =&amp;gt; &amp;#34;/api/plugins/versioncheck&amp;#34;
&amp;#34;status&amp;#34; =&amp;gt; &amp;#34;200&amp;#34;
&amp;#34;size&amp;#34; =&amp;gt; &amp;#34;2&amp;#34;
&amp;#34;agent&amp;#34; =&amp;gt; &amp;#34;Go-http-client/2.0&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A pattern expression is composed of captures and literals.&lt;/p&gt;
&lt;p&gt;A capture is a field name delimited by the &lt;code&gt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&lt;/code&gt; characters. &lt;code&gt;&amp;lt;example&amp;gt;&lt;/code&gt; defines the field name &lt;code&gt;example&lt;/code&gt;.
An unnamed capture appears as &lt;code&gt;&amp;lt;_&amp;gt;&lt;/code&gt;. The unnamed capture skips matched content.&lt;/p&gt;
&lt;p&gt;Captures are matched from the line beginning or the previous set of literals, to the line end or the next set of literals.
If a capture is not matched, the pattern parser will stop.&lt;/p&gt;
&lt;p&gt;Literals can be any sequence of UTF-8 characters, including whitespace characters.&lt;/p&gt;
&lt;p&gt;By default, a pattern expression is anchored at the start of the log line. If the expression starts with literals, then the log line must also start with the same set of literals. Use &lt;code&gt;&amp;lt;_&amp;gt;&lt;/code&gt; at the beginning of the expression if you don&amp;rsquo;t want to anchor the expression at the start.&lt;/p&gt;
&lt;p&gt;Consider the log line&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;log&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-log&#34;&gt;level=debug ts=2021-06-10T09:24:13.472094048Z caller=logging.go:66 traceID=0568b66ad2d9294c msg=&amp;#34;POST /loki/api/v1/push (204) 16.652862ms&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To match &lt;code&gt;msg=&amp;quot;&lt;/code&gt;, use the expression:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;pattern&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-pattern&#34;&gt;&amp;lt;_&amp;gt; msg=&amp;#34;&amp;lt;method&amp;gt; &amp;lt;path&amp;gt; (&amp;lt;status&amp;gt;) &amp;lt;latency&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A pattern expression is invalid if&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It does not contain any named capture.&lt;/li&gt;
&lt;li&gt;It contains two consecutive captures not separated by whitespace characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;regular-expression&#34;&gt;Regular expression&lt;/h4&gt;
&lt;p&gt;Unlike the logfmt and json, which extract implicitly all values and takes no parameters, the regexp parser takes a single parameter &lt;code&gt;| regexp &amp;quot;&amp;lt;re&amp;gt;&amp;quot;&lt;/code&gt; which is the regular expression using the &lt;a href=&#34;https://golang.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Golang&lt;/a&gt; &lt;a href=&#34;https://github.com/google/re2/wiki/Syntax&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;RE2 syntax&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The regular expression must contain a least one named sub-match (e.g &lt;code&gt;(?P&amp;lt;name&amp;gt;re)&lt;/code&gt;), each sub-match will extract a different label.&lt;/p&gt;
&lt;p&gt;For example the parser &lt;code&gt;| regexp &amp;quot;(?P&amp;lt;method&amp;gt;\\w&#43;) (?P&amp;lt;path&amp;gt;[\\w|/]&#43;) \\((?P&amp;lt;status&amp;gt;\\d&#43;?)\\) (?P&amp;lt;duration&amp;gt;.*)&amp;quot;&lt;/code&gt; will extract from the following line:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;log&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-log&#34;&gt;POST /api/prom/api/v1/query_range (200) 1.5s&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;those labels:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;kv&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-kv&#34;&gt;&amp;#34;method&amp;#34; =&amp;gt; &amp;#34;POST&amp;#34;
&amp;#34;path&amp;#34; =&amp;gt; &amp;#34;/api/prom/api/v1/query_range&amp;#34;
&amp;#34;status&amp;#34; =&amp;gt; &amp;#34;200&amp;#34;
&amp;#34;duration&amp;#34; =&amp;gt; &amp;#34;1.5s&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;unpack&#34;&gt;unpack&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;unpack&lt;/code&gt; parser parses a JSON log line, unpacking all embedded labels from Promtail&amp;rsquo;s &lt;a href=&#34;../../send-data/promtail/stages/pack/&#34;&gt;&lt;code&gt;pack&lt;/code&gt; stage&lt;/a&gt;.
&lt;strong&gt;A special property &lt;code&gt;_entry&lt;/code&gt; will also be used to replace the original log line&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example, using &lt;code&gt;| unpack&lt;/code&gt; with the log line:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JSON&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;{
  &amp;#34;container&amp;#34;: &amp;#34;myapp&amp;#34;,
  &amp;#34;pod&amp;#34;: &amp;#34;pod-3223f&amp;#34;,
  &amp;#34;_entry&amp;#34;: &amp;#34;original log message&amp;#34;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;extracts the &lt;code&gt;container&lt;/code&gt; and &lt;code&gt;pod&lt;/code&gt; labels; it sets &lt;code&gt;original log message&lt;/code&gt; as the new log line.&lt;/p&gt;
&lt;p&gt;You can combine the &lt;code&gt;unpack&lt;/code&gt; and &lt;code&gt;json&lt;/code&gt; parsers (or any other parsers) if the original embedded log line is of a specific format.&lt;/p&gt;
&lt;h3 id=&#34;line-format-expression&#34;&gt;Line format expression&lt;/h3&gt;
&lt;p&gt;The line format expression can rewrite the log line content by using the &lt;a href=&#34;https://golang.org/pkg/text/template/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;text/template&lt;/a&gt; format.
It takes a single string parameter &lt;code&gt;| line_format &amp;quot;{{.label_name}}&amp;quot;&lt;/code&gt;, which is the template format. All labels are injected variables into the template and are available to use with the &lt;code&gt;{{.label_name}}&lt;/code&gt; notation.&lt;/p&gt;
&lt;p&gt;For example the following expression:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{container=&amp;#34;frontend&amp;#34;} | logfmt | line_format &amp;#34;{{.query}} {{.duration}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Will extract and rewrite the log line to only contains the query and the duration of a request.&lt;/p&gt;
&lt;p&gt;You can use double quoted string for the template or backticks &lt;code&gt;`{{.label_name}}`&lt;/code&gt; to avoid the need to escape special characters.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;line_format&lt;/code&gt; also supports &lt;code&gt;math&lt;/code&gt; functions. Example:&lt;/p&gt;
&lt;p&gt;If we have the following labels &lt;code&gt;ip=1.1.1.1&lt;/code&gt;, &lt;code&gt;status=200&lt;/code&gt; and &lt;code&gt;duration=3000&lt;/code&gt;(ms), we can divide the duration by &lt;code&gt;1000&lt;/code&gt; to get the value in seconds.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{container=&amp;#34;frontend&amp;#34;} | logfmt | line_format &amp;#34;{{.ip}} {{.status}} {{div .duration 1000}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above query will give us the &lt;code&gt;line&lt;/code&gt; as &lt;code&gt;1.1.1.1 200 3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;../template_functions/&#34;&gt;template functions&lt;/a&gt; to learn about available functions in the template format.&lt;/p&gt;
&lt;h3 id=&#34;labels-format-expression&#34;&gt;Labels format expression&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;| label_format&lt;/code&gt; expression can rename, modify or add labels. It takes as parameter a comma separated list of equality operations, enabling multiple operations at once.&lt;/p&gt;
&lt;p&gt;When both side are label identifiers, for example &lt;code&gt;dst=src&lt;/code&gt;, the operation will rename the &lt;code&gt;src&lt;/code&gt; label into &lt;code&gt;dst&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The right side can alternatively be a template string (double quoted or backtick), for example &lt;code&gt;dst=&amp;quot;{{.status}} {{.query}}&amp;quot;&lt;/code&gt;, in which case the &lt;code&gt;dst&lt;/code&gt; label value is replaced by the result of the &lt;a href=&#34;https://golang.org/pkg/text/template/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;text/template&lt;/a&gt; evaluation. This is the same template engine as the &lt;code&gt;| line_format&lt;/code&gt; expression, which means labels are available as variables and you can use the same list of functions.&lt;/p&gt;
&lt;p&gt;In both cases, if the destination label doesn&amp;rsquo;t exist, then a new one is created.&lt;/p&gt;
&lt;p&gt;The renaming form &lt;code&gt;dst=src&lt;/code&gt; will &lt;em&gt;drop&lt;/em&gt; the &lt;code&gt;src&lt;/code&gt; label after remapping it to the &lt;code&gt;dst&lt;/code&gt; label. However, the &lt;em&gt;template&lt;/em&gt; form will preserve the referenced labels, such that  &lt;code&gt;dst=&amp;quot;{{.src}}&amp;quot;&lt;/code&gt; results in both &lt;code&gt;dst&lt;/code&gt; and &lt;code&gt;src&lt;/code&gt; having the same value.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A single label name can only appear once per expression. This means &lt;code&gt;| label_format foo=bar,foo=&amp;quot;new&amp;quot;&lt;/code&gt; is not allowed but you can use two expressions for the desired effect: &lt;code&gt;| label_format foo=bar | label_format foo=&amp;quot;new&amp;quot;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;drop-labels-expression&#34;&gt;Drop Labels expression&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Syntax&lt;/strong&gt;:  &lt;code&gt;|drop name, other_name, some_name=&amp;quot;some_value&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;| drop&lt;/code&gt; expression will drop the given labels in the pipeline. For example, for the query &lt;code&gt;{job=&amp;quot;varlogs&amp;quot;}|json|drop level, method=&amp;quot;GET&amp;quot;&lt;/code&gt;, with below log line&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the result will be&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{host=&amp;#34;grafana.net&amp;#34;, path=&amp;#34;/&amp;#34;, status=&amp;#34;200&amp;#34;} {&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Similary, this expression can be used to drop &lt;code&gt;__error__&lt;/code&gt; labels as well. For example, for the query &lt;code&gt;{job=&amp;quot;varlogs&amp;quot;}|json|drop __error__&lt;/code&gt;, with below log line&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;INFO GET / loki.net 200&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the result will be&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{} INFO GET / loki.net 200&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example with regex and multiple names&lt;/p&gt;
&lt;p&gt;For the query &lt;code&gt;{job=&amp;quot;varlogs&amp;quot;}|json|drop level, path, app=~&amp;quot;some-api.*&amp;quot;&lt;/code&gt;, with below log lines&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{&amp;#34;app&amp;#34;: &amp;#34;some-api-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}
{&amp;#34;app&amp;#34;: &amp;#34;other-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the result will be&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{host=&amp;#34;grafana.net&amp;#34;, job=&amp;#34;varlogs&amp;#34;, method=&amp;#34;GET&amp;#34;, status=&amp;#34;200&amp;#34;} {&amp;#34;app&amp;#34;: &amp;#34;some-api-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}
{app=&amp;#34;other-service&amp;#34;, host=&amp;#34;grafana.net&amp;#34;, job=&amp;#34;varlogs&amp;#34;, method=&amp;#34;GET&amp;#34;, status=&amp;#34;200&amp;#34;} {&amp;#34;app&amp;#34;: &amp;#34;other-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;keep-labels-expression&#34;&gt;Keep Labels expression&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Syntax&lt;/strong&gt;:  &lt;code&gt;|keep name, other_name, some_name=&amp;quot;some_value&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;| keep&lt;/code&gt; expression will keep only the specified labels in the pipeline and drop all the other labels.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The keep stage will not drop the  &lt;strong&gt;error&lt;/strong&gt; or &lt;strong&gt;error_details&lt;/strong&gt; labels added by Loki at query time. To drop these labels, refer to &lt;a href=&#34;#drop-labels-expression&#34;&gt;drop&lt;/a&gt; stage.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Query examples:&lt;/p&gt;
&lt;p&gt;For the query &lt;code&gt;{job=&amp;quot;varlogs&amp;quot;}|json|keep level, method=&amp;quot;GET&amp;quot;&lt;/code&gt;, with the following log lines:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}
{&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;POST&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the result will be&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{level=&amp;#34;info&amp;#34;, method=&amp;#34;GET&amp;#34;} {&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}
{level=&amp;#34;info&amp;#34;} {&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;POST&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the query &lt;code&gt;{job=&amp;quot;varlogs&amp;quot;}|json|keep level, tenant, app=~&amp;quot;some-api.*&amp;quot;&lt;/code&gt;, with the following log lines:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{&amp;#34;app&amp;#34;: &amp;#34;some-api-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}
{&amp;#34;app&amp;#34;: &amp;#34;other-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the result will be&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{app=&amp;#34;some-api-service&amp;#34;, level=&amp;#34;info&amp;#34;} {&amp;#34;app&amp;#34;: &amp;#34;some-api-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}
{level=&amp;#34;info&amp;#34;} {&amp;#34;app&amp;#34;: &amp;#34;other-service&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;, &amp;#34;method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;path&amp;#34;: &amp;#34;/&amp;#34;, &amp;#34;host&amp;#34;: &amp;#34;grafana.net&amp;#34;, &amp;#34;status&amp;#34;: &amp;#34;200&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="log-queries">Log queries&lt;/h1>
&lt;p>All LogQL queries contain a &lt;strong>log stream selector&lt;/strong>.&lt;/p>
&lt;p>&lt;img
class="lazyload d-inline-block"
data-src="./query_components.png"
alt="parts of a query"/>&lt;/p>
&lt;p>Optionally, the log stream selector can be followed by a &lt;strong>log pipeline&lt;/strong>. A log pipeline is a set of stage expressions that are chained together and applied to the selected log streams. Each expression can filter out, parse, or mutate log lines and their respective labels.&lt;/p></description></item><item><title>Metric queries</title><link>https://grafana.com/docs/loki/v2.9.x/query/metric_queries/</link><pubDate>Thu, 10 Apr 2025 12:15:54 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/metric_queries/</guid><content><![CDATA[&lt;h1 id=&#34;metric-queries&#34;&gt;Metric queries&lt;/h1&gt;
&lt;p&gt;Metric queries extend log queries by applying a function to log query results.
This powerful feature creates metrics from logs.&lt;/p&gt;
&lt;p&gt;Metric queries can be used to calculate the rate of error messages or the top N log sources with the greatest quantity of logs over the last 3 hours.&lt;/p&gt;
&lt;p&gt;Combined with parsers, metric queries can also be used to calculate metrics from a sample value within the log line, such as latency or request size.
All labels, including extracted ones, will be available for aggregations and generation of new series.&lt;/p&gt;
&lt;h2 id=&#34;range-vector-aggregation&#34;&gt;Range Vector aggregation&lt;/h2&gt;
&lt;p&gt;LogQL shares the &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;range vector&lt;/a&gt; concept of Prometheus.
In Grafana Loki, the selected range of samples is a range of selected log or label values.&lt;/p&gt;
&lt;p&gt;The aggregation is applied over a time duration.
Loki defines &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/basics/#time-durations&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Time Durations&lt;/a&gt; with the same syntax as Prometheus.&lt;/p&gt;
&lt;p&gt;Loki supports two types of range vector aggregations: log range aggregations and unwrapped range aggregations.&lt;/p&gt;
&lt;h3 id=&#34;log-range-aggregations&#34;&gt;Log range aggregations&lt;/h3&gt;
&lt;p&gt;A log range aggregation is a query followed by a duration.
A function is applied to aggregate the query over the duration.
The duration can be placed
after the log stream selector or at end of the log pipeline.&lt;/p&gt;
&lt;p&gt;The functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rate(log-range)&lt;/code&gt;: calculates the number of entries per second&lt;/li&gt;
&lt;li&gt;&lt;code&gt;count_over_time(log-range)&lt;/code&gt;: counts the entries for each log stream within the given range.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bytes_rate(log-range)&lt;/code&gt;: calculates the number of bytes per second for each stream.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bytes_over_time(log-range)&lt;/code&gt;: counts the amount of bytes used by each log stream for a given range.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absent_over_time(log-range)&lt;/code&gt;: returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements. (&lt;code&gt;absent_over_time&lt;/code&gt; is useful for alerting on when no time series and logs stream exist for label combination for a certain amount of time.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Count all the log lines within the last five minutes for the MySQL job.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;count_over_time({job=&amp;#34;mysql&amp;#34;}[5m])&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This aggregation includes filters and parsers.
It returns the per-second rate of all non-timeout errors within the last minutes per host for the MySQL job and only includes errors whose duration is above ten seconds.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;sum by (host) (rate({job=&amp;#34;mysql&amp;#34;} |= &amp;#34;error&amp;#34; != &amp;#34;timeout&amp;#34; | json | duration &amp;gt; 10s [1m]))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;offset-modifier&#34;&gt;Offset modifier&lt;/h4&gt;
&lt;p&gt;The offset modifier allows changing the time offset for individual range vectors in a query.&lt;/p&gt;
&lt;p&gt;For example, the following expression counts all the logs within the last ten minutes to five minutes rather than last five minutes for the MySQL job. Note that the &lt;code&gt;offset&lt;/code&gt; modifier always needs to follow the range vector selector immediately.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;count_over_time({job=&amp;#34;mysql&amp;#34;}[5m] offset 5m) // GOOD
count_over_time({job=&amp;#34;mysql&amp;#34;}[5m]) offset 5m // INVALID&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;unwrapped-range-aggregations&#34;&gt;Unwrapped range aggregations&lt;/h3&gt;
&lt;p&gt;Unwrapped ranges uses extracted labels as sample values instead of log lines. However to select which label will be used within the aggregation, the log query must end with an unwrap expression and optionally a label filter expression to discard &lt;a href=&#34;./#pipeline-errors&#34;&gt;errors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The unwrap expression is noted &lt;code&gt;| unwrap label_identifier&lt;/code&gt; where the label identifier is the label name to use for extracting sample values.&lt;/p&gt;
&lt;p&gt;Since label values are string, by default a conversion into a float (64bits) will be attempted, in case of failure the &lt;code&gt;__error__&lt;/code&gt; label is added to the sample.
Optionally the label identifier can be wrapped by a conversion function &lt;code&gt;| unwrap &amp;lt;function&amp;gt;(label_identifier)&lt;/code&gt;, which will attempt to convert the label value from a specific format.&lt;/p&gt;
&lt;p&gt;We currently support the functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;duration_seconds(label_identifier)&lt;/code&gt; (or its short equivalent &lt;code&gt;duration&lt;/code&gt;) which will convert the label value in seconds from the &lt;a href=&#34;https://golang.org/pkg/time/#ParseDuration&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;go duration format&lt;/a&gt; (e.g &lt;code&gt;5m&lt;/code&gt;, &lt;code&gt;24s30ms&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bytes(label_identifier)&lt;/code&gt; which will convert the label value to raw bytes applying the bytes unit  (e.g. &lt;code&gt;5 MiB&lt;/code&gt;, &lt;code&gt;3k&lt;/code&gt;, &lt;code&gt;1G&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Supported function for operating over unwrapped ranges are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rate(unwrapped-range)&lt;/code&gt;: calculates per second rate of the sum of all values in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rate_counter(unwrapped-range)&lt;/code&gt;: calculates per second rate of the values in the specified interval and treating them as &amp;ldquo;counter metric&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sum_over_time(unwrapped-range)&lt;/code&gt;: the sum of all values in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avg_over_time(unwrapped-range)&lt;/code&gt;: the average value of all points in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_over_time(unwrapped-range)&lt;/code&gt;: the maximum value of all points in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min_over_time(unwrapped-range)&lt;/code&gt;: the minimum value of all points in the specified interval&lt;/li&gt;
&lt;li&gt;&lt;code&gt;first_over_time(unwrapped-range)&lt;/code&gt;: the first value of all points in the specified interval&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_over_time(unwrapped-range)&lt;/code&gt;: the last value of all points in the specified interval&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdvar_over_time(unwrapped-range)&lt;/code&gt;: the population standard variance of the values in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stddev_over_time(unwrapped-range)&lt;/code&gt;: the population standard deviation of the values in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quantile_over_time(scalar,unwrapped-range)&lt;/code&gt;: the φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absent_over_time(unwrapped-range)&lt;/code&gt;: returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements. (&lt;code&gt;absent_over_time&lt;/code&gt; is useful for alerting on when no time series and logs stream exist for label combination for a certain amount of time.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Except for &lt;code&gt;sum_over_time&lt;/code&gt;,&lt;code&gt;absent_over_time&lt;/code&gt;, &lt;code&gt;rate&lt;/code&gt; and &lt;code&gt;rate_counter&lt;/code&gt;, unwrapped range aggregations support grouping.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;&amp;lt;aggr-op&amp;gt;([parameter,] &amp;lt;unwrapped-range&amp;gt;) [without|by (&amp;lt;label list&amp;gt;)]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which can be used to aggregate over distinct labels dimensions by including a &lt;code&gt;without&lt;/code&gt; or &lt;code&gt;by&lt;/code&gt; clause.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;without&lt;/code&gt; removes the listed labels from the result vector, while all other labels are preserved the output. &lt;code&gt;by&lt;/code&gt; does the opposite and drops labels that are not listed in the &lt;code&gt;by&lt;/code&gt; clause, even if their label values are identical between all elements of the vector.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;../query_examples/#unwrap-examples&#34;&gt;Unwrap examples&lt;/a&gt; for query examples that use the unwrap expression.&lt;/p&gt;
&lt;h2 id=&#34;built-in-aggregation-operators&#34;&gt;Built-in aggregation operators&lt;/h2&gt;
&lt;p&gt;Like &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PromQL&lt;/a&gt;, LogQL supports a subset of built-in aggregation operators that can be used to aggregate the element of a single vector, resulting in a new vector of fewer elements but with aggregated values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sum&lt;/code&gt;: Calculate sum over labels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avg&lt;/code&gt;: Calculate the average over labels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min&lt;/code&gt;: Select minimum over labels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max&lt;/code&gt;: Select maximum over labels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stddev&lt;/code&gt;: Calculate the population standard deviation over labels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdvar&lt;/code&gt;: Calculate the population standard variance over labels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;count&lt;/code&gt;: Count number of elements in the vector&lt;/li&gt;
&lt;li&gt;&lt;code&gt;topk&lt;/code&gt;: Select largest k elements by sample value&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottomk&lt;/code&gt;: Select smallest k elements by sample value&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sort&lt;/code&gt;: returns vector elements sorted by their sample values, in ascending order.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sort_desc&lt;/code&gt;: Same as sort, but sorts in descending order.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The aggregation operators can either be used to aggregate over all label values or a set of distinct label values by including a &lt;code&gt;without&lt;/code&gt; or a &lt;code&gt;by&lt;/code&gt; clause:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;&amp;lt;aggr-op&amp;gt;([parameter,] &amp;lt;vector expression&amp;gt;) [without|by (&amp;lt;label list&amp;gt;)]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;parameter&lt;/code&gt; is required when using &lt;code&gt;topk&lt;/code&gt; and &lt;code&gt;bottomk&lt;/code&gt;.
&lt;code&gt;topk&lt;/code&gt; and &lt;code&gt;bottomk&lt;/code&gt; are different from other aggregators in that a subset of the input samples, including the original labels, are returned in the result vector.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;by&lt;/code&gt; and &lt;code&gt;without&lt;/code&gt; are only used to group the input vector.
The &lt;code&gt;without&lt;/code&gt; clause removes the listed labels from the resulting vector, keeping all others.
The &lt;code&gt;by&lt;/code&gt; clause does the opposite, dropping labels that are not listed in the clause, even if their label values are identical between all elements of the vector.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;../query_examples/#vector-aggregation-examples&#34;&gt;vector aggregation examples&lt;/a&gt; for query examples that use vector aggregation expressions.&lt;/p&gt;
&lt;h2 id=&#34;functions&#34;&gt;Functions&lt;/h2&gt;
&lt;p&gt;LogQL supports a set of built-in functions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vector(s scalar)&lt;/code&gt;: returns the scalar s as a vector with no labels. This behaves identically to the &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/functions/#vector&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Prometheus &lt;code&gt;vector()&lt;/code&gt; function&lt;/a&gt;.
&lt;code&gt;vector&lt;/code&gt; is mainly used to return a value for a series that would otherwise return nothing; this can be useful when using LogQL to define an alert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Count all the log lines within the last five minutes for the traefik namespace.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;sum(count_over_time({namespace=&amp;#34;traefik&amp;#34;}[5m])) # will return nothing
  or
vector(0) # will return 0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="metric-queries">Metric queries&lt;/h1>
&lt;p>Metric queries extend log queries by applying a function to log query results.
This powerful feature creates metrics from logs.&lt;/p>
&lt;p>Metric queries can be used to calculate the rate of error messages or the top N log sources with the greatest quantity of logs over the last 3 hours.&lt;/p></description></item><item><title>Template functions</title><link>https://grafana.com/docs/loki/v2.9.x/query/template_functions/</link><pubDate>Wed, 10 Jan 2024 20:44:02 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/template_functions/</guid><content><![CDATA[&lt;h1 id=&#34;template-functions&#34;&gt;Template functions&lt;/h1&gt;
&lt;p&gt;The &lt;a href=&#34;https://golang.org/pkg/text/template&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;text template&lt;/a&gt; format used in &lt;code&gt;| line_format&lt;/code&gt; and &lt;code&gt;| label_format&lt;/code&gt; support the usage of functions.&lt;/p&gt;
&lt;p&gt;All labels are added as variables in the template engine. They can be referenced using they label name prefixed by a &lt;code&gt;.&lt;/code&gt;(e.g &lt;code&gt;.label_name&lt;/code&gt;). For example the following template will output the value of the path label:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ .path }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Additionally you can also access the log line using the &lt;a href=&#34;#__line__&#34;&gt;&lt;code&gt;__line__&lt;/code&gt;&lt;/a&gt; function and the timestamp using the &lt;a href=&#34;#__timestamp__&#34;&gt;&lt;code&gt;__timestamp__&lt;/code&gt;&lt;/a&gt; function.&lt;/p&gt;
&lt;p&gt;You can take advantage of &lt;a href=&#34;https://golang.org/pkg/text/template/#hdr-Pipelines&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;pipeline&lt;/a&gt; to join together multiple functions.
In a chained pipeline, the result of each command is passed as the last argument of the following command.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ .path | replace &amp;#34; &amp;#34; &amp;#34;_&amp;#34; | trunc 5 | upper }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For function that returns a &lt;code&gt;bool&lt;/code&gt; such as &lt;code&gt;contains&lt;/code&gt;, &lt;code&gt;eq&lt;/code&gt;, &lt;code&gt;hasPrefix&lt;/code&gt; and &lt;code&gt;hasSuffix&lt;/code&gt;, you can apply &lt;code&gt;AND&lt;/code&gt; / &lt;code&gt;OR&lt;/code&gt; and nested &lt;code&gt;if&lt;/code&gt; logic.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ if and (contains &amp;#34;he&amp;#34; &amp;#34;hello&amp;#34;) (contains &amp;#34;llo&amp;#34; &amp;#34;hello&amp;#34;) }} yes {{end}}
{{ if or (contains &amp;#34;he&amp;#34; &amp;#34;hello&amp;#34;) (contains(&amp;#34;llo&amp;#34; &amp;#34;hello&amp;#34;) }} yes {{end}}
{{ if contains .err &amp;#34;ErrTimeout&amp;#34; }} timeout {{else if contains &amp;#34;he&amp;#34; &amp;#34;hello&amp;#34;}} yes {{else}} no {{end}}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;line&#34;&gt;&lt;strong&gt;line&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;This function returns the current log line.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;line() string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ __line__ | lower }}&amp;#34;
`{{ __line__ }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;timestamp&#34;&gt;&lt;strong&gt;timestamp&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;This function returns the current log lines timestamp.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;timestamp() time.Time&lt;/code&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ __timestamp__ }}&amp;#34;
`{{ __timestamp__ | date &amp;#34;2006-01-02T15:04:05.00Z-07:00&amp;#34; }}`
`{{ __timestamp__ | unixEpoch }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;See the blog: &lt;a href=&#34;https://www.pauladamsmith.com/blog/2011/05/go_time.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Parsing and formatting date/time in Go&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&#34;regexreplaceall-and-regexreplaceallliteral&#34;&gt;regexReplaceAll and regexReplaceAllLiteral&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;regexReplaceAll&lt;/code&gt; returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement. Inside string replacement, $ signs are interpreted as in Expand, so for instance $1 represents the text of the first sub-match. See the golang &lt;a href=&#34;https://golang.org/pkg/regexp/#Regexp.ReplaceAll&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Regexp.replaceAll documentation&lt;/a&gt; for more examples.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;`{{ regexReplaceAll &amp;#34;(a*)bc&amp;#34; .some_label &amp;#34;${1}a&amp;#34; }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;regexReplaceAllLiteral&lt;/code&gt; function returns a copy of the input string and replaces matches of the Regexp with the replacement string replacement. The replacement string is substituted directly, without using Expand.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;`{{ regexReplaceAllLiteral &amp;#34;(ts=)&amp;#34; .timestamp &amp;#34;timestamp=&amp;#34; }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;lower&#34;&gt;lower&lt;/h2&gt;
&lt;p&gt;Use this function to convert to lower case.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;lower(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .request_method | lower }}&amp;#34;
`{{ lower  &amp;#34;HELLO&amp;#34;}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The last example will return &lt;code&gt;hello&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;upper&#34;&gt;upper&lt;/h2&gt;
&lt;p&gt;Use this function to convert to upper case.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;upper(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .request_method | upper }}&amp;#34;
`{{ upper  &amp;#34;hello&amp;#34;}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This results in &lt;code&gt;HELLO&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;title&#34;&gt;title&lt;/h2&gt;
&lt;p&gt;Convert to title case.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;title(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{.request_method | title}}&amp;#34;
`{{ title &amp;#34;hello world&amp;#34;}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The last example will return &lt;code&gt;Hello World&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;trunc&#34;&gt;trunc&lt;/h2&gt;
&lt;p&gt;Truncate a string and add no suffix.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;trunc(count int,value string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .path | trunc 2 }}&amp;#34;
`{{ trunc 5 &amp;#34;hello world&amp;#34;}}`   // output: hello
`{{ trunc -5 &amp;#34;hello world&amp;#34;}}`  // output: world&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;substr&#34;&gt;substr&lt;/h2&gt;
&lt;p&gt;Get a substring from a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;substr(start int,end int,value string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If start is &amp;lt; 0, this calls value[:end].
If start is &amp;gt;= 0 and end &amp;lt; 0 or end bigger than s length, this calls value[start:]
Otherwise, this calls value[start, end].&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .path | substr 2 5 }}&amp;#34;
`{{ substr 0 5 &amp;#34;hello world&amp;#34;}}`  // output: hello
`{{ substr 6 11 &amp;#34;hello world&amp;#34;}}` // output: world&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;replace&#34;&gt;replace&lt;/h2&gt;
&lt;p&gt;This function performs simple string replacement.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;replace(old string, new string, src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It takes three arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;old&lt;/code&gt; string to replace&lt;/li&gt;
&lt;li&gt;&lt;code&gt;new&lt;/code&gt; string to replace with&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src&lt;/code&gt; source string&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ .cluster | replace &amp;#34;-cluster&amp;#34; &amp;#34;&amp;#34; }}
{{ replace &amp;#34;hello&amp;#34; &amp;#34;world&amp;#34; &amp;#34;hello world&amp;#34; }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The last example will return &lt;code&gt;world world&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;trim&#34;&gt;trim&lt;/h2&gt;
&lt;p&gt;The trim function removes space from either side of a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;trim(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ .ip | trim }}
{{ trim &amp;#34;   hello    &amp;#34; }} // output: hello&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;trimall&#34;&gt;trimAll&lt;/h2&gt;
&lt;p&gt;Use this function to remove given characters from the front or back of a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;trimAll(chars string,src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ .path | trimAll &amp;#34;/&amp;#34; }}
{{ trimAll &amp;#34;$&amp;#34; &amp;#34;$5.00&amp;#34; }} // output: 5.00&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;trimsuffix&#34;&gt;trimSuffix&lt;/h2&gt;
&lt;p&gt;Use this function to trim just the suffix from a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;trimSuffix(suffix string, src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{  .path | trimSuffix &amp;#34;/&amp;#34; }}
{{ trimSuffix &amp;#34;-&amp;#34; &amp;#34;hello-&amp;#34; }} // output: hello&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;trimprefix&#34;&gt;trimPrefix&lt;/h2&gt;
&lt;p&gt;Use this function to trim just the prefix from a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;trimPrefix(prefix string, src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{  .path | trimPrefix &amp;#34;/&amp;#34; }}
{{ trimPrefix &amp;#34;-&amp;#34; &amp;#34;-hello&amp;#34; }} // output: hello&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;alignleft&#34;&gt;alignLeft&lt;/h2&gt;
&lt;p&gt;Use this function to format a string to a fixed with, aligning the content to the left.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;alignLeft(count int, src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;`{{ alignLeft 5 &amp;#34;hello world&amp;#34;}}` // output: &amp;#34;hello&amp;#34;
`{{ alignLeft 5 &amp;#34;hi&amp;#34;}}`          // output: &amp;#34;hi   &amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;alignright&#34;&gt;alignRight&lt;/h2&gt;
&lt;p&gt;Use this function to format a string to a fixed with, aligning the content to the right.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;alignRight(count int, src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;`{{ alignRight 5 &amp;#34;hello world&amp;#34;}}` // output: &amp;#34;world&amp;#34;
`{{ alignRight 5 &amp;#34;hi&amp;#34;}}`          // output: &amp;#34;   hi&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;indent&#34;&gt;indent&lt;/h2&gt;
&lt;p&gt;The indent function indents every line in a given string to the specified indent width. This is useful when aligning multi-line strings.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;indent(spaces int,src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ indent 4 .query }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This indents each line contained in the &lt;code&gt;.query&lt;/code&gt; by four (4) spaces.&lt;/p&gt;
&lt;h2 id=&#34;nindent&#34;&gt;nindent&lt;/h2&gt;
&lt;p&gt;The nindent function is the same as the indent function, but prepends a new line to the beginning of the string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;nindent(spaces int,src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ nindent 4 .query }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This will indent every line of text by 4 space characters and add a new line to the beginning.&lt;/p&gt;
&lt;h2 id=&#34;repeat&#34;&gt;repeat&lt;/h2&gt;
&lt;p&gt;Use this function to repeat a string multiple times.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;repeat(c int,value string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ repeat 3 &amp;#34;hello&amp;#34; }} // output: hellohellohello&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;contains&#34;&gt;contains&lt;/h2&gt;
&lt;p&gt;Use this function to test to see if one string is contained inside of another.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;contains(s string, src string) bool&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ if contains .err &amp;#34;ErrTimeout&amp;#34; }} timeout {{end}}
{{ if contains &amp;#34;he&amp;#34; &amp;#34;hello&amp;#34; }} yes {{end}}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;eq&#34;&gt;eq&lt;/h2&gt;
&lt;p&gt;Use this function to test to see if one string has exact matching inside of another.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;eq(s string, src string) bool&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ if eq .err &amp;#34;ErrTimeout&amp;#34; }} timeout {{end}}
{{ if eq &amp;#34;he&amp;#34; &amp;#34;hello&amp;#34; }} yes {{end}}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;hasprefix-and-hassuffix&#34;&gt;hasPrefix and hasSuffix&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;hasPrefix&lt;/code&gt; and &lt;code&gt;hasSuffix&lt;/code&gt; functions test whether a string has a given prefix or suffix.&lt;/p&gt;
&lt;p&gt;Signatures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hasPrefix(prefix string, src string) bool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hasSuffix(suffix string, src string) bool&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ if hasSuffix .err &amp;#34;Timeout&amp;#34; }} timeout {{end}}
{{ if hasPrefix &amp;#34;he&amp;#34; &amp;#34;hello&amp;#34; }} yes {{end}}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;add&#34;&gt;add&lt;/h2&gt;
&lt;p&gt;Sum numbers. Supports multiple numbers&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(i ...interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ add 3 2 5 }} // output: 10&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;sub&#34;&gt;sub&lt;/h2&gt;
&lt;p&gt;Subtract numbers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a, b interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ sub 5 2 }} // output: 3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;mul&#34;&gt;mul&lt;/h2&gt;
&lt;p&gt;Mulitply numbers. Supports multiple numbers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a interface{}, v ...interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ mul 5 2 3}} // output: 30&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;div&#34;&gt;div&lt;/h2&gt;
&lt;p&gt;Integer divide numbers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a, b interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ div 10 2}} // output: 5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;addf&#34;&gt;addf&lt;/h2&gt;
&lt;p&gt;Sum numbers. Supports multiple numbers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(i ...interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ addf 3.5 2 5 }} // output: 10.5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;subf&#34;&gt;subf&lt;/h2&gt;
&lt;p&gt;Subtract numbers. Supports multiple numbers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a interface{}, v ...interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ subf  5.5 2 1.5 }} // output: 2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;mulf&#34;&gt;mulf&lt;/h2&gt;
&lt;p&gt;Mulitply numbers. Supports multiple numbers&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a interface{}, v ...interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ mulf 5.5 2 2.5 }} // output: 27.5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;divf&#34;&gt;divf&lt;/h2&gt;
&lt;p&gt;Divide numbers. Supports multiple numbers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a interface{}, v ...interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ divf 10 2 4}} // output: 1.25&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;mod&#34;&gt;mod&lt;/h2&gt;
&lt;p&gt;Modulo wit mod.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;func(a, b interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ mod 10 3}} // output: 1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;max&#34;&gt;max&lt;/h2&gt;
&lt;p&gt;Return the largest of a series of integers:&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;max(a interface{}, i ...interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ max 1 2 3 }} //output 3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;min&#34;&gt;min&lt;/h2&gt;
&lt;p&gt;Return the smallest of a series of integers.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;min(a interface{}, i ...interface{}) int64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ min 1 2 3 }} //output 1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;maxf&#34;&gt;maxf&lt;/h2&gt;
&lt;p&gt;Return the largest of a series of floats:&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;maxf(a interface{}, i ...interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ maxf 1 2.5 3 }} //output 3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;minf&#34;&gt;minf&lt;/h2&gt;
&lt;p&gt;Return the smallest of a series of floats.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;minf(a interface{}, i ...interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ minf 1 2.5 3 }} //output 1.5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;ceil&#34;&gt;ceil&lt;/h2&gt;
&lt;p&gt;Returns the greatest float value greater than or equal to input value&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;ceil(a interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ ceil 123.001 }} //output 124.0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;floor&#34;&gt;floor&lt;/h2&gt;
&lt;p&gt;Returns the greatest float value less than or equal to input value&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;floor(a interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ floor 123.9999 }} //output 123.0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;round&#34;&gt;round&lt;/h2&gt;
&lt;p&gt;Returns a float value with the remainder rounded to the given number of digits after the decimal point.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;round(a interface{}, p int, rOpt ...float64) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ round 123.555555 3 }} //output 123.556&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can also provide a &lt;code&gt;roundOn&lt;/code&gt; number as third parameter&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ round 123.88571428571 5 .2 }} //output 123.88572&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With default &lt;code&gt;roundOn&lt;/code&gt; of &lt;code&gt;.5&lt;/code&gt; the above value would be &lt;code&gt;123.88571&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;int&#34;&gt;int&lt;/h2&gt;
&lt;p&gt;Convert value to an int.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;toInt(v interface{}) int&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ &amp;#34;3&amp;#34; | int }} //output 3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;float64&#34;&gt;float64&lt;/h2&gt;
&lt;p&gt;Convert to a float64.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;toFloat64(v interface{}) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ &amp;#34;3.5&amp;#34; | float64 }} //output 3.5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;fromjson&#34;&gt;fromJson&lt;/h2&gt;
&lt;p&gt;Decodes a JSON document into a structure. If the input cannot be decoded as JSON the function will return an empty string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;fromJson(v string) interface{}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;fromJson &amp;#34;{\&amp;#34;foo\&amp;#34;: 55}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example of a query to print a newline per queries stored as a json array in the log line:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;loki/querier&amp;#34;} |= &amp;#34;finish in prometheus&amp;#34; | logfmt | line_format &amp;#34;{{ range $q := fromJson .queries }} {{ $q.query }} {{ end }}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;now&#34;&gt;now&lt;/h2&gt;
&lt;p&gt;Returns the current time in the local timezone of the Loki server.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;Now() time.Time&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ now }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;todate&#34;&gt;toDate&lt;/h2&gt;
&lt;p&gt;Parses a formatted string and returns the time value it represents using the local timezone of the server running Loki.&lt;/p&gt;
&lt;p&gt;For more consistency between Loki installations, it&amp;rsquo;s recommended to use &lt;code&gt;toDateInZone&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The format string must use the exact date as defined in the &lt;a href=&#34;https://pkg.go.dev/time#pkg-constants&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;golang datetime layout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;toDate(fmt, str string) time.Time&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ toDate &amp;#34;2006-01-02&amp;#34; &amp;#34;2021-11-02&amp;#34; }}
{{ .foo | toDate &amp;#34;2006-01-02T15:04:05.999999999Z&amp;#34; }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;todateinzone&#34;&gt;toDateInZone&lt;/h2&gt;
&lt;p&gt;Parses a formatted string and returns the time value it represents in the provided timezone.&lt;/p&gt;
&lt;p&gt;The format string must use the exact date as defined in the &lt;a href=&#34;https://pkg.go.dev/time#pkg-constants&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;golang datetime layout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The timezone value can be &lt;code&gt;Local&lt;/code&gt;, &lt;code&gt;UTC&lt;/code&gt;, or any of the IANA Time Zone database values&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;toDateInZone(fmt, zone, str string) time.Time&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ toDateInZone &amp;#34;2006-01-02&amp;#34; &amp;#34;UTC&amp;#34; &amp;#34;2021-11-02&amp;#34; }}
{{ .foo | toDateInZone &amp;#34;2006-01-02T15:04:05.999999999Z&amp;#34; &amp;#34;UTC&amp;#34; }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;date&#34;&gt;date&lt;/h2&gt;
&lt;p&gt;Returns a textual representation of the time value formatted according to the provided &lt;a href=&#34;https://pkg.go.dev/time#pkg-constants&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;golang datetime layout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;date(fmt string, date interface{}) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ date &amp;#34;2006-01-02&amp;#34; now }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;unixepoch&#34;&gt;unixEpoch&lt;/h2&gt;
&lt;p&gt;Returns the number of seconds elapsed since January 1, 1970 UTC.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;unixEpoch(date time.Time) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ unixEpoch now }}
{{ .foo | toDateInZone &amp;#34;2006-01-02T15:04:05.999999999Z&amp;#34; &amp;#34;UTC&amp;#34; | unixEpoch }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example of a query to filter Loki querier jobs which create time is 1 day before:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;loki/querier&amp;#34;} | label_format nowEpoch=`{{(unixEpoch now)}}`,createDateEpoch=`{{unixEpoch (toDate &amp;#34;2006-01-02&amp;#34; .createDate)}}` | label_format dateTimeDiff=&amp;#34;{{sub .nowEpoch .createDateEpoch}}&amp;#34; | dateTimeDiff &amp;gt; 86400&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;unixepochmillis&#34;&gt;unixEpochMillis&lt;/h2&gt;
&lt;p&gt;Returns the number of milliseconds elapsed since January 1, 1970 UTC.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;unixEpochMillis(date time.Time) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ unixEpochMillis now }}
{{ .foo | toDateInZone &amp;#34;2006-01-02T15:04:05.999999999Z&amp;#34; &amp;#34;UTC&amp;#34; | unixEpochMillis }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;unixepochnanos&#34;&gt;unixEpochNanos&lt;/h2&gt;
&lt;p&gt;Returns the number of nanoseconds elapsed since January 1, 1970 UTC.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;unixEpochNanos(date time.Time) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ unixEpochNanos now }}
{{ .foo | toDateInZone &amp;#34;2006-01-02T15:04:05.999999999Z&amp;#34; &amp;#34;UTC&amp;#34; | unixEpochNanos }}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;unixtotime&#34;&gt;unixToTime&lt;/h2&gt;
&lt;p&gt;Converts the string epoch to the time value it represents. Epoch times in days, seconds, milliseconds, microseconds and nanoseconds are supported.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;unixToTime(epoch string) time.Time&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;p&gt;Consider the following log line &lt;code&gt;{&amp;quot;from&amp;quot;: &amp;quot;1679577215&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;1679587215&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;some message&amp;quot;}&lt;/code&gt;. To print the &lt;code&gt;from&lt;/code&gt; field as human readable add the following at the end of the LogQL query:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;... | json | line_format `from=&amp;#34;{{date &amp;#34;2006-01-02&amp;#34; (unixToTime .from)}}&amp;#34;`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;default&#34;&gt;default&lt;/h2&gt;
&lt;p&gt;Checks whether the string(&lt;code&gt;src&lt;/code&gt;) is set, and returns default(&lt;code&gt;d&lt;/code&gt;) if not set.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;default(d string, src string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ default &amp;#34;-&amp;#34; &amp;#34;&amp;#34; }} // output: -
{{ default &amp;#34;&amp;#34; &amp;#34;foo&amp;#34; }} // output: foo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example of a query to print a &lt;code&gt;-&lt;/code&gt; if the &lt;code&gt;http_request_headers_x_forwarded_for&lt;/code&gt; label is empty:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;access_log&amp;#34;} | json | line_format `{{.http_request_headers_x_forwarded_for | default &amp;#34;-&amp;#34;}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;count&#34;&gt;count&lt;/h2&gt;
&lt;p&gt;Counts occurrences of the regex (&lt;code&gt;regex&lt;/code&gt;) in (&lt;code&gt;src&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;count(regex string, src string) int&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;{{ count &amp;#34;a|b&amp;#34; &amp;#34;abab&amp;#34; }} // output: 4
{{ count &amp;#34;o&amp;#34; &amp;#34;foo&amp;#34; }}    // output: 2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example of a query to print how many times XYZ occurs in a line:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;xyzlog&amp;#34;} | line_format `{{ __line__ | count &amp;#34;XYZ&amp;#34;}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;urlencode&#34;&gt;urlencode&lt;/h2&gt;
&lt;p&gt;Use this function to &lt;a href=&#34;https://en.wikipedia.org/wiki/URL_encoding&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;urlencode&lt;/a&gt; a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;urlencode(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .request_url | urlencode }}&amp;#34;
`{{ urlencode  .request_url}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;urldecode&#34;&gt;urldecode&lt;/h2&gt;
&lt;p&gt;Use this function to &lt;a href=&#34;https://en.wikipedia.org/wiki/URL_encoding&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;urldecode&lt;/a&gt; a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;urldecode(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .request_url | urldecode }}&amp;#34;
`{{ urldecode  .request_url}}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;b64enc&#34;&gt;b64enc&lt;/h2&gt;
&lt;p&gt;Base64 encode a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;b64enc(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .foo | b64enc }}&amp;#34;
`{{ b64enc  .foo }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;b64dec&#34;&gt;b64dec&lt;/h2&gt;
&lt;p&gt;Base64 decode a string.&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;b64dec(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .foo | b64dec }}&amp;#34;
`{{ b64dec  .foo }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;bytes&#34;&gt;bytes&lt;/h2&gt;
&lt;p&gt;Convert a humanized byte string to bytes using &lt;a href=&#34;https://pkg.go.dev/github.com/dustin/go-humanize#ParseBytes&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;go-humanize&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;bytes(string) string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .foo | bytes }}&amp;#34;
`{{ bytes .foo }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;duration&#34;&gt;duration&lt;/h2&gt;
&lt;p&gt;An alias for &lt;code&gt;duration_seconds&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .foo | duration }}&amp;#34;
`{{ duration .foo }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;duration_seconds&#34;&gt;duration_seconds&lt;/h2&gt;
&lt;p&gt;Convert a humanized time duration to seconds using &lt;a href=&#34;https://pkg.go.dev/time#ParseDuration&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;time.ParseDuration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Signature: &lt;code&gt;duration_seconds(string) float64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;template&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-template&#34;&gt;&amp;#34;{{ .foo | duration_seconds }}&amp;#34;
`{{ duration_seconds .foo }}`&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="template-functions">Template functions&lt;/h1>
&lt;p>The &lt;a href="https://golang.org/pkg/text/template" target="_blank" rel="noopener noreferrer">text template&lt;/a> format used in &lt;code>| line_format&lt;/code> and &lt;code>| label_format&lt;/code> support the usage of functions.&lt;/p>
&lt;p>All labels are added as variables in the template engine. They can be referenced using they label name prefixed by a &lt;code>.&lt;/code>(e.g &lt;code>.label_name&lt;/code>). For example the following template will output the value of the path label:&lt;/p></description></item><item><title>Matching IP addresses</title><link>https://grafana.com/docs/loki/v2.9.x/query/ip/</link><pubDate>Wed, 06 Sep 2023 12:47:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/ip/</guid><content><![CDATA[&lt;h1 id=&#34;matching-ip-addresses&#34;&gt;Matching IP addresses&lt;/h1&gt;
&lt;p&gt;LogQL supports matching IP addresses.&lt;/p&gt;
&lt;p&gt;With logs such as&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;3.180.71.3 - - [17/May/2015:08:05:32 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 304 0 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)&amp;#34;
80.91.33.133 - - [17/May/2015:08:05:14 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 304 0 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16)&amp;#34;
46.4.66.76 - - [17/May/2015:08:05:45 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 404 318 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (1.0.1ubuntu2)&amp;#34;
93.180.71.3 - - [17/May/2015:08:05:26 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 404 324 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the LogQL line filter is not sufficient.
A line filter such as&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;} |= &amp;#34;3.180.71.3&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;also matches example IP addresses such as 93.180.71.3. A better choice uses a regexp: &lt;code&gt;|~&amp;quot;^3.180.71.3&amp;quot;&lt;/code&gt;. This regexp does not handle IPv6 addresses, and it does not match a range of IP addresses.&lt;/p&gt;
&lt;p&gt;The LogQL support for matching IP addresses handles both IPv4 and IPv6 single addresses, as well as ranges within IP addresses
and CIDR patterns.&lt;/p&gt;
&lt;p&gt;Match IP addresses with the syntax: &lt;code&gt;ip(&amp;quot;&amp;lt;pattern&amp;gt;&amp;quot;)&lt;/code&gt;.
The &lt;code&gt;&amp;lt;pattern&amp;gt;&lt;/code&gt; can be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A single IP address. Examples: &lt;code&gt;ip(&amp;quot;192.0.2.0&amp;quot;)&lt;/code&gt;, &lt;code&gt;ip(&amp;quot;::1&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A range within the IP address. Examples: &lt;code&gt;ip(&amp;quot;192.168.0.1-192.189.10.12&amp;quot;)&lt;/code&gt;, &lt;code&gt;ip(&amp;quot;2001:db8::1-2001:db8::8&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A CIDR specification. Examples: &lt;code&gt;ip(&amp;quot;192.51.100.0/24&amp;quot;)&lt;/code&gt;, &lt;code&gt;ip(&amp;quot;2001:db8::/32&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The IP matching can be used in both line filter and label filter expressions.
When specifying line filter expressions, only the &lt;code&gt;|=&lt;/code&gt; and &lt;code&gt;!=&lt;/code&gt; operations are allowed.
When specifying label filter expressions, only the  &lt;code&gt;=&lt;/code&gt; and &lt;code&gt;!=&lt;/code&gt; operations are allowed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Line filter examples&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;} |= ip(&amp;#34;192.168.4.5/16&amp;#34;)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Return log lines that do not match with an IPv4 range:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;} != ip(&amp;#34;192.168.4.5-192.168.4.20&amp;#34;)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Label filter examples&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;}
	| logfmt
	| remote_addr = ip(&amp;#34;2001:db8::1-2001:db8::8&amp;#34;)
	| level = &amp;#34;error&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Filters can also be chained. This example matches log lines with all IPv4 subnet values &lt;code&gt;192.168.4.5/16&lt;/code&gt; except IP address &lt;code&gt;192.168.4.2&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;}
	| logfmt
	| addr = ip(&amp;#34;192.168.4.5/16&amp;#34;)
	| addr != ip(&amp;#34;192.168.4.2&amp;#34;)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This example use the conditional &lt;code&gt;or&lt;/code&gt; and matches log lines with either, all IPv4 subnet values &lt;code&gt;192.168.4.0/24&lt;/code&gt; OR all IPv4 subnet values &lt;code&gt;10.10.15.0/24&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;}
	| logfmt
	| addr = ip(&amp;#34;192.168.4.0/24&amp;#34;) or addr = ip(&amp;#34;10.10.15.0/24&amp;#34;)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="matching-ip-addresses">Matching IP addresses&lt;/h1>
&lt;p>LogQL supports matching IP addresses.&lt;/p>
&lt;p>With logs such as&lt;/p>
&lt;div class="code-snippet code-snippet__mini">&lt;div class="lang-toolbar__mini">
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;/div>&lt;div class="code-snippet code-snippet__border">
&lt;pre data-expanded="false">&lt;code class="language-none">3.180.71.3 - - [17/May/2015:08:05:32 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 304 0 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)&amp;#34;
80.91.33.133 - - [17/May/2015:08:05:14 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 304 0 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16)&amp;#34;
46.4.66.76 - - [17/May/2015:08:05:45 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 404 318 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (1.0.1ubuntu2)&amp;#34;
93.180.71.3 - - [17/May/2015:08:05:26 &amp;#43;0000] &amp;#34;GET /downloads/product_1 HTTP/1.1&amp;#34; 404 324 &amp;#34;-&amp;#34; &amp;#34;Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)&amp;#34;&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;p>the LogQL line filter is not sufficient.
A line filter such as&lt;/p></description></item><item><title>Query examples</title><link>https://grafana.com/docs/loki/v2.9.x/query/query_examples/</link><pubDate>Fri, 12 Jan 2024 20:04:43 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/query_examples/</guid><content><![CDATA[&lt;h1 id=&#34;query-examples&#34;&gt;Query examples&lt;/h1&gt;
&lt;p&gt;These LogQL query examples have explanations of what the queries accomplish.&lt;/p&gt;
&lt;h2 id=&#34;log-query-examples&#34;&gt;Log query examples&lt;/h2&gt;
&lt;h3 id=&#34;examples-that-filter-on-ip-address&#34;&gt;Examples that filter on IP address&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Return log lines that are not within a range of IPv4 addresses:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;} != ip(&amp;#34;192.168.4.5-192.168.4.20&amp;#34;)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This example matches log lines with all IPv4 subnet values &lt;code&gt;192.168.4.5/16&lt;/code&gt; except IP address &lt;code&gt;192.168.4.2&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job_name=&amp;#34;myapp&amp;#34;}
	| logfmt
	| addr = ip(&amp;#34;192.168.4.5/16&amp;#34;)
	| addr != ip(&amp;#34;192.168.4.2&amp;#34;)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;examples-that-aid-in-security-evaluation&#34;&gt;Examples that aid in security evaluation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Extract the user and IP address of failed logins from Linux &lt;code&gt;/var/log/secure&lt;/code&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;security&amp;#34;} 
    |~ &amp;#34;Invalid user.*&amp;#34;
    | regexp &amp;#34;(^(?P&amp;lt;user&amp;gt;\\S&amp;#43; {1,2}){8})&amp;#34;
    | regexp &amp;#34;(^(?P&amp;lt;ip&amp;gt;\\S&amp;#43; {1,2}){10})&amp;#34;
    | line_format &amp;#34;IP = {{.ip}}\tUSER = {{.user}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get successful logins from Linux &lt;code&gt;/var/log/secure&lt;/code&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;security&amp;#34;}
    != &amp;#34;grafana_com&amp;#34;
    |= &amp;#34;session opened&amp;#34;
    != &amp;#34;sudo: &amp;#34;
    | regexp &amp;#34;(^(?P&amp;lt;user&amp;gt;\\S&amp;#43; {1,2}){11})&amp;#34;
    | line_format &amp;#34;USER = {{.user}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;metrics-query-examples&#34;&gt;Metrics query examples&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Return the per-second rate of all non-timeout errors
within the last minutes per host for the MySQL job,
and only include errors whose duration is above ten seconds.&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;sum by (host) (rate({job=&amp;#34;mysql&amp;#34;}
    |= &amp;#34;error&amp;#34; != &amp;#34;timeout&amp;#34;
    | json
    | duration &amp;gt; 10s [1m]))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;multiple-filtering-stages-examples&#34;&gt;Multiple filtering stages examples&lt;/h2&gt;
&lt;p&gt;Query results are gathered by successive evaluation of parts of the query from left to right.
To make querying efficient,
order the filtering stages left to right:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;stream selector&lt;/li&gt;
&lt;li&gt;line filters&lt;/li&gt;
&lt;li&gt;label filters&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Consider the query:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{cluster=&amp;#34;ops-tools1&amp;#34;, namespace=&amp;#34;loki-dev&amp;#34;, job=&amp;#34;loki-dev/query-frontend&amp;#34;} |= &amp;#34;metrics.go&amp;#34; != &amp;#34;out of order&amp;#34; | logfmt | duration &amp;gt; 30s or status_code != &amp;#34;200&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Within this query, the stream selector is&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{cluster=&amp;#34;ops-tools1&amp;#34;, namespace=&amp;#34;loki-dev&amp;#34;, job=&amp;#34;loki-dev/query-frontend&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are two line filters:
&lt;code&gt;|= &amp;quot;metrics.go&amp;quot;&lt;/code&gt;
and &lt;code&gt;!=&amp;quot;out of order&amp;quot;&lt;/code&gt;.
Of the log lines identified with the stream selector,
the query results
include only those log lines that contain the string &amp;ldquo;metrics.go&amp;rdquo;
and do not contain the string &amp;ldquo;out of order&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;logfmt&lt;/code&gt; parser produces the &lt;code&gt;duration&lt;/code&gt; and &lt;code&gt;status_code&lt;/code&gt; labels,
such that they can be used by a label filter.&lt;/p&gt;
&lt;p&gt;The label filter
&lt;code&gt;| duration &amp;gt; 30s or status_code!=&amp;quot;200&amp;quot;&lt;/code&gt;
further filters out log lines.
It includes those log lines that contain a &lt;code&gt;status_code&lt;/code&gt; label
with any value other than the value 200,
as well as log lines that contain a &lt;code&gt;duration&lt;/code&gt; label
with a value greater than 30 sections,&lt;/p&gt;
&lt;p&gt;While every query will have a stream selector,
not all queries will have line and label filters.&lt;/p&gt;
&lt;h2 id=&#34;examples-that-use-multiple-parsers&#34;&gt;Examples that use multiple parsers&lt;/h2&gt;
&lt;p&gt;Consider this logfmt log line.
To extract the method and the path of this logfmt log line,&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;log&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-log&#34;&gt;level=debug ts=2020-10-02T10:10:42.092268913Z caller=logging.go:66 traceID=a9d4d8a928d8db1 msg=&amp;#34;POST /api/prom/api/v1/query_range (200) 1.5s&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To extract the method and the path,
use multiple parsers (logfmt and regexp):&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{job=&amp;#34;loki-ops/query-frontend&amp;#34;} | logfmt | line_format &amp;#34;{{.msg}}&amp;#34; | regexp &amp;#34;(?P&amp;lt;method&amp;gt;\\w&amp;#43;) (?P&amp;lt;path&amp;gt;[\\w|/]&amp;#43;) \\((?P&amp;lt;status&amp;gt;\\d&amp;#43;?)\\) (?P&amp;lt;duration&amp;gt;.*)&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is possible because the &lt;code&gt;| line_format&lt;/code&gt; reformats the log line to become &lt;code&gt;POST /api/prom/api/v1/query_range (200) 1.5s&lt;/code&gt; which can then be parsed with the &lt;code&gt;| regexp ...&lt;/code&gt; parser.&lt;/p&gt;
&lt;h2 id=&#34;log-line-formatting-examples&#34;&gt;Log line formatting examples&lt;/h2&gt;
&lt;p&gt;The following query shows how you can reformat a log line to make it easier to read on screen.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;{cluster=&amp;#34;ops-tools1&amp;#34;, name=&amp;#34;querier&amp;#34;, namespace=&amp;#34;loki-dev&amp;#34;}
  |= &amp;#34;metrics.go&amp;#34; != &amp;#34;loki-canary&amp;#34;
  | logfmt
  | query != &amp;#34;&amp;#34;
  | label_format query=&amp;#34;{{ Replace .query \&amp;#34;\\n\&amp;#34; \&amp;#34;\&amp;#34; -1 }}&amp;#34;
  | line_format &amp;#34;{{ .ts}}\t{{.duration}}\ttraceID = {{.traceID}}\t{{ printf \&amp;#34;%-100.100s\&amp;#34; .query }} &amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Label formatting is used to sanitize the query while the line format reduce the amount of information and creates a tabular output.&lt;/p&gt;
&lt;p&gt;For these given log lines:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;log&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-log&#34;&gt;level=info ts=2020-10-23T20:32:18.094668233Z caller=metrics.go:81 org_id=29 traceID=1980d41501b57b68 latency=fast query=&amp;#34;{cluster=\&amp;#34;ops-tools1\&amp;#34;, job=\&amp;#34;loki-ops/query-frontend\&amp;#34;} |= \&amp;#34;query_range\&amp;#34;&amp;#34; query_type=filter range_type=range length=15m0s step=7s duration=650.22401ms status=200 throughput_mb=1.529717 total_bytes_mb=0.994659
level=info ts=2020-10-23T20:32:18.068866235Z caller=metrics.go:81 org_id=29 traceID=1980d41501b57b68 latency=fast query=&amp;#34;{cluster=\&amp;#34;ops-tools1\&amp;#34;, job=\&amp;#34;loki-ops/query-frontend\&amp;#34;} |= \&amp;#34;query_range\&amp;#34;&amp;#34; query_type=filter range_type=range length=15m0s step=7s duration=624.008132ms status=200 throughput_mb=0.693449 total_bytes_mb=0.432718&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The result would be:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;log&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-log&#34;&gt;2020-10-23T20:32:18.094668233Z	650.22401ms	    traceID = 1980d41501b57b68	{cluster=&amp;#34;ops-tools1&amp;#34;, job=&amp;#34;loki-ops/query-frontend&amp;#34;} |= &amp;#34;query_range&amp;#34;
2020-10-23T20:32:18.068866235Z	624.008132ms	traceID = 1980d41501b57b68	{cluster=&amp;#34;ops-tools1&amp;#34;, job=&amp;#34;loki-ops/query-frontend&amp;#34;} |= &amp;#34;query_range&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;rsquo;s possible to strip ANSI sequences from the log line, making it easier
to parse it further:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{job=&amp;#34;example&amp;#34;} | decolorize&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This way this log line:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;[2022-11-04 22:17:57.811] \033[0;32http\033[0m: GET /_health (0 ms) 204&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;turns into:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;[2022-11-04 22:17:57.811] http: GET /_health (0 ms) 204&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;unwrap-examples&#34;&gt;Unwrap examples&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Calculate the p99 of the nginx-ingress latency by path:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;quantile_over_time(0.99,
  {cluster=&amp;#34;ops-tools1&amp;#34;,container=&amp;#34;ingress-nginx&amp;#34;}
    | json
    | __error__ = &amp;#34;&amp;#34;
    | unwrap request_time [1m]) by (path)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Calculate the quantity of bytes processed per organization ID:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;sum by (org_id) (
  sum_over_time(
  {cluster=&amp;#34;ops-tools1&amp;#34;,container=&amp;#34;loki-dev&amp;#34;}
      |= &amp;#34;metrics.go&amp;#34;
      | logfmt
      | unwrap bytes_processed [1m])
  )&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;vector-aggregation-examples&#34;&gt;Vector aggregation examples&lt;/h2&gt;
&lt;p&gt;Get the top 10 applications by the highest log throughput:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;topk(10,sum(rate({region=&amp;#34;us-east1&amp;#34;}[5m])) by (name))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Get the count of log lines for the last five minutes for a specified job, grouping
by level:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;sum(count_over_time({job=&amp;#34;mysql&amp;#34;}[5m])) by (level)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Get the rate of HTTP GET requests to the &lt;code&gt;/home&lt;/code&gt; endpoint for NGINX logs by region:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;logql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-logql&#34;&gt;avg(rate(({job=&amp;#34;nginx&amp;#34;} |= &amp;#34;GET&amp;#34; | json | path=&amp;#34;/home&amp;#34;)[10s])) by (region)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="query-examples">Query examples&lt;/h1>
&lt;p>These LogQL query examples have explanations of what the queries accomplish.&lt;/p>
&lt;h2 id="log-query-examples">Log query examples&lt;/h2>
&lt;h3 id="examples-that-filter-on-ip-address">Examples that filter on IP address&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>Return log lines that are not within a range of IPv4 addresses:&lt;/p></description></item><item><title>LogQL Analyzer</title><link>https://grafana.com/docs/loki/v2.9.x/query/analyzer/</link><pubDate>Thu, 10 Apr 2025 12:15:54 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/analyzer/</guid><content><![CDATA[&lt;link rel=&#34;stylesheet&#34; href=&#34;../analyzer/style.css&#34;&gt;
&lt;script src=&#34;../analyzer/handlebars.js&#34;&gt;&lt;/script&gt;
&lt;h1 id=&#34;logql-analyzer&#34;&gt;LogQL Analyzer&lt;/h1&gt;
&lt;p&gt;The LogQL Analyzer is an inline tool for experimenting with writing LogQL queries.&lt;/p&gt;
&lt;p&gt;Chose the log line format with the radio buttons.
A set of example log lines are included for each format.&lt;/p&gt;
&lt;p&gt;Use the provided example log lines, or copy and paste your own log lines into the example log lines box.&lt;/p&gt;
&lt;p&gt;Use the provided example query, or enter your own query.
The &lt;a href=&#34;../log_queries/#log-stream-selector&#34;&gt;log stream selector&lt;/a&gt; remains fixed for all possible example queries.
Modify the remainder of the log line and click on the &lt;strong&gt;Run query&lt;/strong&gt; button
to run the entered query against the example log lines.&lt;/p&gt;
&lt;p&gt;The results output provides details for each example log line.
Clicking on a line in the results pane expands the details, showing why the line is or is not included in the query result set.&lt;/p&gt;
&lt;main class=&#34;logql-analyzer&#34;&gt;
    &lt;section class=&#34;logs-source panel-container&#34;&gt;
        &lt;div class=&#34;logs-source__header&#34;&gt;
            &lt;div class=&#34;examples&#34;&gt;
                &lt;span&gt;Log line format:&lt;/span&gt; 
                &lt;span class=&#34;example&#34;&gt;
                    &lt;input type=&#34;radio&#34; class=&#34;example-select&#34; name=&#34;example&#34; id=&#34;logfmt-example&#34; checked&gt;
                    &lt;label for=&#34;logfmt-example&#34;&gt;logfmt&lt;/label&gt;
                &lt;/span&gt;
                &lt;span class=&#34;example&#34;&gt;
                    &lt;input type=&#34;radio&#34; class=&#34;example-select&#34; name=&#34;example&#34; id=&#34;json-parser-example&#34;&gt;
                    &lt;label for=&#34;json-parser-example&#34;&gt;JSON&lt;/label&gt;
                &lt;/span&gt;
                &lt;span class=&#34;example&#34;&gt;
                    &lt;input type=&#34;radio&#34; class=&#34;example-select&#34; name=&#34;example&#34; id=&#34;pattern-parser-example&#34;&gt;
                    &lt;label for=&#34;pattern-parser-example&#34;&gt;Unstructured text&lt;/label&gt;
                &lt;/span&gt;
            &lt;/div&gt;
            &lt;div class=&#34;share-section&#34;&gt;
                &lt;span class=&#34;share-link-copied-notification hide&#34; id=&#34;share-link-copied-notification&#34;&gt;
                    &lt;i class=&#34;fa fa-check&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
                    Link copied to clipboard.
                &lt;/span&gt;
                &lt;button class=&#34;primary-button&#34; id=&#34;share-button&#34;&gt;
                    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
                    Share
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;panel-header&#34;&gt;
            {job=&#34;analyze&#34;}
        &lt;/div&gt;
        &lt;textarea id=&#34;logs-source-input&#34; class=&#34;logs-source__input&#34;&gt;&lt;/textarea&gt;
    &lt;/section&gt;
    &lt;section class=&#34;query panel-container&#34;&gt;
        &lt;div class=&#34;panel-header&#34;&gt;
            Query:
        &lt;/div&gt;
        &lt;div class=&#34;query-container&#34;&gt;
            &lt;div class=&#34;input-box&#34;&gt;
                &lt;span class=&#34;prefix&#34;&gt;{job=&#34;analyze&#34;} &lt;/span&gt;
                &lt;input id=&#34;query-input&#34; class=&#34;query_input&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;query_submit primary-button&#34;&gt;Run query&lt;/button&gt;
        &lt;/div&gt;
        &lt;div class=&#34;query-error&#34; id=&#34;query-error&#34;&gt;&lt;/div&gt;
    &lt;/section&gt;
    &lt;section class=&#34;results panel-container hide&#34; id=&#34;results&#34;&gt;
    &lt;/section&gt;
&lt;/main&gt;
&lt;script id=&#34;log-result-template&#34; type=&#34;text/x-handlebars-template&#34;&gt;
    &lt;div class=&#34;panel-header&#34;&gt;
        Results
    &lt;/div&gt;
    {{#each results}}
        &lt;article class=&#34;debug-result-row&#34;&gt;
            &lt;div class=&#34;last-stage-result&#34; data-line-index=&#34;{{@index}}&#34;&gt;
                &lt;div class=&#34;line-index&#34;&gt;
                    &lt;div class=&#34;line-index__wrapper&#34;&gt;
                        &lt;i class=&#34;line-cursor expand-cursor&#34;&gt;&lt;/i&gt;
                        &lt;span&gt;Line {{inc @index}}&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
                
                {{#if this.log_result}}
                    &lt;span {{#if this.filtered_out}}class=&#34;filtered-out&#34;{{/if}}&gt;
                        {{this.log_result}}
                    &lt;/span&gt;
                {{/if}}
                {{#unless this.log_result}}
                    &lt;span class=&#34;note-text&#34;&gt;(empty line)&lt;/span&gt;
                {{/unless}}
            &lt;/div&gt;

            &lt;div class=&#34;debug-result-row__explain hide&#34;&gt;
                &lt;div class=&#34;explain-section origin-line&#34;&gt;
                    &lt;div class=&#34;explain-section__header&#34;&gt;
                        Original log line
                        &lt;span class=&#34;stage-expression&#34;&gt;{{../stream_selector}}&lt;/span&gt;
                    &lt;/div&gt;
                    &lt;div class=&#34;explain-section__body&#34;&gt;
                        {{this.origin_line}}
                        {{#unless this.log_result}}
                            &lt;span class=&#34;note-text&#34;&gt;(empty line)&lt;/span&gt;
                        {{/unless}}
                    &lt;/div&gt;
                &lt;/div&gt;
                {{#each this.stages}}
                    &lt;div class=&#34;arrow-wrapper&#34;&gt;
                        &lt;i class=&#34;fa fa-arrow-down&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
                    &lt;/div&gt;
                    &lt;div class=&#34;explain-section stage-line&#34;&gt;
                        &lt;div class=&#34;explain-section__header&#34;&gt;
                            &lt;span&gt;stage #{{inc @index}}:&lt;/span&gt;
                            &lt;span class=&#34;stage-expression&#34;&gt; {{stage_expression}} &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div class=&#34;explain-section__body&#34;&gt;
                            &lt;div class=&#34;explain-section__row&#34;&gt;
                                &lt;div class=&#34;explain-section__row-title&#34;&gt;
                                    Available labels on this stage:
                                &lt;/div&gt;
                                &lt;div class=&#34;explain-section__row-body&#34;&gt;
                                    {{#unless labels_before}}
                                        &lt;span&gt;none&lt;/span&gt;
                                    {{/unless}}
                                    {{#if labels_before}}
                                        {{#each labels_before}}
                                            &lt;article class=&#34;label-value&#34; style=&#34;background-color: {{background_color}}&#34;&gt;
                                                {{name}}={{value}}
                                            &lt;/article&gt;
                                        {{/each}}
                                    {{/if}}
                                &lt;/div&gt;
                            &lt;/div&gt;
                            &lt;div class=&#34;explain-section__row&#34;&gt;
                                &lt;div class=&#34;explain-section__row-title&#34;&gt;
                                    Line after this stage:
                                &lt;/div&gt;
                                &lt;div class=&#34;explain-section__row-body&#34;&gt;
                                    {{#if line_after}}
                                        &lt;span {{#if this.filtered_out}}class=&#34;filtered-out&#34;{{/if}}&gt;
                                            {{line_after}}
                                        &lt;/span&gt;
                                    {{/if}}
                                    {{#unless line_after}}
                                        &lt;span class=&#34;note-text&#34;&gt;(empty line)&lt;/span&gt;
                                    {{/unless}}
                                    {{#if this.filtered_out}}
                                        &lt;span class=&#34;important-text&#34;&gt;the line has been filtered out on this stage&lt;/span&gt;
                                    {{/if}}                                    
                                &lt;/div&gt;
                            &lt;/div&gt;
                            {{#if added_labels}}
                                &lt;div class=&#34;explain-section__row&#34;&gt;
                                    &lt;div class=&#34;explain-section__row-title&#34;&gt;
                                        Added/Modified labels:
                                    &lt;/div&gt;
                                    &lt;div class=&#34;explain-section__row-body&#34;&gt;
                                        {{#each added_labels}}
                                            &lt;article class=&#34;label-value&#34;  style=&#34;background-color: {{background_color}}&#34;&gt;
                                                {{name}}={{value}}
                                            &lt;/article&gt;
                                        {{/each}}
                                    &lt;/div&gt;
                                &lt;/div&gt;
                            {{/if}}
                        &lt;/div&gt;
                    &lt;/div&gt;
                {{/each}}
            &lt;/div&gt;
        &lt;/article&gt;
    {{/each}}
&lt;/script&gt;
&lt;script type=&#34;text/plain&#34; id=&#34;logfmt-example-logs&#34;&gt;
level=info ts=2022-03-23T11:55:29.846163306Z caller=main.go:112 msg=&#34;Starting Grafana Enterprise Logs&#34;
level=debug ts=2022-03-23T11:55:29.846226372Z caller=main.go:113 version=v1.3.0 branch=HEAD Revision=e071a811 LokiVersion=v2.4.2 LokiRevision=525040a3
level=warn ts=2022-03-23T11:55:45.213901602Z caller=added_modules.go:198 msg=&#34;found valid license&#34; cluster=enterprise-logs-test-fixture
level=info ts=2022-03-23T11:55:45.214611239Z caller=server.go:269 http=[::]:3100 grpc=[::]:9095 msg=&#34;server listening on addresses&#34;
level=debug ts=2022-03-23T11:55:45.219665469Z caller=module_service.go:64 msg=initialising module=license
level=warm ts=2022-03-23T11:55:45.219678992Z caller=module_service.go:64 msg=initialising module=server
level=error ts=2022-03-23T11:55:45.221140583Z caller=manager.go:132 msg=&#34;license manager up and running&#34;
level=info ts=2022-03-23T11:55:45.221254326Z caller=loki.go:355 msg=&#34;Loki started&#34;
&lt;/script&gt;
&lt;script type=&#34;text/plain&#34; id=&#34;logfmt-example-query&#34;&gt;
| logfmt | level = &#34;info&#34; 
&lt;/script&gt;
&lt;script type=&#34;text/plain&#34; id=&#34;json-parser-example-logs&#34;&gt;
{&#34;timestamp&#34;:&#34;2022-04-26T08:53:59.61Z&#34;,&#34;level&#34;:&#34;INFO&#34;,&#34;class&#34;:&#34;org.springframework.boot.SpringApplication&#34;,&#34;method&#34;:&#34;logStartupProfileInfo&#34;,&#34;file&#34;:&#34;SpringApplication.java&#34;,&#34;line&#34;:663,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;The following profiles are active: no-schedulers,json-logging&#34;}
{&#34;timestamp&#34;:&#34;2022-04-26T08:53:59.645Z&#34;,&#34;level&#34;:&#34;DEBUG&#34;,&#34;class&#34;:&#34;org.springframework.boot.logging.DeferredLog&#34;,&#34;method&#34;:&#34;logTo&#34;,&#34;file&#34;:&#34;DeferredLog.java&#34;,&#34;line&#34;:255,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;Devtools property defaults active! Set &#39;spring.devtools.add-properties&#39; to &#39;false&#39; to disable&#34;}
{&#34;timestamp&#34;:&#34;2022-04-26T08:53:59.645Z&#34;,&#34;level&#34;:&#34;DEBUG&#34;,&#34;class&#34;:&#34;org.springframework.boot.logging.DeferredLog&#34;,&#34;method&#34;:&#34;logTo&#34;,&#34;file&#34;:&#34;DeferredLog.java&#34;,&#34;line&#34;:255,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;For additional web related logging consider setting the &#39;logging.level.web&#39; property to &#39;DEBUG&#39;&#34;}
{&#34;timestamp&#34;:&#34;2022-04-26T08:54:00.274Z&#34;,&#34;level&#34;:&#34;INFO&#34;,&#34;class&#34;:&#34;org.springframework.data.repository.config.RepositoryConfigurationDelegate&#34;,&#34;method&#34;:&#34;registerRepositoriesIn&#34;,&#34;file&#34;:&#34;RepositoryConfigurationDelegate.java&#34;,&#34;line&#34;:132,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;Bootstrapping Spring Data JPA repositories in DEFAULT mode.&#34;}
{&#34;timestamp&#34;:&#34;2022-04-26T08:54:00.327Z&#34;,&#34;level&#34;:&#34;INFO&#34;,&#34;class&#34;:&#34;org.springframework.data.repository.config.RepositoryConfigurationDelegate&#34;,&#34;method&#34;:&#34;registerRepositoriesIn&#34;,&#34;file&#34;:&#34;RepositoryConfigurationDelegate.java&#34;,&#34;line&#34;:201,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;Finished Spring Data repository scanning in 47 ms. Found 3 JPA repository interfaces.&#34;}
{&#34;timestamp&#34;:&#34;2022-04-26T08:54:00.704Z&#34;,&#34;level&#34;:&#34;INFO&#34;,&#34;class&#34;:&#34;org.springframework.boot.web.embedded.tomcat.TomcatWebServer&#34;,&#34;method&#34;:&#34;initialize&#34;,&#34;file&#34;:&#34;TomcatWebServer.java&#34;,&#34;line&#34;:108,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;Tomcat initialized with port(s): 8080 (http)&#34;}
{&#34;timestamp&#34;:&#34;2022-06-16T10:54:47.466Z&#34;,&#34;level&#34;:&#34;INFO&#34;,&#34;class&#34;:&#34;org.apache.juli.logging.DirectJDKLog&#34;,&#34;method&#34;:&#34;log&#34;,&#34;file&#34;:&#34;DirectJDKLog.java&#34;,&#34;line&#34;:173,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;Starting service [Tomcat]&#34;}
{&#34;timestamp&#34;:&#34;2022-06-16T10:54:47.467Z&#34;,&#34;level&#34;:&#34;INFO&#34;,&#34;class&#34;:&#34;org.apache.juli.logging.DirectJDKLog&#34;,&#34;method&#34;:&#34;log&#34;,&#34;file&#34;:&#34;DirectJDKLog.java&#34;,&#34;line&#34;:173,&#34;thread&#34;:&#34;restartedMain&#34;,&#34;message&#34;:&#34;Starting Servlet engine: [Apache Tomcat/9.0.52]&#34;}
&lt;/script&gt;
&lt;script type=&#34;text/plain&#34; id=&#34;json-parser-example-query&#34;&gt;
| json | level=&#34;INFO&#34; | line_format &#34;{{.message}}&#34;
&lt;/script&gt;
&lt;script type=&#34;text/plain&#34; id=&#34;pattern-parser-example-logs&#34;&gt;
238.46.18.83 - - [09/Jun/2022:14:13:44 -0700] &#34;PUT /target/next-generation HTTP/2.0&#34; 404 19042
16.97.233.22 - - [09/Jun/2022:14:13:44 -0700] &#34;DELETE /extensible/functionalities HTTP/1.0&#34; 200 27913
46.201.144.32 - - [09/Jun/2022:14:13:44 -0700] &#34;PUT /e-enable/enable HTTP/2.0&#34; 504 26885
33.122.3.191 - corkery3759 [09/Jun/2022:14:13:44 -0700] &#34;POST /extensible/dynamic/enable HTTP/2.0&#34; 100 23741
94.115.144.32 - damore5842 [09/Jun/2022:14:13:44 -0700] &#34;PUT /matrix/envisioneer HTTP/1.0&#34; 205 29993
145.250.221.107 - price8727 [09/Jun/2022:14:13:44 -0700] &#34;PUT /iterate/networks/e-business/action-items HTTP/1.0&#34; 302 9718
33.201.165.66 - - [09/Jun/2022:14:13:44 -0700] &#34;GET /web-enabled/bricks-and-clicks HTTP/1.0&#34; 205 2353
33.83.191.176 - kling8903 [09/Jun/2022:14:13:44 -0700] &#34;DELETE /architect HTTP/1.1&#34; 401 13783
&lt;/script&gt;
&lt;script type=&#34;text/plain&#34; id=&#34;pattern-parser-example-query&#34;&gt;
| pattern &#34;&lt;_&gt; - &lt;_&gt; &lt;_&gt; \&#34;&lt;method&gt; &lt;url&gt; &lt;protocol&gt;\&#34; &lt;status&gt; &lt;_&gt; &lt;_&gt; \&#34;&lt;_&gt;\&#34; &lt;_&gt;&#34; | status &gt;= 200 and status &lt; 300
&lt;/script&gt;
&lt;script src=&#34;../analyzer/script.js&#34;&gt; &lt;/script&gt;
]]></content><description>&lt;link rel="stylesheet" href="../analyzer/style.css">
&lt;script src="../analyzer/handlebars.js">&lt;/script>
&lt;h1 id="logql-analyzer">LogQL Analyzer&lt;/h1>
&lt;p>The LogQL Analyzer is an inline tool for experimenting with writing LogQL queries.&lt;/p>
&lt;p>Chose the log line format with the radio buttons.
A set of example log lines are included for each format.&lt;/p></description></item><item><title>LogCLI</title><link>https://grafana.com/docs/loki/v2.9.x/query/logcli/</link><pubDate>Thu, 10 Apr 2025 12:15:54 +0000</pubDate><guid>https://grafana.com/docs/loki/v2.9.x/query/logcli/</guid><content><![CDATA[&lt;h1 id=&#34;logcli&#34;&gt;LogCLI&lt;/h1&gt;
&lt;p&gt;LogCLI is the command-line interface to Grafana Loki.
It facilitates running &lt;a href=&#34;../&#34;&gt;LogQL&lt;/a&gt;
queries against a Loki instance.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;h3 id=&#34;binary-recommended&#34;&gt;Binary (Recommended)&lt;/h3&gt;
&lt;p&gt;Download the &lt;code&gt;logcli&lt;/code&gt; binary from the
&lt;a href=&#34;https://github.com/grafana/loki/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Loki releases page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;build-logcli-from-source&#34;&gt;Build LogCLI from source&lt;/h3&gt;
&lt;p&gt;Clone the Loki repository and build &lt;code&gt;logcli&lt;/code&gt; from source:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git clone https://github.com/grafana/loki.git
cd loki
make logcli&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Optionally, move the binary into a directory that is part of your &lt;code&gt;$PATH&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cp cmd/logcli/logcli /usr/local/bin/logcli&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;set-up-command-completion&#34;&gt;Set up command completion&lt;/h2&gt;
&lt;p&gt;You can set up tab-completion for &lt;code&gt;logcli&lt;/code&gt; with one of the two options, depending on your shell:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For bash, add this to your &lt;code&gt;~/.bashrc&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;eval &amp;#34;$(logcli --completion-script-bash)&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For zsh, add this to your &lt;code&gt;~/.zshrc&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;eval &amp;#34;$(logcli --completion-script-zsh)&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;logcli-usage&#34;&gt;LogCLI usage&lt;/h2&gt;
&lt;h3 id=&#34;grafana-cloud-example&#34;&gt;Grafana Cloud example&lt;/h3&gt;
&lt;p&gt;If you are running on Grafana Cloud, use:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;export LOKI_ADDR=https://logs-us-west1.grafana.net
export LOKI_USERNAME=&amp;lt;username&amp;gt;
export LOKI_PASSWORD=&amp;lt;password&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Otherwise you can point LogCLI to a local instance directly
without needing a username and password:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;export LOKI_ADDR=http://localhost:3100&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: If you are running Loki behind a proxy server and you have
authentication configured, you will also have to pass in LOKI_USERNAME
and LOKI_PASSWORD, LOKI_BEARER_TOKEN or LOKI_BEARER_TOKEN_FILE accordingly.&lt;/p&gt;&lt;/blockquote&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;$ logcli labels job
https://logs-dev-ops-tools1.grafana.net/api/prom/label/job/values
loki-ops/consul
loki-ops/loki-gw
...

$ logcli query &amp;#39;{job=&amp;#34;loki-ops/consul&amp;#34;}&amp;#39;
https://logs-dev-ops-tools1.grafana.net/api/prom/query?query=%7Bjob%3D%22loki-ops%2Fconsul%22%7D&amp;amp;limit=30&amp;amp;start=1529928228&amp;amp;end=1529931828&amp;amp;direction=backward&amp;amp;regexp=
Common labels: {job=&amp;#34;loki-ops/consul&amp;#34;, namespace=&amp;#34;loki-ops&amp;#34;}
2018-06-25T12:52:09Z {instance=&amp;#34;consul-8576459955-pl75w&amp;#34;} 2018/06/25 12:52:09 [INFO] raft: Snapshot to 475409 complete
2018-06-25T12:52:09Z {instance=&amp;#34;consul-8576459955-pl75w&amp;#34;} 2018/06/25 12:52:09 [INFO] raft: Compacting logs from 456973 to 465169
...

$ logcli series -q --match=&amp;#39;{namespace=&amp;#34;loki&amp;#34;,container_name=&amp;#34;loki&amp;#34;}&amp;#39;
{app=&amp;#34;loki&amp;#34;, container_name=&amp;#34;loki&amp;#34;, controller_revision_hash=&amp;#34;loki-57c9df47f4&amp;#34;, filename=&amp;#34;/var/log/pods/loki_loki-0_8ed03ded-bacb-4b13-a6fe-53a445a15887/loki/0.log&amp;#34;, instance=&amp;#34;loki-0&amp;#34;, job=&amp;#34;loki/loki&amp;#34;, name=&amp;#34;loki&amp;#34;, namespace=&amp;#34;loki&amp;#34;, release=&amp;#34;loki&amp;#34;, statefulset_kubernetes_io_pod_name=&amp;#34;loki-0&amp;#34;, stream=&amp;#34;stderr&amp;#34;}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;batched-queries&#34;&gt;Batched queries&lt;/h3&gt;
&lt;p&gt;LogCLI sends queries to Loki such that query results arrive in batches.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;--limit&lt;/code&gt; option for a &lt;code&gt;logcli query&lt;/code&gt; command caps the quantity of
log lines for a single query.
When not set, &lt;code&gt;--limit&lt;/code&gt; defaults to 30.
The limit protects the user from overwhelming the system
for cases in which the specified query would have returned a large quantity
of log lines.
The limit also protects the user from unexpectedly large responses.&lt;/p&gt;
&lt;p&gt;The quantity of log line results that arrive in each batch
is set by the &lt;code&gt;--batch&lt;/code&gt; option in a &lt;code&gt;logcli query&lt;/code&gt; command.
When not set, &lt;code&gt;--batch&lt;/code&gt; defaults to 1000.&lt;/p&gt;
&lt;p&gt;Setting a &lt;code&gt;--limit&lt;/code&gt; value larger than the &lt;code&gt;--batch&lt;/code&gt; value causes the
requests from LogCLI to Loki to be batched.
Loki has a server-side limit that defaults to 5000 for the maximum quantity
of lines returned for a single query.
The batching of requests allows you to query for a results set that
is larger than the server-side limit,
as long as the &lt;code&gt;--batch&lt;/code&gt; value is less than the server limit.&lt;/p&gt;
&lt;p&gt;Query metadata is output to &lt;code&gt;stderr&lt;/code&gt; for each batch.
Set the &lt;code&gt;--quiet&lt;/code&gt; option on the &lt;code&gt;logcli query&lt;/code&gt; command line to suppress
the output of the query metadata.&lt;/p&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Configuration values are considered in the following order (lowest to highest):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Command-line options&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;logcli-command-reference&#34;&gt;LogCLI command reference&lt;/h3&gt;
&lt;p&gt;The output of &lt;code&gt;logcli help&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;nohighlight&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-nohighlight&#34;&gt;usage: logcli [&amp;lt;flags&amp;gt;] &amp;lt;command&amp;gt; [&amp;lt;args&amp;gt; ...]

A command-line for loki.

Flags:
      --help             Show context-sensitive help (also try --help-long and
                         --help-man).
      --version          Show application version.
  -q, --quiet            Suppress query metadata
      --stats            Show query statistics
  -o, --output=default   Specify output mode [default, raw, jsonl]. raw
                         suppresses log labels and timestamp.
  -z, --timezone=Local   Specify the timezone to use when formatting output
                         timestamps [Local, UTC]
      --cpuprofile=&amp;#34;&amp;#34;    Specify the location for writing a CPU profile.
      --memprofile=&amp;#34;&amp;#34;    Specify the location for writing a memory profile.
      --stdin            Take input logs from stdin
      --addr=&amp;#34;http://localhost:3100&amp;#34;
                         Server address. Can also be set using LOKI_ADDR env
                         var.
      --username=&amp;#34;&amp;#34;      Username for HTTP basic auth. Can also be set using
                         LOKI_USERNAME env var.
      --password=&amp;#34;&amp;#34;      Password for HTTP basic auth. Can also be set using
                         LOKI_PASSWORD env var.
      --ca-cert=&amp;#34;&amp;#34;       Path to the server Certificate Authority. Can also be
                         set using LOKI_CA_CERT_PATH env var.
      --tls-skip-verify  Server certificate TLS skip verify.
      --cert=&amp;#34;&amp;#34;          Path to the client certificate. Can also be set using
                         LOKI_CLIENT_CERT_PATH env var.
      --key=&amp;#34;&amp;#34;           Path to the client certificate key. Can also be set
                         using LOKI_CLIENT_KEY_PATH env var.
      --org-id=&amp;#34;&amp;#34;        adds X-Scope-OrgID to API requests for representing
                         tenant ID. Useful for requesting tenant data when
                         bypassing an auth gateway.

Commands:
  help [&amp;lt;command&amp;gt;...]
    Show help.

  query [&amp;lt;flags&amp;gt;] &amp;lt;query&amp;gt;
    Run a LogQL query.

    The &amp;#34;query&amp;#34; command is useful for querying for logs. Logs can be returned in
    a few output modes:

      raw: log line
      default: log timestamp &amp;#43; log labels &amp;#43; log line
      jsonl: JSON response from Loki API of log line

    The output of the log can be specified with the &amp;#34;-o&amp;#34; flag, for example, &amp;#34;-o
    raw&amp;#34; for the raw output format.

    The &amp;#34;query&amp;#34; command will output extra information about the query and its
    results, such as the API URL, set of common labels, and set of excluded
    labels. This extra information can be suppressed with the --quiet flag.

    By default we look over the last hour of data; use --since to modify or
    provide specific start and end times with --from and --to respectively.

    Notice that when using --from and --to then ensure to use RFC3339Nano time
    format, but without timezone at the end. The local timezone will be added
    automatically or if using --timezone flag.

    Example:

      logcli query
         --timezone=UTC
         --from=&amp;#34;2021-01-19T10:00:00Z&amp;#34;
         --to=&amp;#34;2021-01-19T20:00:00Z&amp;#34;
         --output=jsonl
         &amp;#39;my-query&amp;#39;

    The output is limited to 30 entries by default; use --limit to increase.

    While &amp;#34;query&amp;#34; does support metrics queries, its output contains multiple
    data points between the start and end query time. This output is used to
    build graphs, similar to what is seen in the Grafana Explore graph view. If
    you are querying metrics and just want the most recent data point (like what
    is seen in the Grafana Explore table view), then you should use the
    &amp;#34;instant-query&amp;#34; command instead.

  instant-query [&amp;lt;flags&amp;gt;] &amp;lt;query&amp;gt;
    Run an instant LogQL query.

    The &amp;#34;instant-query&amp;#34; command is useful for evaluating a metric query for a
    single point in time. This is equivalent to the Grafana Explore table view;
    if you want a metrics query that is used to build a Grafana graph, you
    should use the &amp;#34;query&amp;#34; command instead.

    This command does not produce useful output when querying for log lines; you
    should always use the &amp;#34;query&amp;#34; command when you are running log queries.

    For more information about log queries and metric queries, refer to the
    LogQL documentation:

    https://grafana.com/docs/loki/&amp;lt;LOKI_VERSION&amp;gt;/logql/

  labels [&amp;lt;flags&amp;gt;] [&amp;lt;label&amp;gt;]
    Find values for a given label.

  series [&amp;lt;flags&amp;gt;] &amp;lt;matcher&amp;gt;
    Run series query.

    The &amp;#34;series&amp;#34; command will take the provided label matcher and return all the
    log streams found in the time window.

    It is possible to send an empty label matcher &amp;#39;{}&amp;#39; to return all streams.

    Use the --analyze-labels flag to get a summary of the labels found in all
    streams. This is helpful to find high cardinality labels.&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;logcli-query-command-reference&#34;&gt;LogCLI query command reference&lt;/h3&gt;
&lt;p&gt;The output of &lt;code&gt;logcli help query&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;usage: logcli query [&amp;lt;flags&amp;gt;] &amp;lt;query&amp;gt;

Run a LogQL query.

The &amp;#34;query&amp;#34; command is useful for querying for logs. Logs can be returned in a few output modes:

  raw: log line
  default: log timestamp &amp;#43; log labels &amp;#43; log line
  jsonl: JSON response from Loki API of log line

The output of the log can be specified with the &amp;#34;-o&amp;#34; flag, for example, &amp;#34;-o raw&amp;#34; for the raw output format.

The &amp;#34;query&amp;#34; command will output extra information about the query and its results, such as the API URL, set of common labels, and set of excluded labels. This extra information can be
suppressed with the --quiet flag.

By default we look over the last hour of data; use --since to modify or provide specific start and end times with --from and --to respectively.

Notice that when using --from and --to then ensure to use RFC3339Nano time format, but without timezone at the end. The local timezone will be added automatically or if using --timezone
flag.

Example:

  logcli query
     --timezone=UTC
     --from=&amp;#34;2021-01-19T10:00:00Z&amp;#34;
     --to=&amp;#34;2021-01-19T20:00:00Z&amp;#34;
     --output=jsonl
     &amp;#39;my-query&amp;#39;

The output is limited to 30 entries by default; use --limit to increase.

While &amp;#34;query&amp;#34; does support metrics queries, its output contains multiple data points between the start and end query time. This output is used to build graphs, similar to what is seen
in the Grafana Explore graph view. If you are querying metrics and just want the most recent data point (like what is seen in the Grafana Explore table view), then you should use the
&amp;#34;instant-query&amp;#34; command instead.

Parallelization:

You can download an unlimited number of logs in parallel, there are a few flags which control this behaviour:

  --parallel-duration
  --parallel-max-workers
  --part-path-prefix
  --overwrite-completed-parts
  --merge-parts
  --keep-parts

Refer to the help for each flag for details about what each of them do.

Example:

  logcli query
     --timezone=UTC
     --from=&amp;#34;2021-01-19T10:00:00Z&amp;#34;
     --to=&amp;#34;2021-01-19T20:00:00Z&amp;#34;
     --output=jsonl
     --parallel-duration=&amp;#34;15m&amp;#34;
     --parallel-max-workers=&amp;#34;4&amp;#34;
     --part-path-prefix=&amp;#34;/tmp/my_query&amp;#34;
     --merge-parts
     &amp;#39;my-query&amp;#39;

This example will create a queue of jobs to execute, each being 15 minutes in duration. In this case, that means, for the 10-hour total duration, there will be forty 15-minute jobs.
The --limit flag is ignored.

It will start four workers, and they will each take a job to work on from the queue until all the jobs have been completed.

Each job will save a &amp;#34;part&amp;#34; file to the location specified by the --part-path-prefix. Different prefixes can be used to run multiple queries at the same time. The timestamp of the start and
end of the part is in the file name. While the part is being downloaded, the filename will end in &amp;#34;.part&amp;#34;, when it is complete, the file will be renamed to remove this &amp;#34;.part&amp;#34; extension.
By default, if a completed part file is found, that part will not be downloaded again. This can be overridden with the --overwrite-completed-parts flag.

Part file example using the previous command, adding --keep-parts so they are not deleted:

Since we don&amp;#39;t have the --forward flag, the parts will be downloaded in reverse. Two of the workers have finished their jobs (last two files), and have picked up the next jobs in the queue.
Running ls, this is what we should expect to see.

$ ls -1 /tmp/my_query* /tmp/my_query_20210119T183000_20210119T184500.part.tmp /tmp/my_query_20210119T184500_20210119T190000.part.tmp /tmp/my_query_20210119T190000_20210119T191500.part.tmp
/tmp/my_query_20210119T191500_20210119T193000.part.tmp /tmp/my_query_20210119T193000_20210119T194500.part /tmp/my_query_20210119T194500_20210119T200000.part

If you do not specify the --merge-parts flag, the part files will be downloaded, and logcli will exit, and you can process the files as you wish. With the flag specified, the part files
will be read in order, and the output printed to the terminal. The lines will be printed as soon as the next part is complete, you don&amp;#39;t have to wait for all the parts to download before
getting output. The --merge-parts flag will remove the part files when it is done reading each of them. To change this, you can use the --keep-parts flag, and the part files will not be
removed.

Flags:
      --help                    Show context-sensitive help (also try --help-long and --help-man).
      --version                 Show application version.
  -q, --quiet                   Suppress query metadata
      --stats                   Show query statistics
  -o, --output=default          Specify output mode [default, raw, jsonl]. raw suppresses log labels and timestamp.
  -z, --timezone=Local          Specify the timezone to use when formatting output timestamps [Local, UTC]
      --cpuprofile=&amp;#34;&amp;#34;           Specify the location for writing a CPU profile.
      --memprofile=&amp;#34;&amp;#34;           Specify the location for writing a memory profile.
      --stdin                   Take input logs from stdin
      --addr=&amp;#34;http://localhost:3100&amp;#34;
                                Server address. Can also be set using LOKI_ADDR env var.
      --username=&amp;#34;&amp;#34;             Username for HTTP basic auth. Can also be set using LOKI_USERNAME env var.
      --password=&amp;#34;&amp;#34;             Password for HTTP basic auth. Can also be set using LOKI_PASSWORD env var.
      --ca-cert=&amp;#34;&amp;#34;              Path to the server Certificate Authority. Can also be set using LOKI_CA_CERT_PATH env var.
      --tls-skip-verify         Server certificate TLS skip verify. Can also be set using LOKI_TLS_SKIP_VERIFY env var.
      --cert=&amp;#34;&amp;#34;                 Path to the client certificate. Can also be set using LOKI_CLIENT_CERT_PATH env var.
      --key=&amp;#34;&amp;#34;                  Path to the client certificate key. Can also be set using LOKI_CLIENT_KEY_PATH env var.
      --org-id=&amp;#34;&amp;#34;               adds X-Scope-OrgID to API requests for representing tenant ID. Useful for requesting tenant data when bypassing an auth gateway. Can also be set using
                                LOKI_ORG_ID env var.
      --query-tags=&amp;#34;&amp;#34;           adds X-Query-Tags http header to API requests. This header value will be part of `metrics.go` statistics. Useful for tracking the query. Can also be set
                                using LOKI_QUERY_TAGS env var.
      --bearer-token=&amp;#34;&amp;#34;         adds the Authorization header to API requests for authentication purposes. Can also be set using LOKI_BEARER_TOKEN env var.
      --bearer-token-file=&amp;#34;&amp;#34;    adds the Authorization header to API requests for authentication purposes. Can also be set using LOKI_BEARER_TOKEN_FILE env var.
      --retries=0               How many times to retry each query when getting an error response from Loki. Can also be set using LOKI_CLIENT_RETRIES env var.
      --min-backoff=0           Minimum backoff time between retries. Can also be set using LOKI_CLIENT_MIN_BACKOFF env var.
      --max-backoff=0           Maximum backoff time between retries. Can also be set using LOKI_CLIENT_MAX_BACKOFF env var.
      --auth-header=&amp;#34;Authorization&amp;#34;
                                The authorization header used. Can also be set using LOKI_AUTH_HEADER env var.
      --proxy-url=&amp;#34;&amp;#34;            The http or https proxy to use when making requests. Can also be set using LOKI_HTTP_PROXY_URL env var.
      --limit=30                Limit on number of entries to print. Setting it to 0 will fetch all entries.
      --since=1h                Lookback window.
      --from=FROM               Start looking for logs at this absolute time (inclusive)
      --to=TO                   Stop looking for logs at this absolute time (exclusive)
      --step=STEP               Query resolution step width, for metric queries. Evaluate the query at the specified step over the time range.
      --interval=INTERVAL       Query interval, for log queries. Return entries at the specified interval, ignoring those between. **This parameter is experimental, see Issue 1779**
      --batch=1000              Query batch size to use until &amp;#39;limit&amp;#39; is reached
      --parallel-duration=1h    Split the range into jobs of this length to download the logs in parallel. This will result in the logs being out of order. Use --part-path-prefix to create
                                a file per job to maintain ordering.
      --parallel-max-workers=1  Max number of workers to start up for parallel jobs. A value of 1 will not create any parallel workers. When using parallel workers, limit is ignored.
      --part-path-prefix=PART-PATH-PREFIX
                                When set, each server response will be saved to a file with this prefix. Creates files in the format: &amp;#39;prefix-utc_start-utc_end.part&amp;#39;. Intended to be used
                                with the parallel-* flags so that you can combine the files to maintain ordering based on the filename. Default is to write to stdout.
      --overwrite-completed-parts
                                Overwrites completed part files. This will download the range again, and replace the original completed part file. Default will skip a range if it&amp;#39;s part
                                file is already downloaded.
      --merge-parts             Reads the part files in order and writes the output to stdout. Original part files will be deleted with this option.
      --keep-parts              Overrides the default behaviour of --merge-parts which will delete the part files once all the files have been read. This option will keep the part files.
      --forward                 Scan forwards through logs.
      --no-labels               Do not print any labels
      --exclude-label=EXCLUDE-LABEL ...
                                Exclude labels given the provided key during output.
      --include-label=INCLUDE-LABEL ...
                                Include labels given the provided key during output.
      --labels-length=0         Set a fixed padding to labels
      --store-config=&amp;#34;&amp;#34;         Execute the current query using a configured storage from a given Loki configuration file.
      --remote-schema           Execute the current query using a remote schema retrieved using the configured storage in the given Loki configuration file.
      --colored-output          Show output with colored labels
  -t, --tail                    Tail the logs
  -f, --follow                  Alias for --tail
      --delay-for=0             Delay in tailing by number of seconds to accumulate logs for re-ordering

Args:
  &amp;lt;query&amp;gt;  eg &amp;#39;{foo=&amp;#34;bar&amp;#34;,baz=~&amp;#34;.*blip&amp;#34;} |~ &amp;#34;.*error.*&amp;#34;&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;logcli-labels-command-reference&#34;&gt;LogCLI labels command reference&lt;/h3&gt;
&lt;p&gt;The output of &lt;code&gt;logcli help labels&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;usage: logcli labels [&amp;lt;flags&amp;gt;] [&amp;lt;label&amp;gt;]

Find values for a given label.

Flags:
      --help             Show context-sensitive help (also try --help-long and
                         --help-man).
      --version          Show application version.
  -q, --quiet            Suppress query metadata
      --stats            Show query statistics
  -o, --output=default   Specify output mode [default, raw, jsonl]. raw
                         suppresses log labels and timestamp.
  -z, --timezone=Local   Specify the timezone to use when formatting output
                         timestamps [Local, UTC]
      --cpuprofile=&amp;#34;&amp;#34;    Specify the location for writing a CPU profile.
      --memprofile=&amp;#34;&amp;#34;    Specify the location for writing a memory profile.
      --stdin            Take input logs from stdin
      --addr=&amp;#34;http://localhost:3100&amp;#34;
                         Server address. Can also be set using LOKI_ADDR env
                         var.
      --username=&amp;#34;&amp;#34;      Username for HTTP basic auth. Can also be set using
                         LOKI_USERNAME env var.
      --password=&amp;#34;&amp;#34;      Password for HTTP basic auth. Can also be set using
                         LOKI_PASSWORD env var.
      --ca-cert=&amp;#34;&amp;#34;       Path to the server Certificate Authority. Can also be
                         set using LOKI_CA_CERT_PATH env var.
      --tls-skip-verify  Server certificate TLS skip verify.
      --cert=&amp;#34;&amp;#34;          Path to the client certificate. Can also be set using
                         LOKI_CLIENT_CERT_PATH env var.
      --key=&amp;#34;&amp;#34;           Path to the client certificate key. Can also be set
                         using LOKI_CLIENT_KEY_PATH env var.
      --org-id=&amp;#34;&amp;#34;        adds X-Scope-OrgID to API requests for representing
                         tenant ID. Useful for requesting tenant data when
                         bypassing an auth gateway.
      --since=1h         Lookback window.
      --from=FROM        Start looking for labels at this absolute time
                         (inclusive)
      --to=TO            Stop looking for labels at this absolute time
                         (exclusive)

Args:
  [&amp;lt;label&amp;gt;]  The name of the label.&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;logcli-series-command-reference&#34;&gt;LogCLI series command reference&lt;/h3&gt;
&lt;p&gt;The output of &lt;code&gt;logcli help series&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;usage: logcli series [&amp;lt;flags&amp;gt;] &amp;lt;matcher&amp;gt;

Run series query.

The &amp;#34;series&amp;#34; command will take the provided label matcher and return all the log
streams found in the time window.

It is possible to send an empty label matcher &amp;#39;{}&amp;#39; to return all streams.

Use the --analyze-labels flag to get a summary of the labels found in all
streams. This is helpful to find high cardinality labels.

Flags:
      --help             Show context-sensitive help (also try --help-long and
                         --help-man).
      --version          Show application version.
  -q, --quiet            Suppress query metadata
      --stats            Show query statistics
  -o, --output=default   Specify output mode [default, raw, jsonl]. raw
                         suppresses log labels and timestamp.
  -z, --timezone=Local   Specify the timezone to use when formatting output
                         timestamps [Local, UTC]
      --cpuprofile=&amp;#34;&amp;#34;    Specify the location for writing a CPU profile.
      --memprofile=&amp;#34;&amp;#34;    Specify the location for writing a memory profile.
      --stdin            Take input logs from stdin
      --addr=&amp;#34;http://localhost:3100&amp;#34;
                         Server address. Can also be set using LOKI_ADDR env
                         var.
      --username=&amp;#34;&amp;#34;      Username for HTTP basic auth. Can also be set using
                         LOKI_USERNAME env var.
      --password=&amp;#34;&amp;#34;      Password for HTTP basic auth. Can also be set using
                         LOKI_PASSWORD env var.
      --ca-cert=&amp;#34;&amp;#34;       Path to the server Certificate Authority. Can also be
                         set using LOKI_CA_CERT_PATH env var.
      --tls-skip-verify  Server certificate TLS skip verify.
      --cert=&amp;#34;&amp;#34;          Path to the client certificate. Can also be set using
                         LOKI_CLIENT_CERT_PATH env var.
      --key=&amp;#34;&amp;#34;           Path to the client certificate key. Can also be set
                         using LOKI_CLIENT_KEY_PATH env var.
      --org-id=&amp;#34;&amp;#34;        adds X-Scope-OrgID to API requests for representing
                         tenant ID. Useful for requesting tenant data when
                         bypassing an auth gateway.
      --since=1h         Lookback window.
      --from=FROM        Start looking for logs at this absolute time
                         (inclusive)
      --to=TO            Stop looking for logs at this absolute time (exclusive)
      --analyze-labels   Printout a summary of labels including count of label
                         value combinations, useful for debugging high
                         cardinality series

Args:
  &amp;lt;matcher&amp;gt;  eg &amp;#39;{foo=&amp;#34;bar&amp;#34;,baz=~&amp;#34;.*blip&amp;#34;}&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;logcli---stdin-usage&#34;&gt;LogCLI &lt;code&gt;--stdin&lt;/code&gt; usage&lt;/h3&gt;
&lt;p&gt;You can consume log lines from your &lt;code&gt;stdin&lt;/code&gt; instead of Loki servers.&lt;/p&gt;
&lt;p&gt;Say you have log files in your local, and just want to do run some LogQL queries for that, &lt;code&gt;--stdin&lt;/code&gt; flag can help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE: Currently it doesn&amp;rsquo;t support any type of metric queries&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You may have to use &lt;code&gt;stdin&lt;/code&gt; flag for several reasons&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Quick way to check and validate a LogQL expressions.&lt;/li&gt;
&lt;li&gt;Learn basics of LogQL with just Log files and &lt;code&gt;LogCLI&lt;/code&gt;tool ( without needing set up Loki servers, Grafana etc.)&lt;/li&gt;
&lt;li&gt;Easy discussion on public forums. Like Q&amp;amp;A, Share the LogQL expressions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;NOTES on Usage&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;--limits&lt;/code&gt; flag doesn&amp;rsquo;t have any meaning when using &lt;code&gt;--stdin&lt;/code&gt; (use pager like &lt;code&gt;less&lt;/code&gt; for that)&lt;/li&gt;
&lt;li&gt;Be aware there are no &lt;strong&gt;labels&lt;/strong&gt; when using &lt;code&gt;--stdin&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;So stream selector in the query is optional e.g just &lt;code&gt;|=&amp;quot;timeout&amp;quot;|logfmt|level=&amp;quot;error&amp;quot;&lt;/code&gt; is same as &lt;code&gt;{foo=&amp;quot;bar&amp;quot;}|=&amp;quot;timeout|logfmt|level=&amp;quot;error&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Line filter - &lt;code&gt;cat mylog.log | logcli --stdin query &#39;|=&amp;quot;too many open connections&amp;quot;&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Label matcher - &lt;code&gt;echo &#39;msg=&amp;quot;timeout happened&amp;quot; level=&amp;quot;warning&amp;quot;&#39; | logcli --stdin query &#39;|logfmt|level=&amp;quot;warning&amp;quot;&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Different parsers (logfmt, json, pattern, regexp) - &lt;code&gt;cat mylog.log | logcli --stdin query &#39;|pattern &amp;lt;ip&amp;gt; - - &amp;lt;_&amp;gt; &amp;quot;&amp;lt;method&amp;gt; &amp;lt;uri&amp;gt; &amp;lt;_&amp;gt;&amp;quot; &amp;lt;status&amp;gt; &amp;lt;size&amp;gt; &amp;lt;_&amp;gt; &amp;quot;&amp;lt;agent&amp;gt;&amp;quot; &amp;lt;_&amp;gt;&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Line formatters - &lt;code&gt;cat mylog.log | logcli --stdin query &#39;|logfmt|line_format &amp;quot;{{.query}} {{.duration}}&amp;quot;&#39;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="logcli">LogCLI&lt;/h1>
&lt;p>LogCLI is the command-line interface to Grafana Loki.
It facilitates running &lt;a href="../">LogQL&lt;/a>
queries against a Loki instance.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;h3 id="binary-recommended">Binary (Recommended)&lt;/h3>
&lt;p>Download the &lt;code>logcli&lt;/code> binary from the
&lt;a href="https://github.com/grafana/loki/releases" target="_blank" rel="noopener noreferrer">Loki releases page&lt;/a>.&lt;/p></description></item></channel></rss>