【问题标题】:logs aggregation in grafanagrafana中的日志聚合
【发布时间】:2020-09-16 08:57:58
【问题描述】:

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

{"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。

任何帮助将不胜感激

【问题讨论】:

    标签: logging grafana grafana-loki


    【解决方案1】:

    好吧,您应该记住的一个重要事实是 Loki 与其他日志聚合系统(例如 ELKSplunk强>。虽然它们自己提取和索引,它们各自的转发器只是发送线路,Loki

    不对日志进行全文索引source

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

    要从您的日志中提取数据,您需要有一个 pipeline 到 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:
    

    在这里,在收集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)
    

    就您而言,您不是在寻找聚合。更多关于显示最后一行的方法

    【讨论】:

    • 感谢您的详细回复,但我正在寻找一种方法来对结果进行聚合,特别是按登录键分组,foreach 组显示最后的日志(按日志时间)和事件。
    猜你喜欢
    • 2020-10-27
    • 2011-06-07
    • 2016-08-23
    • 2023-03-24
    • 2019-10-29
    • 2020-01-26
    • 2022-06-18
    • 2021-09-09
    • 2020-10-24
    相关资源
    最近更新 更多