-
Notifications
You must be signed in to change notification settings - Fork 0
/
collector.js
126 lines (110 loc) · 3.2 KB
/
collector.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
var exec = require('child_process').exec;
var fs = require('fs');
var util = require('util');
var MongoClient = require('./mongoUtil');
var fs = require('fs');
var tmpFile = 'tmp';
var filesMap = {};
var mongoClient = new MongoClient('127.0.0.1', '27017', 'pomelo', 'rpc14');
var collect = function(dir, pattern) {
fs.readdir(dir, function(err, files) {
if(!!err) {
console.error('read directory error.');
return;
}
var results = [];
files.forEach(function(filename) {
if(startsWith(filename, pattern)) {
results.push(filename);
}
});
results.forEach(function(filename) {
var count = getReadLine(filename);
var total = getTotalLine(dir + filename);
var addition = total - count;
if(addition < 0) {
throw new Error(util.format('log file is error, current file is %s but read lines is %s', total, count));
}
filesMap[filename] = count;
var child = exec(util.format('tail -f -n %s %s', addition, dir + filename));
child.stdout.on('data', function (chunk) {
var msg = chunk.toString();
console.log(msg);
formatMessage(filename, count, msg);
});
});
});
};
var formatMessage = function(filename, count, str) {
var lines = str.split('\n');
for(var i =0; i<lines.length; i++) {
var start = lines[i].indexOf('{', 0);
if(start < 0)
continue;
lines[i] = lines[i].substring(start);
mongoClient.insert(JSON.parse(lines[i]));
var num = filesMap[filename];
filesMap[filename] = ++num;
}
setWriteLine(filename, filesMap[filename]);
};
var startsWith = function (str, prefix) {
if(typeof str !== 'string' || typeof prefix !== 'string' ||
prefix.length > str.length) {
return false;
}
return str.indexOf(prefix) === 0;
};
var setWriteLine = function(filename, line) {
if(!fs.existsSync(tmpFile)) {
fs.writeFileSync(tmpFile, filename + ':' + line + '\n');
}
else {
var str = fs.readFileSync(tmpFile).toString();
var flag = false;
//clear content
fs.writeFileSync(tmpFile, '');
var lines = str.split('\n');
for(var i =0; i< lines.length; i++) {
if(lines[i].indexOf(':') < 0)
continue;
var name = lines[i].split(':')[0];
if(filename == name) {
flag = true;
fs.appendFileSync(tmpFile, filename + ':' + line + '\n');
}
else {
fs.appendFileSync(tmpFile, lines[i] + '\n');
}
}
if(!flag) {
fs.appendFileSync(tmpFile, filename + ':' + line + '\n');
}
}
};
var getReadLine = function (filename) {
var str = fs.readFileSync(tmpFile).toString();
var lines = str.split('\n');
for(var i =0; i< lines.length; i++) {
if(lines[i].indexOf(':') < 0)
continue;
var name = lines[i].split(':')[0];
if(filename === name) {
return lines[i].split(':')[1];
}
}
return 0;
};
var getTotalLine = function(file) {
var str = fs.readFileSync(file).toString();
var lines = str.split('\n');
var count = lines.length -1;
if(count < 0)
return 0;
return count;
}
//console.log(getTotalLine('/home/py/Workspace/nodejs/development/chatofpomelo/game-server/logs/rpc-debug-connector-server-2.log'));
collect('/home/py/Workspace/nodejs/development/chatofpomelo/game-server/logs/', 'rpc-debug');
//collect('./', 'test');
//setWriteLine('aaa',5);
//console.log(getReadLine('aaa'));