从unix日志文件中提取数据,构造JSON,并使用curl执行后请求



我的总体任务是不断地从UNIX系统日志文件中收集数据,对其进行过滤,根据过滤后的数据准备json负载,并通过向另一台服务器发送post-api调用来处理数据。

我想知道是否可以使用shell脚本来监控带有tail的日志文件,使用grep过滤以在另一个文件中转储特定的行。使用cronjob运行另一个脚本,该脚本构造一个.json并将带有json的curl请求发送到外部服务器。

一些细节:

在日志文件-连接器.log中,我对以下行感兴趣:

2020-09-16T15:14:37,337 INFO  (tomcat-http--131) [tenant-test;-;138.188.247.4;] com.vmware.horizon.adapters.passwordAdapter.PasswordIdpAdapter - Login: user123 - SUCCESS 

这些行,我可以通过以下命令收集:

tailf connector.log | grep 'PasswordIdpAdapter - Login|FAILURE|SUCCESS'

并可能将它们转储到一个文件中:

tailf connector.log | grep 'PasswordIdpAdapter - Login|FAILURE|SUCCESS' > log_data.txt

在这一点上,我想知道是否可以从连接器.log的一行(而不是整行(中只提取特定字段,因此log_data.txt中的一行看起来像(1,4,6,7,8(:

1 2020-09-29T07:15:13,881 [tenant1;usrname@tenant1;10.93.231.5;] - username - SUCCESS

从那时起,我需要编写一个脚本(也许可以由cronjob每分钟运行一次(/或一个命令来构建下面的json并发送请求。一行-一个请求。

这是json:的示例

{
"timestamp": "2020-09-16T15:24:35,377",
"tenant_name": "tenant-test",
"log_type": "SERVICE",
"log_entry": "Login: user123 - SUCCESS"
}

应替换的字段值已存在于日志行中:timestamp(第一个字段,例如2020-09-16T15:14:37337(、tenant_name(第四个字段的第一部分,租户测试(和log_entry(最后四个字段,如Login:user123-SUCCESS(。

在构造json时,我将通过以下方式发送:

curl --header "Content-Type: application/json" --request POST --data 
$payload http://myservert:8080/api/requests

我不清楚的是,这个脚本从log_data.txt中逐行获取数据,例如

并填充一些字段以创建.json并将其发送到服务器。

感谢您提前回答,Petko

感谢@shellter的awk创意。所以,bash、awk、grep、cat、cut和curl完成了任务。我创建了一个cronjob来每隔5分钟执行bash脚本。

脚本获取最后5分钟的日志数据,将其转储到另一个文件,读取过滤后的数据,准备有效负载,然后执行API调用。也许这很愚蠢,但它有效。

#!/bin/bash
MONITORED_LOG="/var/logs/test.log"
FILTERED_DATA="/tmp/login/login_data.txt"
REST_HOST="https://rest-host/topics/logs-"
# dump the last 5 mins of log data(date format: 2020-09-28T10:52:28,334)
# to a file, filter for keywords FAILURE|SUCCESS and NOT having 'lookup|SA' 
# an example of data record taken: 1 2020-09-29T07:15:13,881 [tenant1;usrname@tenant1;10.93.231.5;] - username - SUCCESS
awk -v d1="$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S")" -v d2="$(date "+%Y-%m-%dT%H:%M:%S")" '$0 > d1 && $0 < d2' $MONITORED_LOG | grep 'FAILURE|SUCCESS' | grep -v 'lookup|SA-' | awk '{ print $2, $3, $5, $7}' | uniq -c > $FILTERED_DATA
## loop through all the filtered records and send an API call
cat $FILTERED_DATA | while read LINE; do
## preparing the variables
timestamp=$(echo $LINE | cut -f2 -d' ')
username=$(echo $LINE | cut -f5 -d' ')
log_entry=$(echo $LINE | cut -f7 -d' ')
# get the tenant name, split by ; and remove the first char [ 
tenant_name=$(echo $tenant_name | cut -f1 -d';')
tenant_name="${tenant_name:1}"

# preparing the payload
payload=$'{"records":[{"value":{"timestamp":"'
payload+=$timestamp
payload+=$'","tenant_name":"'
payload+=$tenant_name
payload+=$'","log_entry":"'
payload+=$log_entry
payload+=$'"}}]}'
echo 'payload: ' $payload
# send the api call to the server with dynamic construction of tenant name
curl -i -k  -u 'api_user:3494ssdfs3' --request POST --header "Content-type:application/json" --data "$payload" "$REST_HOST$tenant_name"

完成

最新更新