统一日志服务器的设计实现(2)

背景

前一篇提到,设计统一日志服务器的过程中,提供了一套日志服务系统,对外暴露tcp接口,供客户端来调用。客户端结合Log4PHP进行了一些改造后,实现了高性能的日志记录功能。但是这个日志服务还留下了一些悬念。


我们选择了Workerman来进行日志服务的搭建,那么日志究竟要怎样记录,记录的日志如何查询?

基于数据库进行记录

使用数据库是一个相对简单和常见的方案,我在一开始设计的时候,使用的是这个方案。虽然由于一些原因后来换了方案,但我依然觉得这个方案本身是非常适合个人开发者使用的。


针对Workerman中的onMessage进行重写,操作记录数据库。这样的话,只要对客户端和服务端做出同样的日志格式约定就可以。

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // 数据库记录
};
// 运行worker
Worker::runAll();

这个步骤的难度可以说是很小的。


那么,数据库查询怎么办呢?Navicat、DBeaver自然是我们的首选。如果涉及数据库部署到内网无法直连的问题,还可以参考我的历史文章《虚拟主机/内网进行数据库管理的几个还不错的方案》。但是,数据库客户端虽然好用,但作为日志的日常展示、查询又有点偏复杂了,如果是基于Web页面来做日志的查询展示,反而更显方便快捷。


PHPMyAdmin?可以,不过只解决了Web访问的问题。作为数据库管理,还算方便,但日志类型的展示、查询完全不需要这么多复杂的操作。

于是我在网上找各种日志展示的开源项目,发现了一个不错的工具:https://loganalyzer.adiscon.com/ 。


网站提供了demo供试用:

image.png

实际上,这个工具最原始的作用,并不是分析展示业务日志的,而是用来展示syslog(系统日志)的。

可是这个工具提供了基于数据库来进行日志展示、搜索、筛选、简单分析的功能,因此只要对数据字段进行稍加重定义,代码也做一些修改,很快就能适应我们业务日志的正常使用。


由于这个方案我目前已经不用了,因此暂时没法对改造后的系统截图了。代码还在,只是做了封存。如果说真的有人有需要,可以在我的博客留言。


基于阿里云的记录

前面的基于数据库的方案本身真的没什么太大问题,主要是我不想在vps上单独再去运维一个数据库,仅此而已。


在我发现阿里云提供了日志服务,并且有一定的免费额度后,就开始使用阿里云的日志服务了,这样,我就省去了数据库运维的成本。

当时,我的网站还是部署在阿里云上的,所以日志也放在上面了,后来服务迁到了百度云,百度云也有类似的服务,同样也提供了免费额度,但出于偷懒的考虑,日志我就没有迁移,还继续放在阿里云上。(目前每个月会超过一些日志额度,基本一个月最多一两块钱吧)


阿里云的文档还算完善,可以比较方便地根据引导创建相关的配置。通常情况下,如果我们有服务器,日志就可以通过agent自动收集的方式来做上传。但对我们这样一个日志服务器来说,反而不如基于它的开放接口,在Workerman中执行相关的代码更为迅速。


也就是说,在onMessage回调函数中,参考阿里云日志的写入示例,对日志进行重新加工(例如,区分不同的日志级别、解析json格式的附加信息等)


function putLogs(Aliyun_Log_Client $client, $project, $logstore) {
    $topic = 'TestTopic';
    
    $contents = array( // key-value pair
        'TestKey'=>'TestContent'
    );
    $logItem = new Aliyun_Log_Models_LogItem();
    $logItem->setTime(time());
    $logItem->setContents($contents);
    $logitems = array($logItem);
    $request = new Aliyun_Log_Models_PutLogsRequest($project, $logstore, 
            $topic, null, $logitems);
    
    try {
        $response = $client->putLogs($request);
        logVarDump($response);
    } catch (Aliyun_Log_Exception $ex) {
        logVarDump($ex);
    } catch (Exception $ex) {
        logVarDump($ex);
    }
}


很快,我们就可以在阿里云日志的管理界面中,看到日志进来了。

image.png

而在这里,我们就可以继续配置更多的索引规则等,方便日常日志的查询。界面上的各种操作还算方便,我觉得可能比kibana的上手成本要低不少,也很适合个人和小团队使用。


至此,一套完整的、统一的日志服务,从客户端到服务端,就完全实现了!

本文链接:https://www.poisonbian.com/post/5025.html 转载需授权!

分享到:
原文链接:,转发请注明来源!
「统一日志服务器的设计实现(2)」评论列表

发表评论