素材牛VIP会员
PHP日志管理系统,你会怎么做?
 非***扰  分类:PHP代码  人气:1098  回帖:6  发布于6年前 收藏

场景:
公司需要一套管理日志的系统,主语言是PHP,因此希望用PHP做。

疑问:
日志是一个较频繁的操作,来源会来自四方八面各个系统,如何节约网络传输中的资源和耗时也是一个问题。

询问:
想请问下大家一般都会怎么设计或是使用到什么技术去做这个系统,能达到较优方案?

谢谢。

 标签:php

讨论这个帖子(6)垃圾回帖将一律封号处理……

Lv3 码奴
wu***su 移动开发工程师 6年前#1

目前用mangodb数据库记录日志,读写速度都比较快,也比较省资源。查看日志也比较方便,一个文本文件读起来太累了。

Lv5 码农
16***50 软件测试工程师 6年前#2

谢邀

正好我自己开发了套日志管理系统
xloger
其中也有一个写好的php接口, 这东西能实时监控服务上trace的信息, 也能把分布式的各个服务器日志统一收集到一台机器上.
只有监控或发生错误时, 才会向日志服务器发送日志消息, 无人打开web监控的时候, 只有1-2ms的查询是否要发送日志的消耗.

php使用socket管道通信发送日志消息, 速度比http快上n倍

给你看下代码示例:

<?php
# test.php
require "/phplibs/xloger.php";

$user = array("name"=>"xloger", "age" => 20 );
// trace 监控信息
XLoger::log("参数1", uniqid(), $user );
// 以下代码将产生notice和warning
$a = $user['notice'];
foreach ($a as $v) { }

// 发起两个接口访问
for($i=2; $i--;){
    $result = file_get_contents("http://localhost:8084/child.php?i=$i&xloger_thread=".XLoger::thread() );
}
<?php
# child.php
require "/phplibs/xloger.php";

# i==0时, 产生一个错误
if(isset($_REQUEST['i']) && $_REQUEST['i']==0){
    throw new Exception("Error Processing Request", 1);
}

XLoger::log("我被追踪了",  $_REQUEST['xloger_thread'] );

# 月日分割的日志文件
$fileloger = XLoger::fileLoger("child_{month}{day}.log");
$fileloger->log("display xloger_thread", $_REQUEST['xloger_thread']);

访问test.php, 打开web监控, 会看到如下实时信息:

][2]

test.php 消耗了22ms, 由内部两个子http请求和一些运算累加组成, 这里显示了在代码里log的信息, 错误的信息, 文件日志, 以及这些代码发生的文件及代码行.

如果你用 echo, var_dump 等调试, 会影响页面内容输出, 线上更不允许这么调试. 通过这样的log, 就可以在一个第三方的页面上查看调试信息, 这也便是当初我要做这个东西的原因.

这东西一起在公司内部用, 所以没太用心去完善它, 文档也没写好. 如果你需要, 可以加我微信(idollo), 几个命令就可以配置好(请装好nodejs环境以及php安装并启用sockets模块).

再看下输出日志保存到指定服务器的:


require "/phplibs/xloger.php";
echo "<pre>";
echo "写入10000条日志\n";
$loger = XLoger::fileLoger("test_{month}{day}.log");
$start = microtime(true);
for($i=0; $i<10000; $i++){
    $loger->log($i, uniqid());
}
$end = microtime(true);
echo("Network fileloger time: ".($end-$start)."\n" );

$start = microtime(true);
for($i=0; $i<10000; $i++){
    # 如果open和close放循环外, 性能将大幅提升
    $f = fopen("test.log", "a+"); 
    fwrite($f, "{$i} ".uniqid()."\n");
    fclose($f);
}
$end = microtime(true);
print_r("Local file write time: ".($end-$start)."\n" );
echo "</pre>";

以及日志文件也记录了简略的日志代码行和请求信息:

Lv1 新人
记***香 站长 6年前#3

搭建elk日志管理系统,分布式,实时:搭建方法链接描述

Lv6 码匠
de***22 移动开发工程师 6年前#4

建议采用ELK来做,通用性高。

Lv3 码奴
阿***盗 页面重构设计 6年前#5

我是自己写的,记录请求和返回,可以带上用户请求时的信息一键再次请求,方便测试BUG
至于展现形式和BUG提示、json格式化就是js的处理了,我的这个一有BUG就会自动给我们的开发人员推送消息
不过这个只能是解决调试问题,如果很大很复杂的的话不知道,应该用楼上说的ELK吧,推荐的人多

Lv5 码农
迷***文 JS工程师 6年前#6

我就是来看看,楼上在开发时候听什么歌

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取