Browse Source

Added logger levels to configuration

luisf 10 năm trước cách đây
mục cha
commit
8d6065b21c
14 tập tin đã thay đổi với 257 bổ sung và 111 xóa
  1. 64 0
      CHANGELOG.md
  2. 59 32
      README.md
  3. 0 19
      doc/CHANGELOG.md
  4. 8 2
      doc/TODO.md
  5. 2 1
      lib/adapter.js
  6. 4 16
      lib/defaults.js
  7. 16 7
      lib/logger.js
  8. 40 16
      lib/system.js
  9. 4 1
      lib/writer.js
  10. 13 2
      lib/writers/console.js
  11. 1 1
      lib/writers/file.js
  12. 1 1
      package.json
  13. 21 10
      test/test-conf/conf.json
  14. 24 3
      test/test-conf/index.js

+ 64 - 0
CHANGELOG.md

@@ -0,0 +1,64 @@
+##### v0.0.8:
+Implemented filter per logger
+```json
+{
+  "loggers":{
+    "fs.*":["ERROR","WARN", "INFO"],
+    ".*":[]
+  }
+	...
+}
+```
+
+This will show all error,warning,info logs from all loggers with the name starting with "fs" 
+the other loggers will be disabled 
+
+"loggers" can be places both in root or in adapter in this case the adapter will take priority
+so main will only log ERROR
+
+```json
+{
+  "writers":{
+    "myconsole": {
+      "writer":"console"
+    }
+  },
+	"loggers": {
+		"main":["ERROR","VERBOSE","INFO","WARN"]
+	},
+	"adapters" : [
+		{
+			"levels": ["INFO","VERBOSE","WARN","ERROR"],
+			"writers": ["myconsole"],
+			"loggers": {
+				"Hello": ["INFO"],
+				"main": ["ERROR"]
+			}
+		}
+	]
+}
+```
+
+
+##### v0.0.7:
+Changed format to writer instead of adapter, better to handle different kind of formats for each writer (i.e., file, console)  
+Fixed Config adapter "levels" entry, it was checking with last level only
+##### v0.0.6:
+Changed logger to support objects as console.log
+```javascript
+var obj = {
+	test: {
+		msg: 'testing depth'
+	},
+	arr:[1,2,3]
+}
+
+log.info("Testing: ", obj);
+```
+Changed package.json test to run test-conf
+##### v0.0.5:
+Changed console.log from ConsoleWriter to process.stdout.write, so we can warp console.log into a logger
+```javascript
+console.log = require('hlogger').createLogger('name');
+```
+

+ 59 - 32
README.md

@@ -49,41 +49,68 @@ Formats for adapters:
 
 
 ### Config format:
-Create a set of writers, and setup adapters using those writers
 
+Simple:  
 ```json
 {
-	"writers" : {
-		"filetolog":{
-			"writer":"file",
-			"opts":{
-				"path":"log3.txt"
-			}
-		},
-		"errorfile": {
-			"writer":"file",
-			"opts": {
-				"path":"error3.txt"
-			}
-		},
-		"console1": {
-			"writer":"console",
-			"opts":{}
-		}
-	},
-
-	"adapters" : [
-		{
-			"levels": ["ERROR","WARN","INFO"],
-			"fmt": "[%c:%n -%l-  %m %| %E/%c]",
-			"writers": ["filetolog"]
-		},
-		{ 
-			"levels":["ERROR"],
-			"fmt": "ERR - %m",
-			"writers": ["errorfile","console1"]
-		}
-	]
+  "writers":{
+    "myconsole": {
+      "writer":"console"
+    }
+  },
+  "loggers": {
+    "main":["ERROR","VERBOSE","INFO","WARN"]
+  },
+  "adapters" : [
+    {
+	  "levels": ["INFO","VERBOSE","WARN","ERROR"],
+      "writers": ["myconsole"],
+      "loggers": {
+        "Hello": ["INFO"],
+        "main": ["ERROR"]
+       }
+    }
+  ]
 }
 ```
 
+Create a set of writers, and setup adapters using those writers
+```json
+{
+  "writers" : {
+    "filetolog":{
+      "writer":"file",
+      "opts":{
+        "path":"access.log"
+      }
+    },
+    "errorfile": {
+      "writer":"file",
+        "opts": {
+          "path":"error.log"
+        }
+      },
+    "console1": {
+      "writer":"console",
+      "opts":{
+        "format":{
+          "ERROR":"-------------- ERR %m -----------------"
+        }
+      }
+    },
+    "console": {
+      "writer":"console"
+    }
+  },
+  "adapters" : [
+    {
+      "levels": ["INFO","VERBOSE"],
+      "writers": ["filetolog","console"]
+    },
+    { 
+      "levels":["ERROR","WARN"],
+      "writers": ["errorfile","console1"]
+    }
+  ]
+}
+```

+ 0 - 19
doc/CHANGELOG.md

@@ -1,19 +0,0 @@
-### 07-May-2016
-Changed console.log from ConsoleWriter to process.stdout.write, so we can warp console.log into a logger
-```javascript
-console.log = require('hlogger').createLogger('name');
-```
-### 26-Jun-2016
-Changed logger to support objects as console.log
-```
-var obj = {
-	test: {
-		msg: 'testing depth'
-	},
-	arr:[1,2,3]
-}
-
-log.info("Testing: ", obj);
-```
-
-Changed package.json test to run test-conf

+ 8 - 2
doc/TODO.md

@@ -1,5 +1,11 @@
 ### TODO
 
+#### Setup adapters to be named
+To be possible to rewrite configuration instead of adding everytime on
+```
+Logger.setup(require('hlogger.conf'));
+```
+
 Rearrange the format better, keep it together
 
 create  logger chains as in:
@@ -18,7 +24,7 @@ Logger.createLogger("c1.log.app");
 
 
 ### Feature 2	
-	Create named adapters so we could load in json config using a file watcher maybe
+Create named adapters so we could load in json config using a file watcher maybe
 
 {
 	"writer" : {
@@ -37,7 +43,7 @@ Logger.createLogger("c1.log.app");
 	]
 }
 
-### Simplify config aswell only wrapper needed
+### Simplify config as well only wrapper needed
 
 {
 	"adapterFile" {

+ 2 - 1
lib/adapter.js

@@ -5,7 +5,8 @@ module.exports = class LogAdapter {
 	constructor(filterFunc,writers,fmt) {
 		this.writers = writers;
 		this.filterFunc = filterFunc;
-		this.logFmt = fmt;
+		this.fmt = fmt;
+		this.loggerLevels = {};
 	}
 
 

+ 4 - 16
lib/defaults.js

@@ -6,29 +6,17 @@ var ConsoleWriter = require('./writers/console.js');
 var FileWriter = require('./writers/file.js');
 
 // Some defaults
-Logger.root = new LoggerSystem();
-
-Logger.defaults = {
-	fmt:{
-		error: "\033[0;37m[\033[01;30m%c\033[0m:\033[1;34m%n\033[0;37m" +"\033[0;31m -%l- " + "\033[1;31m%m\033[0m%|\033[01;30m%E/%c\33[0m]" ,
-		warn:  "\033[0;37m[\033[01;30m%c\033[0m:\033[1;34m%n\033[0;37m" +"\033[0;33m -%l- " + "\033[0;37m%m\033[0m%|\033[01;30m%E/%c\33[0m]" ,
-		info:  "\033[0;37m[\033[01;30m%c\033[0m:\033[1;34m%n\033[0;37m" +"\033[0;32m -%l- " + "\033[0;37m%m\033[0m%|\033[01;30m%E/%c\33[0m]",
-		verbose:  "\033[0;37m[\033[01;30m%c\033[0m:\033[1;34m%n\033[0;37m" +"\033[1;30m -%l- " + "\033[1;30m%m\033[0m%|\033[01;30m%E/%c\33[0m]" ,
-	}
-}
-
-
 Logger.root.writer('console', ConsoleWriter);
 Logger.root.writer('file',FileWriter);
 
 
-var consoleWri = new Logger.root.writers['console'];
+var consoleWri = new Logger.root.writers['console']();
 
+Logger.root.adapter(new LogAdapter(() => {return true},[consoleWri]));
 
-Logger.root.adapter(new LogAdapter(Logger.eq(Logger.INFO),[consoleWri],Logger.defaults.fmt.info));
-Logger.root.adapter(new LogAdapter(Logger.eq(Logger.ERROR),[consoleWri],Logger.defaults.fmt.error));
+/*Logger.root.adapter(new LogAdapter(Logger.eq(Logger.ERROR),[consoleWri],Logger.defaults.fmt.error));
 Logger.root.adapter(new LogAdapter(Logger.eq(Logger.WARN),[consoleWri],Logger.defaults.fmt.warn));
-Logger.root.adapter(new LogAdapter(Logger.eq(Logger.VERBOSE),[consoleWri],Logger.defaults.fmt.verbose));
+Logger.root.adapter(new LogAdapter(Logger.eq(Logger.VERBOSE),[consoleWri],Logger.defaults.fmt.verbose));*/
 
 
 

+ 16 - 7
lib/logger.js

@@ -33,6 +33,8 @@ var Logger = class Logger {
 }
 
 
+Logger.root = new LoggerSystem();
+// statics
 	
 Logger.createLogger = function (name) {
 	var logger = new Logger(name);
@@ -41,9 +43,9 @@ Logger.createLogger = function (name) {
 }
 
 // By order of importance
-Logger.logTags = ["ERROR","WARN","INFO","VERBOSE"];
-for( var i in Logger.logTags) {
-	Logger[Logger.logTags[i]] = i;
+//Logger.logTags = ["ERROR","WARN","INFO","VERBOSE"];
+for( var i in LoggerSystem.TAGS) {
+	Logger[LoggerSystem.TAGS[i]] = i;
 }
 
 // Filter functions
@@ -64,19 +66,24 @@ Logger.eq = function(TAG) {
 		return itag == TAG;
 	}
 };
-Logger.in = function(...args) {
-	var TAGS = args;
+Logger.in = function(args) {
 	return function(itag) {
+		var TAGS = args;
 		return TAGS.indexOf(itag) >= 0;	
 	}
 }
 
 
+Logger.reset = function reset() {
+	Logger.root.adapters = [];
+}
+
 Logger.setup = function (conf) {
 	var writerInst = [];	
 
+	Logger.root.loggerLevels = conf.loggers;
+
 	conf.adapters.forEach(function(ad) {
-		var levels = [];
 		var adapterWriter = [];
 		ad.writers.forEach(function(e) { // Writer selection
 			// Use same or create new, should be stored in Logger somehow	
@@ -94,10 +101,12 @@ Logger.setup = function (conf) {
 				adapterWriter.push( writerInst[e]);
 			};
 		})
+		var levels = [];
 		ad.levels.forEach(function(e) {
-			levels = Logger[e];		
+			levels.push(Logger[e]);		
 		});
 		var adapter = new LogAdapter(Logger.in(levels),adapterWriter,ad.fmt);
+		adapter.loggerLevels = ad.loggers;
 		Logger.root.adapter(adapter);
 	})
 }

+ 40 - 16
lib/system.js

@@ -7,6 +7,7 @@ var LoggerSystem = class LoggerSystem {
 	constructor() {
 		this.adapters = [];
 		this.writers = {};
+		this.loggerLevels = {};
 		// Prepare TAGS
 		
 		// Global log count? per log
@@ -28,22 +29,51 @@ var LoggerSystem = class LoggerSystem {
 		this.adapters = [];
 	}
 
+	solveLevels(logger,levels) {
+		
+		// If emptu all ok
+		for(var k in levels) {
+			if(logger.name.match(new RegExp("^" + k + "$"))) {
+				return levels[k];
+			}
+		}
+		return null;
+	}
 	base(logger,TAG,msg) {
 		var self = this;
-		this.adapters.forEach((e) => {
-			if(e.filterFunc(TAG)) {
-				var fmt = e.logFmt || this.logFmt;
-				e.writers.forEach(function(w) {
+		var sTAG = LoggerSystem.TAGS[TAG];
+		var gLevels = this.solveLevels(logger,this.loggerLevels);
+
+		for(var a of this.adapters) {
+			var aLevels = this.solveLevels(logger,a.loggerLevels);
+			if(aLevels && !aLevels.includes(sTAG)) {
+				return;
+			}
+			if(gLevels && !gLevels.includes(sTAG)) {
+				return;
+			}
+			// is performance good?
+			// Check if this adapter has conf
+			if(a.filterFunc(TAG)) {
+				a.writers.forEach(function(w) {
+					var fmt = a.fmt;
+					if(fmt==undefined ) {
+						if(w.fmt != undefined && w.fmt[sTAG] != undefined) {
+							fmt = w.fmt[LoggerSystem.TAGS[TAG]];
+						}
+					}
 					var outmsg = self.format(TAG,w.count,logger.name,w.lastTime,logger.lastTime,fmt,msg);
 
 					// Strip ansi if any
 					w.doLog(outmsg);
 				});
 			}
-		});
+		};
 	}
-	
+
+	// Improve and clean this	
 	format(TAG,count,name,lastDate, lastLoggerDate, fmt, msg) {
+		if(fmt == undefined) fmt = this.logFmt; // Overall default format
 		var now = new Date();
 		var dateStr = (("0" + now.getDate()).slice(-2) 
 									+ "-" + ("0" +now.getMonth()).slice(-2) 
@@ -67,7 +97,7 @@ var LoggerSystem = class LoggerSystem {
 		var s = fmt;
 		s = s.replace(/%c/g,count);
 		s = s.replace(/%m/g,msg); 
-		s = s.replace(/%l/g,require('./logger').logTags[TAG]); 
+		s = s.replace(/%l/g,LoggerSystem.TAGS[TAG]);
 		s = s.replace(/%n/g,name); 
 		s = s.replace(/%e/g,"+" +dateDiffStr); 
 		s = s.replace(/%E/g,"+" +ldateDiffStr); 
@@ -92,20 +122,14 @@ var LoggerSystem = class LoggerSystem {
 			for(var i = 0;i<pad;i++) { s+=" "; }
 			s+= " "+logSplit[1];
 		}
-	
-		
-		
-
-
-
-
-
-
 		
 		return s;
 	}
 }
 
+
+LoggerSystem.TAGS = ["ERROR","WARN","INFO","VERBOSE"];
+
 module.exports = LoggerSystem;
 
 

+ 4 - 1
lib/writer.js

@@ -2,7 +2,10 @@
 //
 var Writer = class Writer {
 
-	constructor() {
+	constructor(opt) {
+		if(opt) {
+			this.fmt = opt.format;
+		}
 		this.count = 0;
 		this.lastTime = new Date();
 	}

+ 13 - 2
lib/writers/console.js

@@ -1,10 +1,21 @@
 var LogWriter = require('../writer');
 
+// Default format for consoleWriter
+const defaultFormat = {
+		ERROR: "\033[0;37m[\033[01;30m%c\033[0m: \033[1;34m%n\033[0;37m" +"\033[0;31m -%l- " + "\033[1;31m%m\033[0m  \033[01;30m%E\33[0m" ,
+		WARN:  "\033[0;37m[\033[01;30m%c\033[0m: \033[1;34m%n\033[0;37m" +"\033[0;33m -%l- " + "\033[0;37m%m\033[0m  \033[01;30m%E\33[0m",
+		INFO:  "\033[0;37m[\033[01;30m%c\033[0m: \033[1;34m%n\033[0;37m" +"\033[0;32m -%l- " + "\033[0;37m%m\033[0m  \033[01;30m%E\33[0m",
+		VERBOSE:  "\033[0;37m[\033[01;30m%c\033[0m: \033[1;34m%n\033[0;37m" +"\033[1;30m -%l- " + "\033[1;30m%m\033[0m  \033[01;30m%E\33[0m" ,
+};
 
 
 class ConsoleWriter extends LogWriter {
-
-
+	constructor(opt) {
+		super(opt);
+		if(this.fmt == undefined) {
+			this.fmt = defaultFormat;
+		}
+	}
 	log(msg) {
 		process.stdout.write(msg);
 		process.stdout.write("\n");

+ 1 - 1
lib/writers/file.js

@@ -2,12 +2,12 @@ var LogWriter = require('../writer');
 var fs = require('fs');
 
 
-
 class FileWriter extends LogWriter {
 
 		constructor(opt) {
 			super(opt);
 			this.targetFile = opt.path;
+			this.format = opt.format;
 		}
 
 		log(msg) {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "hlogger",
-  "version": "0.0.6",
+  "version": "0.0.8",
   "description": "Yet another logger",
   "main": "index.js",
   "scripts": {

+ 21 - 10
test/test-conf/conf.json

@@ -3,31 +3,42 @@
 		"filetolog":{
 			"writer":"file",
 			"opts":{
-				"path":"log3.txt"
+				"path":"access.log"
 			}
 		},
 		"errorfile": {
 			"writer":"file",
 			"opts": {
-				"path":"error3.txt"
+				"path":"error.log"
 			}
 		},
 		"console1": {
 			"writer":"console",
-			"opts":{}
+			"opts":{
+				"format":{
+					"ERROR":"-------------- ERR %m -----------------"
+				}
+			}
+		},
+		"console": {
+			"writer":"console"
 		}
 	},
-
+	"loggers": {
+		"main":["ERROR","VERBOSE","INFO","WARN"]
+	},
 	"adapters" : [
 		{
-			"levels": ["ERROR","WARN","INFO"],
-			"fmt": "[%c:%n -%l-  %m %| %E/%c]",
-			"writers": ["filetolog"]
+			"levels": ["INFO","VERBOSE","WARN","ERROR"],
+			"writers": ["filetolog","console"],
+			"loggers": {
+				"Hello": ["INFO"],
+				"main": ["ERROR"]
+			}
 		},
 		{ 
-			"levels":["ERROR"],
-			"fmt": "ERR - %m",
-			"writers": ["errorfile","console1"]
+			"levels":["ERROR","WARN"],
+			"writers": ["errorfile"]
 		}
 	]
 }

+ 24 - 3
test/test-conf/index.js

@@ -1,19 +1,18 @@
 var Logger = require('../../'); // Require logger
 
 
-
 var log = Logger.createLogger("Hello");
 
 log.info("World");
 
 log.error("This will log an error with default adapters");
 
-
 log.verb("Application initiating");
 
 log.info("Loading loggers from config");
-Logger.setup(require('./conf.json'));
 
+Logger.reset();
+Logger.setup(require('./conf.json'));
 
 log.info("Now writing logs with config loaded");
 log.error("Error log");
@@ -29,3 +28,25 @@ var obj = {
 }
 
 log.info("Testing: ", obj);
+
+log.warn("Test multiple loggers");
+
+var log1 = Logger.createLogger("main");
+var log2 = Logger.createLogger("child");
+log1.info("main log");
+log1.error("main log");
+log1.verb("main log");
+log1.warn("main log");
+
+log2.info("child log");
+log2.error("child log");
+log2.verb("child log");
+log2.warn("child log");
+
+
+
+log1.info("This is a log from main");
+log2.info("This is a log from other logger");
+
+var log3 = Logger.createLogger("Hello");
+log3.info("Same logger as before?");