需要从日志中读取数据... tail,grep和inotifywait

时间:2010-09-24 03:32:54

标签: php linux bash post curl

我在一台服务器上有数据进入不断增长的日志文件。我需要尾随该日志并grep一些信息,然后将其发送到另一台服务器以便php插入数据库。无法允许具有日志的计算机访问数据库。我到目前为止尝试了这个但是我在bash命令上的语法是错误的,我无法弄清楚这是否是这样做的方式或者是否有更好的方法? Netcat是另一种想法......

monitor.sh

#!/bin/sh

tail -f /usr/local/log/thelog.log | grep -B1 "ABC=" > /usr/local/log/output.log;  

while inotifywait -e modify /usr/local/log/output.log; do
sleep 10;  
php /usr/bin/send.php;  
done

send.php

<?php
//extract data from the post
//extract($_POST);
//set POST variables

$data = 'tail -n 3 /usr/local/log/output.log';
$url = 'http://www.blahblah.com/logtodb.php';

$data = str_replace("A", "", $data);
$data = str_replace("B=", "", $data);
$data = str_replace("C=", "", $data);
$data = str_replace("D=", "", $data);

$fields = array(
'data'=>urlencode($data)d,
);

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

   //execute post
   $result = curl_exec($ch);

   //close connection
   curl_close($ch);
   A>

logtodb.php阅读帖子

3 个答案:

答案 0 :(得分:3)

要在PHP中执行外部命令,您需要使用返回刻度而非单引号。它们通常位于键盘上的ESC键下方。

$data = 'tail -n 3 /usr/local/log/output.log';

应该是

$data = `tail -n 3 /usr/local/log/output.log`;

此外,您不应该使用tail -f,因为在您提供EOF(控制+ D)之前它不会返回。

答案 1 :(得分:1)

我从来没有这样做过,但它应该(可能)有效:

为什么不使用域套接字(FIFO)?

$ mkfifo /path/to/my/fifo
$ tail -f /path/to/log > /path/to/my/fifo &
$ php send.php < /path/to/my/fifo

send.php应该能够从现在开始循环$ line = fread(...)直到enternity ....

答案 2 :(得分:1)

你可以试试这个:

#!/bin/sh
tail -f /usr/local/log/thelog.log | grep -B1 "ABC=" | while read line
do
    php /usr/bin/send.php $line
done

注意:您必须更改send.php以接受数据作为参数(而不是从输出日志中读取它)。