UNPKG

19 kBMarkdownView Raw
1# tracer for node.js
2
3[![NPM version](http://img.shields.io/npm/v/tracer.svg)](https://www.npmjs.org/package/tracer)
4[![Dependency Status](https://david-dm.org/baryon/tracer.svg)](https://david-dm.org/baryon/tracer)
5[![devDependency Status](https://david-dm.org/baryon/tracer/dev-status.svg)](https://david-dm.org/baryon/tracer#info=devDependencies)
6[![Build Status](https://secure.travis-ci.org/baryon/tracer.png)](http://travis-ci.org/baryon/tracer)
7
8A powerful and customizable logging library for node.js.
9
10===========
11
12## Features
13
14---
15
16- print log messages with timestamp, file name, method name, line number, path or call stack
17- be customized output format with micro-template and timestamp format
18- support user-defined logging levels
19- add easily any transport
20- support filter functions, so print statements in full color and font (color console)
21
22## Install
23
24---
25
26```javascript
27npm install tracer --save
28```
29
30## Usage
31
32Add to your code:
33
34Simple Console
35
36```javascript
37var logger = require('tracer').console()
38```
39
40Color Console
41
42```javascript
43var logger = require('tracer').colorConsole()
44```
45
46Set Output Level
47
48```javascript
49var logger = require('tracer').colorConsole({ level: 'warn' })
50```
51
52## Simple Example
53
54### Simple Console
55
56```javascript
57var logger = require('tracer').console();
58
59logger.log('hello');
60logger.trace('hello', 'world');
61logger.debug('hello %s', 'world', 123);
62logger.info('hello %s %d', 'world', 123, {foo:'bar'});
63logger.warn('hello %s %d %j', 'world', 123, {foo:'bar'});
64logger.error('hello %s %d %j', 'world', 123, {foo:'bar'}, [1, 2, 3, 4], Object);
65
66$ node example/console.js
672012-03-02T13:35:22.83Z <log> console.js:3 (Object.<anonymous>) hello
682012-03-02T13:35:22.85Z <trace> console.js:4 (Object.<anonymous>) hello world
692012-03-02T13:35:22.85Z <debug> console.js:5 (Object.<anonymous>) hello world 123
702012-03-02T13:35:22.85Z <info> console.js:6 (Object.<anonymous>) hello world 123 { foo: 'bar' }
712012-03-02T13:35:22.85Z <warn> console.js:7 (Object.<anonymous>) hello world 123 {"foo":"bar"}
722012-03-02T13:35:22.85Z <error> console.js:8 (Object.<anonymous>) hello world 123 {"foo":"bar"} [ 1, 2, 3, 4 ] function Object() { [native code] }
73```
74
75### Color Console
76
77```javascript
78var logger = require('tracer').colorConsole()
79
80logger.log('hello')
81logger.trace('hello', 'world')
82logger.debug('hello %s', 'world', 123)
83logger.info('hello %s %d', 'world', 123, { foo: 'bar' })
84logger.warn('hello %s %d %j', 'world', 123, { foo: 'bar' })
85logger.error(
86 'hello %s %d %j',
87 'world',
88 123,
89 { foo: 'bar' },
90 [1, 2, 3, 4],
91 Object
92)
93```
94
95### Daily Log
96
97```javascript
98var logger = require('tracer').dailyfile({
99 root: '.',
100 maxLogFiles: 10,
101 allLogsFileName: 'myAppName'
102})
103
104logger.log('hello')
105logger.trace('hello', 'world')
106logger.debug('hello %s', 'world', 123)
107logger.info('hello %s %d', 'world', 123, { foo: 'bar' })
108logger.warn('hello %s %d %j', 'world', 123, { foo: 'bar' })
109logger.error(
110 'hello %s %d %j',
111 'world',
112 123,
113 { foo: 'bar' },
114 [1, 2, 3, 4],
115 Object
116)
117```
118
119> dailylog will output all types log to diff files every day like log4j and if we provide allLogsFileName then all logs
120> will be move to that file too.
121
122## Advanced Example
123
124some helper package is need, so install -dev for running examples
125
126```javascript
127npm install -dev tracer
128```
129
130Take a look at the examples directory for different examples.
131
132### Set logging level
133
134the level option support index (number) or method name.
135
136```javascript
137var logger = require('tracer').console({ level: 'warn' })
138```
139
140equal
141
142```javascript
143var logger = require('tracer').console({ level: 4 })
144```
145
146```javascript
147var logger = require('tracer').console({ level: 'warn' })
148logger.log('hello')
149logger.trace('hello', 'world')
150logger.debug('hello %s', 'world', 123)
151logger.info('hello %s %d', 'world', 123, { foo: 'bar' })
152logger.warn('hello %s %d %j', 'world', 123, { foo: 'bar' })
153logger.error(
154 'hello %s %d %j',
155 'world',
156 123,
157 { foo: 'bar' },
158 [1, 2, 3, 4],
159 Object
160)
161
162//$ node example/level.js
163//2012-03-02T13:41:33.29Z <warn> level.js:6 (Object.<anonymous>) hello world 123 {"foo":"bar"}
164//2012-03-02T13:41:33.30Z <error> level.js:7 (Object.<anonymous>) hello world 123 {"foo":"bar"} [ 1, 2, 3, 4 ] function Object() { [native code] }
165
166//log,trace, debug and info level was not ouputed
167```
168
169### Customize output format
170
171format tag:
172
173- timestamp: current time
174- title: method name, default is 'log', 'trace', 'debug', 'info', 'warn', 'error','fatal'
175- level: method level, default is 'log':0, 'trace':1, 'debug':2, 'info':3, 'warn':4, 'error':5, 'fatal':6
176- message: printf message, support %s string, %d number, %j JSON and auto inspect
177- file: file name
178- line: line number
179- pos: position
180- path: file's path
181- folder: file's parent folder
182- method: method name of caller
183- stack: call stack message
184
185we use tinytim micro-template system to output log. see details [tinytim](https://github.com/baryon/node-tinytim).
186and, we use [Date Format](http://blog.stevenlevithan.com/archives/date-time-format) to format datetime.
187
188```javascript
189var logger = require('tracer').console({
190 format: '{{timestamp}} <{{title}}> {{message}} (in {{file}}:{{line}})',
191 dateformat: 'HH:MM:ss.L'
192})
193```
194
195Or, you can set special format for output method
196
197```javascript
198var logger = require('tracer').colorConsole({
199 format: [
200 '{{timestamp}} <{{title}}> {{message}} (in {{file}}:{{line}})', //default format
201 {
202 error:
203 '{{timestamp}} <{{title}}> {{message}} (in {{file}}:{{line}})\nCall Stack:\n{{stack}}' // error format
204 }
205 ],
206 dateformat: 'HH:MM:ss.L',
207 preprocess: function(data) {
208 data.title = data.title.toUpperCase()
209 }
210})
211```
212
213the preprocess method is a choice for changing tag.
214
215### Customize output methods
216
217```javascript
218var colors = require('colors')
219
220var logger = require('tracer').colorConsole({
221 level: 'log1',
222 methods: ['log0', 'log1', 'log2', 'log3', 'log4', 'log5'],
223 filters: [colors.underline, colors.yellow]
224})
225logger.log0('hello')
226logger.log1('hello', 'world')
227logger.log2('hello %s', 'world', 123)
228logger.log4('hello %s %d', 'world', 123)
229logger.log5('hello %s %d', 'world', 123)
230```
231
232### Customize filters
233
234each filtes function was called. the function is synchronous and must be like
235
236```javascript
237function f1(str) {
238 return str.toUpperCase()
239}
240```
241
242About [Colors.js](https://github.com/Marak/colors.js)
243
244```javascript
245var colors = require('colors')
246var logger = require('tracer').colorConsole({
247 filters: [
248 f1,
249 colors.underline,
250 colors.blue, //default filter
251 //the last item can be custom filter. here is "warn" and "error" filter
252 {
253 warn: colors.yellow,
254 error: [f1, colors.red, colors.bold]
255 }
256 ]
257})
258```
259
260the filter support key-function pair, example: [color_console.js](https://github.com/baryon/tracer/blob/master/lib/color_console.js)
261
262```javascript
263{
264 filters : {
265 //log : colors.black,
266 trace : colors.magenta,
267 debug : colors.blue,
268 info : colors.green,
269 warn : colors.yellow,
270 error : [ colors.red, colors.bold ]
271 }
272}
273```
274
275and the filters is an array, the last item can be custom filter. see example:[filter.js](https://github.com/baryon/tracer/blob/master/example/filter.js)
276
277### Log File Transport
278
279```javascript
280var fs = require('fs')
281
282var logger = require('tracer').console({
283 transport: function(data) {
284 console.log(data.output)
285 fs.appendFile('./file.log', data.rawoutput + '\n', err => {
286 if (err) throw err
287 })
288 }
289})
290
291logger.log('hello')
292logger.trace('hello', 'world')
293logger.debug('hello %s', 'world', 123)
294logger.info('hello %s %d', 'world', 123, { foo: 'bar' })
295logger.warn('hello %s %d %j', 'world', 123, { foo: 'bar' })
296logger.error(
297 'hello %s %d %j',
298 'world',
299 123,
300 { foo: 'bar' },
301 [1, 2, 3, 4],
302 Object
303)
304```
305
306### Stream Transport
307
308```javascript
309var fs = require('fs')
310
311var logger = require('tracer').console({
312 transport: function(data) {
313 console.log(data.output)
314 var stream = fs
315 .createWriteStream('./stream.log', {
316 flags: 'a',
317 encoding: 'utf8',
318 mode: 0666
319 })
320 .write(data.rawoutput + '\n')
321 }
322})
323
324logger.log('hello')
325logger.trace('hello', 'world')
326logger.debug('hello %s', 'world', 123)
327logger.info('hello %s %d', 'world', 123, { foo: 'bar' })
328logger.warn('hello %s %d %j', 'world', 123, { foo: 'bar' })
329logger.error(
330 'hello %s %d %j',
331 'world',
332 123,
333 { foo: 'bar' },
334 [1, 2, 3, 4],
335 Object
336)
337```
338
339### MongoDB Transport
340
341```javascript
342var mongo = require('mongoskin')
343var db = mongo.db('127.0.0.1:27017/test?auto_reconnect')
344
345var log_conf = {
346 transport: function(data) {
347 console.log(data.output)
348 var loginfo = db.collection('loginfo')
349 loginfo.insert(data, function(err, log) {
350 if (err) {
351 console.error(err)
352 }
353 })
354 }
355}
356
357var logger = require('tracer').console(log_conf)
358
359logger.log('hello')
360logger.trace('hello', 'world')
361logger.debug('hello %s', 'world', 123)
362logger.info('hello %s %d', 'world', 123, { foo: 'bar' })
363logger.warn('hello %s %d %j', 'world', 123, { foo: 'bar' })
364logger.error(
365 'hello %s %d %j',
366 'world',
367 123,
368 { foo: 'bar' },
369 [1, 2, 3, 4],
370 Object
371)
372
373console.log('\n\n\npress ctrl-c to exit')
374```
375
376### Defining Multiple Transport
377
378```JavaScript
379var fs = require('fs');
380var logger = require('tracer').console({
381 transport: [
382 function (data) {
383 fs.appendFile('./file.log', data.rawoutput + '\n', (err) => {
384 if (err) throw err;
385 });
386 },
387 function(data) {
388 console.log(data.output);
389 }
390 ]
391});
392logger.log('hello');
393logger.trace('hello', 'world');
394logger.debug('hello %s', 'world', 123);
395logger.info('hello %s %d', 'world', 123, {foo: 'bar'});
396logger.warn('hello %s %d %j', 'world', 123, {foo: 'bar'});
397logger.error('hello %s %d %j', 'world', 123, {foo: 'bar'}, [1, 2, 3, 4], Object);
398```
399
400### Define your logging helper
401
402the work is like [color_console.js](https://github.com/baryon/tracer/blob/master/lib/color_console.js)
403
404```javascript
405var colors = require('colors')
406module.exports = function(conf) {
407 return require('./console')(
408 {
409 filters: {
410 //log : colors.black,
411 trace: colors.magenta,
412 debug: colors.blue,
413 info: colors.green,
414 warn: colors.yellow,
415 error: [colors.red, colors.bold]
416 }
417 },
418 conf
419 )
420}
421```
422
423### Customize output Object's properties
424
425```javascript
426var obj = {
427 Request: [
428 {
429 IsValid: ['True'],
430 ItemSearchRequest: [
431 {
432 ResponseGroup: ['Small', 'OfferSummary'],
433 Sort: ['salesrank'],
434 SearchIndex: ['DVD']
435 }
436 ]
437 }
438 ]
439}
440
441var logger = require('tracer').console({
442 inspectOpt: {
443 showHidden: true, //the object's non-enumerable properties will be shown too
444 depth: null //tells inspect how many times to recurse while formatting the object. This is useful for inspecting large complicated objects. Defaults to 2. To make it recurse indefinitely pass null.
445 }
446})
447logger.log(obj)
448
449//
450// 2013-09-30T04:30:44.927Z <log> depth.js:26 (Object.<anonymous>) { Request:
451// [ { IsValid: [ 'True', [length]: 1 ],
452// ItemSearchRequest:
453// [ { ResponseGroup: [ 'Small', 'OfferSummary', [length]: 2 ],
454// Sort: [ 'salesrank', [length]: 1 ],
455// SearchIndex: [ 'DVD', [length]: 1 ] },
456// [length]: 1 ] },
457// [length]: 1 ] }
458```
459
460### Specify the stack index for file info
461
462Fix `file`, `path`, and `line` info width `stackIndex`.
463It is userful for development package.
464
465```javascript
466var logger = require('tracer').console({
467 stackIndex: 0 // default 0
468})
469var logger2 = require('tracer').console({
470 stackIndex: 1
471})
472var logMgr = function(type, msg) {
473 return logger[type](msg)
474}
475var logMgr2 = function(type, msg) {
476 return logger2[type](msg)
477}
478
479logger.log('hello') // the line info is right
480logger2.log('hello') // the line info is error
481logMgr('log', 'hello') // the line info is error
482logMgr2('log', 'hello') // the line info is right
483```
484
485### setLevel and close
486
487setLevel and close methods to dynamically change the log level.
488these are global settings, affect all output that are created via tracer
489
490```javascript
491var tracer = require('tracer')
492tracer.setLevel(2) //or tracer.setLevel('debug');
493//... ...
494tracer.close()
495```
496
497notice:
498if you set level in initialize, you can't change more lower level than the initial level.
499
500```javascript
501var tracer = require('tracer')
502var logger = tracer.console({ level: 'warn' })
503
504logger.log('hello') //nothing output
505
506tracer.setLevel(0) //dont work.
507logger.log('hello') //nothing output
508
509tracer.setLevel('error') //it works.
510logger.warn('hello') //nothing output
511
512logger.error('hello') //'hello'
513```
514
515Read examples please. [setLevel.js](https://github.com/baryon/tracer/blob/master/example/setLevel.js)
516
517### support console methods
518
519support count, assert and table methods.
520Read examples please. [consoleMethods.js](https://github.com/baryon/tracer/blob/master/example/consoleMethods.js)
521
522More features, please read examples.
523
524## History
525
526### 1.1.0
527- Updated map tracer.warn to console.warn. Thanks @eouia
528- Fixed webpack warning "Critical dependency: the request of a dependency is an expression". Thanks @tjr
529- Fixed Move nyc from dependencies to devDependencies. Thanks @madarche
530
531### 1.0.3
532- Updated some packages to the latest version. Fixed severity vulnerability
533
534### 1.0.2
535
536- Updated some packages to the latest version
537- Released
538
539### 0.9.9
540
541- Fixed. Port tests from expresso to mocha. Fixes #105 #106 by @ossdev07.
542- Fixed. Update type definitions to be able to use array in filters. #104 by @irisked.
543- Fixed potential security vulnerabilities in your dependencies in istanbul package.
544
545### 0.9.8
546
547- Added. {{folder}} template option for parent folder. #96 by @shbatm.
548- Added. rootDir param option for folder. #99 by @nswbmw. sample: folder.js and folder2.js
549
550### 0.9.5
551
552- Fixed. Update index.d.ts and dtslint for typescript. #92 and #94 by @Diluka.
553
554### 0.9.3
555
556- Fixed. Any custom keys for typescript. #90 by @Diluka.
557- Updated formatJson sample
558
559### 0.9.2
560
561- Fixed. Make type definitions correct & add comments. #89 by @plylrnsdy.
562- Updated npm packages
563
564### 0.9.1
565
566- Fixed. transport function parameter data type is LogOutput not string #87 by @myfjdthink.
567
568### 0.9.0
569
570- Added support all console methods, include count,assert and table. a new option 'supportConsoleMethods' is true default. example: consoleMethods.js in example folder.
571
572### 0.8.15
573
574- Adding type definitions #84 by @kobim
575- Added data.rawoutput #83 by @Royalgamer06
576- recommended linting #82 by @elomariAchraf
577
578### 0.8.12
579
580- added the ability to load the config from a file. #80 thanks @muthursyamburi
581- fix a bug for windows cant create dailyfile dir #77 by @moonrailgun
582- fixed. no fatal color in colorConsole missed. #79
583
584### 0.8.11
585
586- added fatal level, like log4j. #75 thanks @ds3783
587- fixed double-log file issue. #71 thanks @huangts
588- and something missed
589
590### 0.8.4-0.8.7
591
592- added some codes, details: #56 thanks @AmitThakkar
593
594### 0.8.3
595
596- fixed: Got extra data in the log file. #45 thanks @JohnSmithDr
597- merged: Add Strict mode and EsLint from @HakmiSofian
598- merged: Change the log to file example to using `fs.appendFile()` instead. from @twang2218
599- merged: Enable use of tracer in strict mode from @madarche
600- merged: Added getter for log level from @ColRad
601- tested on node.js 4/5
602
603### 0.8.2
604
605- added: Defining a field for max file days filea. #35 thanks @AmitThakkar
606
607### 0.8.1
608
609- added: Adding support for Multiple Transports. #36 thanks @AmitThakkar
610- fixed: dailyfile auto create folder #37. thanks @klesh
611
612### 0.8.0
613
614- added: setLevel method to dynamically change the log level. thanks @madarche, #30
615- added: close method to end all of the writable streams. thanks @loht, #31
616
617### 0.7.4
618
619- fixed: use the lastest package of colors v1.0.3.
620- fixed: removed filter's second parameter
621
622### 0.7.3
623
624- restored: use colors package replace cli-color, because some bugs and a lot of dependencies in cli-color. ref colorConsole2.js example.
625
626### 0.7.2
627
628- fixed: change log dateformat from UTC to LOCAL iso format (Suggest by @felixhao28)
629- fixed: change color package from colors to cli-color (Suggest by @jeffreydwalter)
630
631### 0.7.1
632
633- added: format add `%j` placeholder (Thanks @Bacra)
634- added: add stackIndex opt to specify the index of stack (Thanks @Bacra)
635
636### 0.7.0
637
638- fixed: change inspect format, using new format of node.js 0.10. (Thanks @Bacra)
639- fixed: now support node.js 0.10 and above, NO Support 0.8 and 0.6
640
641### 0.6.2
642
643- fixed: change stack from array to string, and fixed example2.js
644
645### 0.6.1
646
647- fixed: get the filename correctly on windows. thanks Tom Carchrae
648- added: added missing repository field. thanks @madarche
649
650### 0.6.0
651
652- feature: add showHidden and depth option for showing object's properties.
653
654### 0.5.1
655
656- feature: add args into data object, now we can check args in preprocess, see example format2.js, merge from yasuyk04/work
657
658### 0.5.0
659
660- performance: speed up when the format don't include method,path,line,pos,file, thanks sharonjl's issue report
661
662### 0.4.2
663
664- fixed: debug color from blue to cyan
665
666### 0.4.1
667
668- fixed: default timestamp is ISO UTC format.
669
670### 0.4.0
671
672- feature: support dailyfile method, added some examples
673- feature: add preprocess custom method for changing tags before format
674
675### 0.3.5
676
677- fixed bug: can't get method/line number in express
678
679### 0.3.4
680
681- use [tinytim package](https://github.com/baryon/node-tinytim)
682
683### 0.3.3
684
685- spell missing (transpot->transport)
686
687### 0.3.2
688
689- speed-up for \_log function
690- add some test codes
691
692### 0.3.1
693
694- minor-fix for call stack
695
696### 0.3.0
697
698- support custom format and filter for special method
699
700### 0.2.1
701
702- fix spell missing
703
704### 0.2.0
705
706- Add more examples.
707- Default methods is log, trace, debug, info, warn, error.
708- Support 'string' level, {level:'warn'} equal {level:4}
709
710### 0.1.0
711
712- Initial Tracer implementation.
713
714## License
715
716(The MIT License)
717
718Copyright (c) 2012 LI Long &lt;lilong@gmail.com&gt;
719
720Permission is hereby granted, free of charge, to any person obtaining
721a copy of this software and associated documentation files (the
722'Software'), to deal in the Software without restriction, including
723without limitation the rights to use, copy, modify, merge, publish,
724distribute, sublicense, and/or sell copies of the Software, and to
725permit persons to whom the Software is furnished to do so, subject to
726the following conditions:
727
728The above copyright notice and this permission notice shall be
729included in all copies or substantial portions of the Software.
730
731THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
732EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
733MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
734IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
735CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
736TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
737SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.