在grafana中记录日志

时间:2020-05-28 21:36:39

标签: logging grafana loki

我有一个日志文件,其中包含如下所示的日志:

{"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脚本来生成表并将其保存到已经连接到grafana但感觉不对的postgres中。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

好的,您要记住的一个重要事实是 Loki 与其他日志聚合系统(例如 ELK Splunk )有很大不同强>。那些自己提取和建立索引以及它们各自的转发器只是发送行,而 Loki

不对日志source进行全文索引

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

要从日志中提取数据,您需要使用pipeline来推广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:

在这里,在收集nginxlogs时, promtail 会根据正则表达式查找一些字符串模式,以将其发送给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时如何按标签聚合?

看看this。通用语法为:

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

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

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

在您的情况下,您不是要寻找汇总。显示最后几行的更多方法