​Loki is multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost effective and easy to operate.
The Fluent Bit loki
built-in output plugin allows you to send your log or events to a Loki service. It support data enrichment with Kubernetes labels, custom label keys and Tenant ID within others.
Key | Description | Default |
host | Loki hostname or IP address | 127.0.0.1 |
port | Loki TCP port | 3100 |
http_user | Set HTTP basic authentication user name | ​ |
http_passwd | Set HTTP basic authentication password | ​ |
tenant_id | Tenant ID used by default to push logs to Loki. If omitted or empty it assumes Loki is running in single-tenant mode and no X-Scope-OrgID header is sent. | ​ |
labels | Stream labels for API request. It can be multiple comma separated of strings specifying | job=fluentbit |
label_keys | Optional list of record keys that will be placed as stream labels. This configuration property is for records key only. More details in the Labels section. | ​ |
line_format | Format to use when flattening the record to a log line. Valid values are | json |
auto_kubernetes_labels | If set to true, it will add all Kubernetes labels to the Stream labels | off |
Loki store the record logs inside Streams, a stream is defined by a set of labels, at least one label is required.
Fluent Bit implements a flexible mechanism to set labels by using fixed key/value pairs of text but also allowing to set as labels certain keys that exists as part of the records that are being processed. Consider the following JSON record (pretty printed for readability):
{"key": 1,"sub": {"stream": "stdout","id": "some id"},"kubernetes": {"labels": {"team": "Santiago Wanderers"}}}
If you decide that your Loki Stream will be composed by two labels called job
and the value of the record key called stream
, your labels
configuration properties might look as follows:
[OUTPUT]name lokimatch *labels job=fluentbit, $sub['stream']
As you can see the label job
has the value fluentbit
and the second label is configured to access the nested map called sub
targeting the value of the key stream
. Note that the second label name must starts with a $
, that means that's a Record Accessor pattern so it provide you the ability to retrieve values from nested maps by using the key names.
When processing above's configuration, internally the ending labels for the stream in question becomes:
job="fluentbit", stream="stdout"
Another feature of Labels management is the ability to provide custom key names, using the same record accessor pattern we can specify the key name manually and let the value to be populated automatically at runtime, e.g:
[OUTPUT]name lokimatch *labels job=fluentbit, mystream=$sub['stream']
When processing that new configuration, the internal labels will be:
job="fluentbit", mystream="stdout"
The additional configuration property called label_keys
allow to specify multiple record keys that needs to be placed as part of the outgoing Stream Labels, yes, this is a similar feature than the one explained above in the labels
property. Consider this as another way to set a record key in the Stream, but with the limitation that you cannot use a custom name for the key value.
The following configuration examples generate the same Stream Labels:
[OUTPUT]name lokimatch *labels job=fluentbitlabel_keys $sub['stream']
the above configuration accomplish the same than this one:
[OUTPUT]name lokimatch *labels job=fluentbit, $sub['stream']
both will generate the following Streams label:
job="fluentbit", stream="stdout"
Note that if you are running in a Kubernetes environment, you might want to enable the option auto_kubernetes_labels
which will auto-populate the streams with the Pod labels for you. Consider the following configuration:
[OUTPUT]name lokimatch *labels job=fluentbitauto_kubernetes_labels on
Based in the JSON example provided above, the internal stream labels will be:
job="fluentbit", team="Santiago Wanderers"
This plugin inherit core Fluent Bit features to customize the network behavior and optionally enable TLS in the communication channel. For more details about the specific options available refer to the following articles:
​Networking Setup: timeouts, keepalive and source address
​Security & TLS: all about TLS configuration and certificates
Note that all options mentioned in the articles above must be enabled in the plugin configuration in question.
The following configuration example, will emit a dummy example record and ingest it on Loki . Copy and paste the following content in a file called out_loki.conf
:
[SERVICE]flush 1log_level info​[INPUT]name dummydummy {"key": 1, "sub": {"stream": "stdout", "id": "some id"}, "kubernetes": {"labels": {"team": "Santiago Wanderers"}}}samples 1​[OUTPUT]name lokimatch *host 127.0.0.1port 3100labels job=fluentbitlabel_keys $sub['stream']auto_kubernetes_labels on
run Fluent Bit with the new configuration file:
$ fluent-bit -c out_loki.conf
Fluent Bit output:
Fluent Bit v1.7.0* Copyright (C) 2019-2020 The Fluent Bit Authors* Copyright (C) 2015-2018 Treasure Data* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd* https://fluentbit.io​[2020/10/14 20:57:45] [ info] [engine] started (pid=809736)[2020/10/14 20:57:45] [ info] [storage] version=1.0.6, initializing...[2020/10/14 20:57:45] [ info] [storage] in-memory[2020/10/14 20:57:45] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128[2020/10/14 20:57:45] [ info] [output:loki:loki.0] configured, hostname=127.0.0.1:3100[2020/10/14 20:57:45] [ info] [sp] stream processor started[2020/10/14 20:57:46] [debug] [http] request payload (272 bytes)[2020/10/14 20:57:46] [ info] [output:loki:loki.0] 127.0.0.1:3100, HTTP status=204