首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

log.io:浏览器端实时日志监管系统(3)自定义 harvester

log.io:浏览器端实时日志监管系统(3)自定义 harvester

自定义 harvesterlog.io 的默认的收割器是用 Node.js 实现的,非常简单,可以在安装目录里面找到源代码,我安装在 root 下:/root/node-v0.10.40-linux-x64//lib/node_modules/log.io/bin/log.io-harvester。
默认的收割器实现了监测单个文件的功能。但是在日常情况下,日志都是放在一个文件目录里面,如果想监测整个文件目录的变化,默认的收割器做不到使,但是已知收割器和服务端的接口是 TCP,我们可以通过自己撰写程序来实现。
此处提供代码下载。实现以下功能。
  • 当监测目录中有文件创建的时候,会自动建立 stream。
  • 当文件删除的时候,stream 也会删除。
  • 当文件改名的时候,对应的 stream 会变成新的文件名。
  • 当文件有新增信息的时候,会把增量的部分输出到屏幕上。
安装步骤1. 下载文件 myHarverster.js 到本地
2. 安装依赖
1
npm install chokidar --save




3. 修改监测的目录信息,这里用/root/test/logs。
1
2
3
4
5
6
logStreams: {
directories: [
//监测的目录
'/root/test/logs'
]
},




4. 修改服务器地址和端口
1
2
host: '0.0.0.0',//log.io 服务器地址
port: 28777//log.io 端口




5. 运行程序
1
2
node myHarverster.js
log.io-server




6. 在监测目录下建立 a.txt,b.txt,c.txt 三个文件,log.io 会自动同步流信息,展示结果如图 5 所示。
图 5. 显示流信息1. 在 a.txt 中添加信息 this is a message。展示结果如图 6 所示。
图 6. 浏览器上显示发送信息2. 重命名 a.txt 到 d.txt。log.io 同步变化,如图 7 所示。
图 7. 重命名3. 勾选 d.txt,在 d.txt 中添加信息 this is message from d.txt。展示结果如图 8 所示。
图 8. 发送信息到新的流代码说明1. 建立一个 socket,        在这里我们采用 Node.js 提供的 net 的接口,可以看到,Node.js 通过回调函数完成功能。这里体现了 Node.js 编程的好处,所有的异步操作不会阻塞进程,而是向下执行,通过回调函数在异步操作完成之后继续运行。
1
2
3
4
5
6
7
8
9
function socket_init(port, host){
var socket = new net.Socket();
socket.on('error', function(error) {
return setTimeout((function() {
return socket_init();
}), 2000);
});
return socket.connect(port, host);
}




2.Watch 函数用来监测文件夹中的变更情况,这里采用 chokidar 提供的 watcher。本身 Node.js 提供的文件监测服务只能完成基本的监测,chokidar 提供了更多的监测事件,例如 unlink 等等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function watch(path, socket) {
var currect = {};
var watcher = chokidar.watch(path, {
ignored: /[\/\\]\./,
persistent: true
});
watcher.on('unlink', function(path){
send(socket, "-stream|" + p.basename(path) + "|" + nodeName);
});
watcher.on('add', function(path){
send(socket, "+stream|" + p.basename(path) + "|" + nodeName);
});
watcher.on('change', function(path, stat){
if(currect[p.basename(path)] === undefined){
currect[p.basename(path)] = 0;
}
read(path, stat.size, currect[p.basename(path)], socket);
currect[p.basename(path)] = stat.size;
});
}




总结log.io 是一套实时浏览器日志监管系统,以 Node.js 和 socket.io 为主要开发技术,以收割器来监测日志输出,TCP 传输日志信息。当然,收割器是可自定义的,可以通过自己写收割器来扩展 log.io 的功能。实际上,虽然 log.io 作为一个日志管理系统,但是它却可以完成很多其他需要浏览器实时呈现的需求。例如,聊天室需求,log.io 作为呈现输出端,输入端是自己写的收割器。所以我们可以利用 log.io 为我们提供的特性,来进行二次开发。
返回列表