背景
前一篇提到,设计统一日志服务器的过程中,提供了一套日志服务系统,对外暴露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供试用:
实际上,这个工具最原始的作用,并不是分析展示业务日志的,而是用来展示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); } }
很快,我们就可以在阿里云日志的管理界面中,看到日志进来了。
而在这里,我们就可以继续配置更多的索引规则等,方便日常日志的查询。界面上的各种操作还算方便,我觉得可能比kibana的上手成本要低不少,也很适合个人和小团队使用。
至此,一套完整的、统一的日志服务,从客户端到服务端,就完全实现了!
本文链接:https://www.poisonbian.com/post/5025.html 转载需授权!