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

我有一个服务器上的数据进入一个不断增长的日志文件。 我需要尾部的日志和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阅读post

要在PHP中执行一个外部命令,你需要使用back ticks而不是单引号 。 它们通常在键盘上的ESC键下找到。

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

应该

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

你也不应该使用tail -f因为直到你提供一个EOF (control + D)它才会返回。

我从来没有做过,但它应该(可能)工作:

为什么不使用域套接字(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 ….

你可以试试这个:

 #!/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来接受数据作为参数(而不是从输出日志中读取)。