1 //jls.loader.provide('jls.lang.Logger'); 2 3 /** 4 * @class Default logger implementation. 5 * A Logger object is used to log messages for a specific system or application component. 6 */ 7 jls.lang.Logger = jls.lang.Class.create(/** @lends jls.lang.Logger.prototype */ 8 { 9 initialize : function(level) { 10 this._level = level || jls.lang.Logger.INFO; 11 }, 12 getLogLevel : function() { 13 return this._level; 14 }, 15 setLogLevel : function(level) { 16 if (typeof level == 'number') { 17 this._level = level; 18 } else if (typeof level == 'string') { 19 level = level.toUpperCase(); 20 if (level in jls.lang.Logger) { 21 this._level = jls.lang.Logger[level]; 22 } 23 } 24 }, 25 isTraceEnabled : function() { 26 return this.isEnabledFor(jls.lang.Logger.TRACE); 27 }, 28 isDebugEnabled : function() { 29 return this.isEnabledFor(jls.lang.Logger.DEBUG); 30 }, 31 isEnabledFor : function(level) { 32 return this._level <= level; 33 }, 34 trace : function(msg) { 35 this.log(jls.lang.Logger.TRACE, msg); 36 }, 37 debug : function(msg) { 38 this.log(jls.lang.Logger.DEBUG, msg); 39 }, 40 info : function(msg) { 41 this.log(jls.lang.Logger.INFO, msg); 42 }, 43 warn : function(msg) { 44 this.log(jls.lang.Logger.WARN, msg); 45 }, 46 error : function(msg) { 47 this.log(jls.lang.Logger.ERROR, msg); 48 }, 49 logObject : function(level, msg, o) { 50 if (this._level > level) { 51 return; 52 } 53 this.log(level, msg + ': ' + o); 54 for (var k in o) { 55 if (typeof (o[k]) == 'function') { 56 this.log(level, ' ' + k + '()'); 57 } else { 58 this.log(level, ' ' + k + ': ' + o[k]); 59 } 60 } 61 }, 62 logBuffer : function(level, buffer, message) { 63 if (this._level > level) { 64 return; 65 } 66 if (message) { 67 this.log(level, message); 68 } 69 var buffer = buffer.slice(); 70 var w = 16; 71 var hex = '0123456789abcdef'; 72 for (var l = 0; buffer.remaining() > 0; l += w) { 73 var lineHex = ''; 74 var lineAsc = ''; 75 for (var c = 0; c < w; c++) { 76 if (buffer.remaining() == 0) { 77 lineHex += ' '; 78 lineAsc += ' '; 79 continue; 80 } 81 var b = buffer.getByte(); 82 lineHex += hex.charAt(b >> 4) + hex.charAt(b & 0x0f) + ' '; 83 lineAsc += b > 31 && b < 128 ? String.fromCharCode(b) : ' '; 84 } 85 this.log(level, lineHex + lineAsc); 86 } 87 }, 88 log : function(level, msg) { 89 if ((level < jls.lang.Logger.FINEST) || (level > jls.lang.Logger.ERROR)) { 90 throw new jls.lang.Exception("Invalid log level " + level); 91 } 92 _native.core.log(level, msg); 93 } 94 }); 95 96 /* 97 * Could be used as the following: 98 * new jls.lang.Exception().printStackTrace(new jls.lang.Logger.PrintStream(jls.logger, jls.lang.Logger.WARN)); 99 */ 100 jls.lang.Logger.PrintStream = jls.lang.Class.create({ 101 initialize : function(logger, level) { 102 this._logger = logger; 103 this._level = level || jls.lang.Logger.DEBUG; 104 this._buffer = null; 105 }, 106 flush : function() { 107 if (this._buffer != null) { 108 this._logger.log(this._level, this._buffer); 109 this._buffer = null; 110 } 111 return this; 112 }, 113 print : function(s) { 114 if (this._buffer == null) { 115 this._buffer = s; 116 } else { 117 this._buffer += s; 118 } 119 if (s.indexOf('\n') >= 0) { 120 this.flush(); 121 } 122 return s.length; 123 }, 124 println : function(s) { 125 if (s) { 126 return this.print(s + jls.io.PrintStream.separator); 127 } else { 128 return this.print(jls.io.PrintStream.separator); 129 } 130 } 131 }); 132 133 Object.extend(jls.lang.Logger, /** @lends jls.lang.Logger */ 134 { 135 FINEST: 1, 136 FINE: 2, 137 TRACE: 3, 138 DEBUG: 4, 139 INFO: 5, 140 WARN: 6, 141 ERROR: 7 142 }); 143 144