1 var define = require("../define.js").define, base = require("../base"), fs = require('fs'); 2 3 var logging, Logger, Level, appenders; 4 5 var parseProperties = function(properties) { 6 for (var i in properties) { 7 var logger = Logger.getLogger(i); 8 var props = properties[i], level = props.level, appenderArr = props.appenders; 9 if (level) { 10 level = Level.toLevel(level); 11 if (level) { 12 logger.level = level; 13 } 14 } 15 if (appenderArr && base.isArray(appenderArr)) { 16 for (var j = appenderArr.length - 1; j >= 0; j--) { 17 var appenderProps = appenderArr[j], type = appenderProps.type; 18 appenderProps.type = null; 19 if (type) { 20 var appender; 21 switch (type.toLowerCase()) { 22 case "consoleappender": 23 appender = appenders.ConsoleAppender; 24 break; 25 case "jsonappender": 26 appender = appenders.JSONAppender; 27 break; 28 case "fileappender": 29 appender = appenders.FileAppender; 30 break; 31 case "rollingfileappender": 32 appender = appenders.RollingFileAppender; 33 break; 34 } 35 if (appender) { 36 logger.addAppender(new appender(appenderProps)); 37 } 38 } 39 } 40 } 41 } 42 }; 43 44 /** 45 * @class default configurator for logging 46 * 47 * @name BasicConfigurator 48 * @memberOf comb.logging 49 * 50 */ 51 var BasicConfigurator = (exports.BasicConfigurator = define(null, { 52 instance : { 53 /**@lends comb.logging.BasicConfigurator.prototype*/ 54 55 constructor : function() { 56 if (!Logger) { 57 logging = require("./index").logging; 58 Logger = logging.Logger; 59 Level = logging.Level; 60 appenders = logging.appenders; 61 } 62 this.__configured = false; 63 }, 64 65 /** 66 * Configure logging. 67 * 68 * @param {comb.logging.Appender} [appender=null] appender to add to the root logger, by default a console logger is added. 69 */ 70 configure : function(appender) { 71 var rootLogger = Logger.getRootLogger(); 72 if (!appender || !(appender instanceof appenders.Appender) && !this.__configured) { 73 rootLogger.addAppender(new appenders.ConsoleAppender()); 74 this.__configured = true; 75 } else { 76 rootLogger.addAppender(appender); 77 } 78 } 79 } 80 })); 81 82 /** 83 * @class Configures comb.Logger with the properties or properties contained within a file 84 * 85 * @example 86 * 87 * var propertyConfigurator = new comb.logging.PropertyConfigurator(); 88 * 89 * propertyConfigurator.configure("/location/of/combLogger.json"); 90 * 91 * //or 92 * 93 * var config = { 94 * "my.logger" : { 95 * level : "INFO", 96 * appenders : [ 97 * { 98 * //default file appender 99 * type : "FileAppender", 100 * file : "/var/log/myApp.log", 101 * }, 102 * { 103 * //default JSON appender 104 * type : "JSONAppender", 105 * file : "/var/log/myApp.JSON", 106 * }, 107 * { 108 * type : "FileAppender", 109 * //override default patter 110 * pattern : "{[EEEE, MMMM dd, yyyy h:m a]timeStamp} {[5]level}" 111 * + " {[- 5]levelName} {[-20]name} : {message}", 112 * //location of my log file 113 * file : "/var/log/myApp-errors.log", 114 * //override name so it will get added to the log 115 * name : "errorFileAppender", 116 * //overwrite each time 117 * overwrite : true, 118 * //explicity set the appender to only accept errors 119 * level : "ERROR" 120 * }, 121 * { 122 * type : "JSONAppender", 123 * file : "/var/log/myApp-error.json", 124 * //explicity set the appender to only accept errors 125 * level : "ERROR" 126 * } 127 * ] 128 * } 129 * //repeat for more loggers 130 * 131 * propertyConfigurator.configure(config); 132 * } 133 * 134 * @name PropertyConfigurator 135 * @augments comb.logging.BasicConfigurator 136 * @memberOf comb.logging 137 * 138 */ 139 exports.PropertyConfigurator = define(BasicConfigurator, { 140 instance : { 141 /**@lends comb.logging.PropertyConfigurator.prototype*/ 142 /** 143 * Call to configure logging 144 * 145 * @example 146 * 147 * //Example configuration 148 * { 149 * "my.logger" : { 150 * level : "INFO", 151 * appenders : [ 152 * { 153 * //default file appender 154 * type : "FileAppender", 155 * file : "/var/log/myApp.log", 156 * }, 157 * { 158 * //default JSON appender 159 * type : "JSONAppender", 160 * file : "/var/log/myApp.JSON", 161 * }, 162 * { 163 * type : "FileAppender", 164 * //override default patter 165 * pattern : "{[EEEE, MMMM dd, yyyy h:m a]timeStamp} {[5]level}" 166 * + " {[- 5]levelName} {[-20]name} : {message}", 167 * //location of my log file 168 * file : "/var/log/myApp-errors.log", 169 * //override name so it will get added to the log 170 * name : "errorFileAppender", 171 * //overwrite each time 172 * overwrite : true, 173 * //explicity set the appender to only accept errors 174 * level : "ERROR" 175 * }, 176 * { 177 * type : "JSONAppender", 178 * file : "/var/log/myApp-error.json", 179 * //explicity set the appender to only accept errors 180 * level : "ERROR" 181 * } 182 * ] 183 * } 184 * 185 * @param {Object|String} properties Object containing configuration or string containing a file name with the configuration. 186 */ 187 configure : function(properties) { 188 if (base.isObject(properties)) { 189 parseProperties(properties); 190 } else { 191 fs.readFile(properties, function(err, res) { 192 if (err) { 193 throw err; 194 } else { 195 try { 196 parseProperties(JSON.parse(res)); 197 } catch(e) { 198 throw e; 199 } 200 } 201 }) 202 } 203 } 204 } 205 });