1

我有一个包含如下日志的日志文件:

{"log_time": "2020-05-28 16:09:02", "log_level": "INFO", "event": "register", "login_key": "key1", "email": "user1.email.com", some other fields}   
{"log_time": "2020-05-28 16:09:03", "log_level": "INFO", "event": "register", "login_key": "key2", "email": "user2.email.com" some other fields}
{"log_time": "2020-05-28 16:09:05", "log_level": "INFO", "event": "button click", "login_key": "key1", some other fields}
{"log_time": "2020-05-28 16:09:06", "log_level": "INFO", "event": "page view", "login_key": "key2", some other fields}

每个用户都会获得一个登录密钥,该密钥记录了他/她的所有操作。第一个事件也是包含用户电子邮件的注册事件。

也许我在这里跳过了我的头,但我试图在 Grafana 中创建一个表,它将为每个登录密钥显示它的电子邮件和最后一个事件。所以对于这种情况,它将是:

login_key   email             event           time
key1        user1@email.com   button click  2020-05-28 16:09:05
key2        user2@email.com   page view     2020-05-28 16:09:06

我尝试使用 Loki 作为具有相关派生字段的数据源制作表格,但无法进行聚合,甚至无法让表格显示我想要的字段。

关于如何使用 loki 甚至其他数据源的任何想法?我想通过我的日志文件来尝试使用 elasticsearch 并没有那么大,并且为它设置所有 filebeat-logstash-elasticsearch 似乎有点开销。我什至在考虑编写一个 python 脚本来生成表并将其保存到我的 postgres 中,该 postgres 已经连接到 grafana 但感觉不对。

任何帮助将不胜感激

4

1 回答 1

4

好的,您应该记住的一个重要事实是Loki与其他日志聚合系统(例如ELKSplunk )有很大不同。虽然那些自己提取和索引并且他们各自的转发器只是发送线路,但Loki

不对日志源进行全文索引

大部分的标记是由日志转发器实现的(例如promtail但可以使用其他转发器)

要从日志中提取数据,您需要有一个到 promtail 的管道scrape_configs。这是一个例子:

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log
- job_name: nginx
  static_configs:
  - targets:
      - localhost
    labels:
      job: nginxlogs
      __path__: /var/log/nginx/*log

  pipeline_stages:
  - match:
      selector: '{job="nginxlogs"}'
      stages:
      - regex:
          expression: '.*level\s?=\s?(?P<level>[A-Z]*).*ip\s?=\s?(?P<ip>[0-9\.]*).*domain\s?=\s?(?P<domain>[a-z0-9\.]*).*http_status\s?=\s?(?P<http_status>[0-9]*).*user_agent\s?=\s?(?P<user_agent>.*)-'
      - labels:
          level:
          ip:
          domain:
          http_status:
          user_agent:

在这里,在收集时nginxlogspromtail将根据正则表达式查找一些字符串模式,以将这些模式发送给 Loki。在使用 Grafana > 6.6 探索 Loki 时,您会看到这些标签

关于您的具体情况

如何获得标签

看起来您的日志已经以json 格式构建。由此看来,Loki不会将这些视为字段。您需要在管道中明确指出:

  • 您的日志采用 JSON 结构
  • 您要发送给Loki的字段
scrape_configs:
...
  pipeline_stages:
    - match:
      selector: '{name="name_of_your_job"}'
      stages:
      # The JSON stage reads the log line as a JSON string and extracts
      # the "level" field from the object for use in further stages.
      - json:
          expressions:
            log_time: log_time
            event: event
            login_key: login_key
            etc: etc

使用 LogQL 时如何按标签聚合?

看看这个。一般语法是:

<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

但是,这是将日志转换为指标(例如,使用的键的速率)。

avg(rate(({job="name_of_your_job"})[10s])) by (login_key)

在您的情况下,您不是在寻找聚合。更多显示最后一行的方法

于 2020-06-05T17:38:36.557 回答