php-logstashphp实现的轻量级日志文件监控转储脚本
说明通过这个轻巧的脚本可以很容易的将日志送到elasticsearch中,并且本地测试处理能力基本保持在接近1w/s的速度。脚本主要实现两个功能,输入和输出。输入phpagent.php--listen=case.log用来监听访问日志的变更或者使用命令tail-Fcase.log|phpagent.php--listen来监听来自stdin的输入。该功能会持续将监听到的变更记入Redis队列中同时格式化将要记录的Log。输出phpagent.php--indexer用来建立索引,该脚本每秒约索引8千左右,也可开多个并行处理。该功能会持续将Redis队列中的数据导入ElasticSearch数据库中。调试phplogstash.php--build=1在本地生成的case.log中追加一条log。依赖PHP5.4.0+
redis扩展
curl扩展
使用方法说明输入方式phpagent.php--listen=从头读取文件并持续监听tail-Fcase.log|phpagent.php--listen监听Stdin传入的数据索引方式phpagent.php--indexer可将以上命令放置在shell中执行#/bin/bashnohup tail -F access.log | php agent.php --listen &nohup php agent.php --listen=case.log & nohup php agent.php --indexer &调试方式程序提供了一个指令用来模拟日志写入php logstash.php --build=<log_number> #生成的log条目数,默认20万条文件保存为case.log并且在同级目录下,可用命令tail -F case.log | php agent.php --listen 或php agent.php --listen=case.log测日志监听状态,并从redis中查看结果,或重新定义parser方法在内部中断调试日志解析过程全部指令agent.php --listen=<file_path> #将脚本设置为输入模式,用来监听日志文件输入agent.php --listen #不指定文件将监听来自 stdin 的输入agent.php --indexer #将脚本设置为索引模式,用来将队列的数据发送到 ElasticSearch 服务器agent.php --status #查看队列情况和处理速度配置文件全部配置文件如下,默认均有默认值[ 'redis' => 'tcp://127.0.0.1:6379', # redis地址,支持认证不支持数组。认证tcp://auth:密码@127.0.0.1:6379 'type' => 'log' # redis 队列key,及es的index type 'agent_log' => __DIR__ .'/agent.log', # 日志保存地址 'input_sync_memory' => 5*1024*1024 # 输入信息到达指定内存后同步 'input_sync_second' => 5 # 输入信息等待超过指定秒数后同步,以上2个条件共同触发 'parser' => [$this,'parser'] # 自定义输入端日志的处理格式,默认与程序提供的logformat json一致 'elastic' => 'https://127.0.0.1:9200' # elastic search通信地址,支持数组,可配置多个随机访问 # 支持密码 程序采用 http auth_basic 认证方式 # 使用密码 https://user:pssword@127.0.0.1:9200 'prefix' => 'phplogstash', # es 默认索引前缀名字为 phplogstash-2015.12.12 'shards' => '5', # es 分片数量 'replicas' => '2', # es 副本数量];日志格式程序默认使用如下Nginx的log_format,设置步骤如下1、将如下log_format规则放置在nginx的http配置内log_format json '{"timestamp":"$time_iso8601",' '"host":"$server_addr",' '"server":"$server_name",' '"client":"$http_x_forwarded_for",' '"size":$body_bytes_sent,' '"responsetime":$upstream_response_time,' '"domain":"$host",' '"method":"$request_method",' '"url":"$uri",' '"requesturi":"$request_uri",' '"via":"$server_protocol",' '"request":"$request",' '"uagent":"$http_user_agent",' '"referer":"$http_referer",' '"status":"$status"}';如果是内网机器需要使用该变量获取真实IP $http_x_forwarded_for2、将如下置放在 server 的配置内。access_log web_accesslog.json json生成的日志格式入如下,默认build的也是这种格式{ "timestamp": "2015-12-18T14:24:26+08:00", "host": "10.10.23.139", "message": "0", "server": "localhost", "client": "127.0.0.1", "size": 197, "responsetime": 0.010, "domain": "www.localhost.com", "method": "GET", "url": "/index.php", "requesturi": "/controller/action?arg1=1&arg2=2", "via": "HTTP/1.1", "request": "GET /controller/action?arg1=1&arg2=2 HTTP/1.1", "uagent": "Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html)", "referer": "-", "status": "200"}默认的parser会把request的请求分解成resquesturi与args,然后提交给elasticsearch方便汇总查看,如果不需要这么详细的拆分请直接使用request字段即可。Array( [timestamp] => 2015-12-18T14:24:26+08:00 [host] => 10.10.23.139 [message] => 0 [server] => localhost [client] => 127.0.0.1 [size] => 197 [responsetime] => 0.01 [domain] => www.localhost.com [method] => GET [url] => /index.php [requesturi] => /controller/action?arg1=1&arg2=2 [via] => HTTP/1.1 [uagent] => Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html) [referer] => - [status] => 200 [resquesturi] => /controller/action [args] => Array ( [arg1] => 1 [arg2] => 2.7.1 ))
评论