Skip to content

Commit ed4a471

Browse files
committed
Merge branch dev
2 parents 33492df + f925b69 commit ed4a471

File tree

13 files changed

+188
-104
lines changed

13 files changed

+188
-104
lines changed

CHANGELOG

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
v1.0.5
2+
A output logs in developer tool's console
3+
F IndexedDB: unable to remove special targeted logs
4+
15
v1.0.4
26
U use rollup.js bundler to reduce dist package size(33% off)
37
A add makefile, use make for automatic procedures

README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,10 @@ Features
4141
-------
4242

4343
+ No extra dependencies
44-
+ Record logs
45-
+ Client-side
46-
+ websql, localstorage and indexeddb protocol
47-
+ namespace
48-
+ degree
44+
+ client-side(reach when acctually needed, save bandwith and traffic)
45+
+ multiple filter dimension(namespace, degree and keyword)
46+
+ multiple persistence storage solution(IndexDB, Websql, localStorage)
47+
+ cleanable(in case take too much user space)
4948

5049
Quick to get started
5150
-------------------

README.zh_CN.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,11 @@ logline是一个轻量,实用和客户端级的前端日志记录工具。
3232
特性
3333
---
3434

35-
+ 无外部依赖
36-
+ 日志记录
37-
+ 客户端级
38-
+ websql/localstorage/indexeddb三种日志协议
39-
+ 命名空间
40-
+ 日志等级
41-
+ 日志清理(防止日志过多,占用上传带宽和占满用户允许的内存)
35+
+ 零外部依赖
36+
+ 客户端存放(需要时再获取,节省移动带宽、流量和连接数)
37+
+ 多维度过滤(命名空间、日志等级和关键词)
38+
+ 多个存储方案(Websql、localStorage和IndexedDB)
39+
+ 可清理(防止日志过多,占用上传带宽和占满用户允许的内存)
4240

4341
快速上手
4442
------

TODO

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
WIP
2-
none
2+
[ ] IndexedDB: cursor.continue() meet `throw InvalidStateError when the cursor is being iterated`
33

44
CONSIDERING
5-
[ ] fullfill error handling LOW
6-
[ ] 修复phantomjs无法正确测试indexeddb的问题,phantomjs在关闭数据后才能读取到新存储的内容 LOW
7-
[ ] add a tag, to indicate pending operations LOW
8-
[ ] ability to get desired NICE TO HAVE
5+
[ ] fullfill error handling
6+
[ ] 修复phantomjs无法正确测试indexeddb的问题,phantomjs在关闭数据后才能读取到新存储的内容
7+
[ ] add a tag, to indicate pending operations
8+
[ ] selecte random background color per namespace for the outpus on developer tool's console panel

dist/logline.js

Lines changed: 100 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* logline v1.0.4 (https://github.com/latel/logline#readme)
2+
* logline v1.0.5 (https://github.com/latel/logline#readme)
33
* Copyright 2017, latel <latelx64@icloud.com>
44
* MIT license
55
*/
@@ -10,10 +10,21 @@
1010
(global.Logline = factory());
1111
}(this, (function () { 'use strict';
1212

13-
// throw out Errors, with global prefix 'Logline: ' ahead of err.message
14-
function throwError(errMessage) {
15-
throw new Error('Logline: ' + errMessage);
16-
}
13+
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
14+
return typeof obj;
15+
} : function (obj) {
16+
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
17+
};
18+
19+
20+
21+
22+
23+
24+
25+
26+
27+
1728

1829
var classCallCheck = function (instance, Constructor) {
1930
if (!(instance instanceof Constructor)) {
@@ -104,6 +115,52 @@ var possibleConstructorReturn = function (self, call) {
104115
return call && (typeof call === "object" || typeof call === "function") ? call : self;
105116
};
106117

118+
var HAS_CONSOLE = window.console;
119+
var LEVEL_CONSOLE_MAP = {
120+
INFO: 'log',
121+
WARN: 'warn',
122+
ERROR: 'error',
123+
CRITICAL: 'error'
124+
};
125+
var LEVEL_STYLE_MAP = {
126+
INFO: 'color:#FFF;background:gray',
127+
WARN: 'color:#FFF;background:orange',
128+
ERROR: 'color:#FFF;background:red',
129+
CRITICAL: 'color:#FFF;background:black'
130+
};
131+
132+
// throw out Errors, with global prefix 'Logline: ' ahead of err.message
133+
function throwError(errMessage) {
134+
throw new Error('Logline: ' + errMessage);
135+
}
136+
137+
// print debug info in develper's console
138+
// if WechatFE/vConsole is detected, will not use %c feature, as it is not well supported
139+
function debug(namespace, level, descriptor, data) {
140+
if (HAS_CONSOLE) {
141+
window.console[LEVEL_CONSOLE_MAP[level.toUpperCase()] || LEVEL_CONSOLE_MAP.INFO]('%c %s %s %c %s. ' + ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' ? '%O' : '%s'), LEVEL_STYLE_MAP[level.toUpperCase()] || LEVEL_STYLE_MAP.INFO, level, namespace, 'color:initial', descriptor, data || '');
142+
}
143+
}
144+
145+
// filter any function in a object
146+
function filterFunction(obj) {
147+
var newObj = {},
148+
i;
149+
150+
if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object') {
151+
return obj;
152+
}
153+
154+
for (i in obj) {
155+
if (obj.hasOwnProperty(i)) {
156+
if (typeof obj[i] !== 'function') {
157+
newObj[i] = filterFunction(obj[i]);
158+
}
159+
}
160+
}
161+
return newObj;
162+
}
163+
107164
/**
108165
* Logline Interface
109166
* @class Interface
@@ -118,7 +175,7 @@ var Interface = function () {
118175
function Interface(namespace) {
119176
classCallCheck(this, Interface);
120177

121-
this._namesapce = namespace;
178+
this._namespace = namespace;
122179
}
123180

124181
/**
@@ -392,25 +449,28 @@ var IndexedDBLogger = function (_LoggerInterface) {
392449

393450
if (IndexedDBLogger.status !== Interface.STATUS.INITED) {
394451
IndexedDBLogger._pool.push(function () {
395-
_this2._record(level, descriptor, data);
452+
return _this2._record(level, descriptor, data);
396453
});
397454
if (IndexedDBLogger.status !== Interface.STATUS.INITING) {
398455
IndexedDBLogger.init();
399456
}
400457
return;
401458
}
402459

460+
debug(this._namespace, level, descriptor, data);
403461
var transaction = IndexedDBLogger.db.transaction(['logs'], IDBTransaction.READ_WRITE || 'readwrite');
404462
transaction.onerror = function (event) {
405463
return throwError(event.target.error);
406464
};
407465

408466
var store = transaction.objectStore('logs');
467+
// should not contains any function in data
468+
// otherwise 'DOMException: Failed to execute 'add' on 'IDBObjectStore': An object could not be cloned.' will be thrown
409469
var request = store.add({
410470
time: Date.now(),
411-
namespace: this._namesapce,
471+
namespace: this._namespace,
412472
descriptor: descriptor,
413-
data: data
473+
data: filterFunction(data)
414474
});
415475

416476
request.onerror = function (event) {
@@ -481,10 +541,9 @@ var IndexedDBLogger = function (_LoggerInterface) {
481541
key: 'get',
482542
value: function get$$1(from, to, readyFn) {
483543
if (IndexedDBLogger.status !== get(IndexedDBLogger.__proto__ || Object.getPrototypeOf(IndexedDBLogger), 'STATUS', this).INITED) {
484-
IndexedDBLogger._pool.push(function () {
485-
IndexedDBLogger.get(from, to, readyFn);
544+
return IndexedDBLogger._pool.push(function () {
545+
return IndexedDBLogger.get(from, to, readyFn);
486546
});
487-
return;
488547
}
489548

490549
from = Interface.transTimeFormat(from);
@@ -529,10 +588,9 @@ var IndexedDBLogger = function (_LoggerInterface) {
529588
key: 'keep',
530589
value: function keep(daysToMaintain) {
531590
if (IndexedDBLogger.status !== get(IndexedDBLogger.__proto__ || Object.getPrototypeOf(IndexedDBLogger), 'STATUS', this).INITED) {
532-
IndexedDBLogger._pool.push(function () {
533-
IndexedDBLogger.keep(daysToMaintain);
591+
return IndexedDBLogger._pool.push(function () {
592+
return IndexedDBLogger.keep(daysToMaintain);
534593
});
535-
return;
536594
}
537595

538596
var store = IndexedDBLogger._getTransactionStore(IDBTransaction.READ_WRITE);
@@ -541,18 +599,20 @@ var IndexedDBLogger = function (_LoggerInterface) {
541599
return throwError(event.target.error);
542600
};
543601
} else {
544-
var range = IDBKeyRange.upperBound(Date.now() - (daysToMaintain || 2) * 24 * 3600 * 1000, true);
545-
var _request = store.openCursor(range);
546-
_request.onsuccess = function (event) {
547-
var cursor = event.target.result;
548-
if (cursor) {
549-
store.delete(cursor.primaryKey);
550-
cursor.continue();
551-
}
552-
};
553-
_request.onerror = function (event) {
554-
return throwError('unable to locate logs earlier than ' + daysToMaintain + 'd.');
555-
};
602+
(function () {
603+
var range = Date.now() - (daysToMaintain || 2) * 24 * 3600 * 1000;
604+
var request = store.openCursor();
605+
request.onsuccess = function (event) {
606+
var cursor = event.target.result;
607+
if (cursor && cursor.value.time < range) {
608+
store.delete(cursor.primaryKey);
609+
cursor.continue();
610+
}
611+
};
612+
request.onerror = function (event) {
613+
return throwError('unable to locate logs earlier than ' + daysToMaintain + 'd.');
614+
};
615+
})();
556616
}
557617
}
558618

@@ -566,10 +626,9 @@ var IndexedDBLogger = function (_LoggerInterface) {
566626
key: 'clean',
567627
value: function clean() {
568628
if (IndexedDBLogger.status !== get(IndexedDBLogger.__proto__ || Object.getPrototypeOf(IndexedDBLogger), 'STATUS', this).INITED) {
569-
IndexedDBLogger._pool.push(function () {
570-
IndexedDBLogger.clean();
629+
return IndexedDBLogger._pool.push(function () {
630+
return IndexedDBLogger.clean();
571631
});
572-
return;
573632
}
574633

575634
// database can be removed only after all connections are closed
@@ -604,7 +663,7 @@ var IndexedDBLogger = function (_LoggerInterface) {
604663
};
605664
return transaction.objectStore('logs');
606665
} else {
607-
throwError('log database is not created or connections is closed, considering init it.');
666+
throwError('log database is not created or connections are closed, considering init it.');
608667
}
609668
}
610669

@@ -661,8 +720,9 @@ var LocalStorageLogger = function (_LoggerInterface) {
661720
key: '_record',
662721
value: function _record(level, descriptor, data) {
663722
var logs = window.localStorage.getItem(LocalStorageLogger._database) ? JSON.parse(window.localStorage.getItem(LocalStorageLogger._database)) : [];
664-
logs.push([Date.now(), this._namesapce, level, descriptor, data]);
723+
logs.push([Date.now(), this._namespace, level, descriptor, data]);
665724
try {
725+
debug(this._namespace, level, descriptor, data);
666726
window.localStorage.setItem(LocalStorageLogger._database, JSON.stringify(logs));
667727
} catch (e) {
668728
throwError('error inserting record');
@@ -809,7 +869,7 @@ var WebsqlLogger = function (_LoggerInterface) {
809869

810870
if (WebsqlLogger.status !== Interface.STATUS.INITED) {
811871
WebsqlLogger._pool.push(function () {
812-
_this2._record(level, descriptor, data);
872+
return _this2._record(level, descriptor, data);
813873
});
814874
if (WebsqlLogger.status !== Interface.STATUS.INITING) {
815875
WebsqlLogger.init();
@@ -818,8 +878,9 @@ var WebsqlLogger = function (_LoggerInterface) {
818878
}
819879

820880
try {
881+
debug(this._namespace, level, descriptor, data);
821882
WebsqlLogger._db.transaction(function (tx) {
822-
tx.executeSql('INSERT INTO logs (time, namespace, level, descriptor, data) VALUES(?, ?, ?, ? ,?)', [Date.now(), _this2._namesapce, level, descriptor, data === undefined || data === '' ? '' : JSON.stringify(data) || ''], function () {/* empty func */}, function (tx, e) {
883+
tx.executeSql('INSERT INTO logs (time, namespace, level, descriptor, data) VALUES(?, ?, ?, ? ,?)', [Date.now(), _this2._namespace, level, descriptor, data === undefined || data === '' ? '' : JSON.stringify(data) || ''], function () {/* empty func */}, function (tx, e) {
823884
throw e.message;
824885
});
825886
});
@@ -881,10 +942,9 @@ var WebsqlLogger = function (_LoggerInterface) {
881942
key: 'get',
882943
value: function get$$1(from, to, readyFn) {
883944
if (WebsqlLogger.status !== get(WebsqlLogger.__proto__ || Object.getPrototypeOf(WebsqlLogger), 'STATUS', this).INITED) {
884-
WebsqlLogger._pool.push(function () {
885-
WebsqlLogger.get(from, to, readyFn);
945+
return WebsqlLogger._pool.push(function () {
946+
return WebsqlLogger.get(from, to, readyFn);
886947
});
887-
return;
888948
}
889949

890950
from = Interface.transTimeFormat(from);
@@ -933,10 +993,9 @@ var WebsqlLogger = function (_LoggerInterface) {
933993
key: 'keep',
934994
value: function keep(daysToMaintain) {
935995
if (WebsqlLogger.status !== get(WebsqlLogger.__proto__ || Object.getPrototypeOf(WebsqlLogger), 'STATUS', this).INITED) {
936-
WebsqlLogger._pool.push(function () {
937-
WebsqlLogger.keep(daysToMaintain);
996+
return WebsqlLogger._pool.push(function () {
997+
return WebsqlLogger.keep(daysToMaintain);
938998
});
939-
return;
940999
}
9411000

9421001
try {
@@ -967,7 +1026,7 @@ var WebsqlLogger = function (_LoggerInterface) {
9671026
value: function clean() {
9681027
if (WebsqlLogger.status !== get(WebsqlLogger.__proto__ || Object.getPrototypeOf(WebsqlLogger), 'STATUS', this).INITED) {
9691028
WebsqlLogger._pool.push(function () {
970-
WebsqlLogger.clean();
1029+
return WebsqlLogger.clean();
9711030
});
9721031
return;
9731032
}

0 commit comments

Comments
 (0)