我有一个日志文件,其中包含如下所示的日志:
{"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中。
任何帮助将不胜感激
答案 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 会将其视为字段。您需要在管道中明确指出:
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
看看this。通用语法为:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
但是,这是将日志转换为指标(例如,使用密钥的比率)。
avg(rate(({job="name_of_your_job"})[10s])) by (login_key)
在您的情况下,您不是要寻找汇总。显示最后几行的更多方法