Explorar el Código

Added logger levels to configuration

luisf hace 9 años
padre
commit
8d6065b21c
Se han modificado 14 ficheros con 257 adiciones y 111 borrados
  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?");