【问题标题】:need to read data from a log... tail, grep and inotifywait需要从日志中读取数据... tail、grep 和 inotifywait
【发布时间】:2011-04-16 14:09:57
【问题描述】:

我在一台服务器上的数据进入一个不断增长的日志文件。我需要跟踪该日志并 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 读取帖子

【问题讨论】:

  • 有一些您可能感兴趣的实用工具:logster 和 logtail。

标签: php linux bash post curl


【解决方案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 以接受数据作为参数(而不是从输出日志中读取)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      应该是

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-07
        • 2016-07-05
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        相关资源
        最近更新 更多