1 var define = require("../../define.js").define, 2 base = require("../../base"), 3 promise = require("../../promise"), 4 string = base.string, 5 Promise = promise.Promise, 6 PromiseList = promise.PromiseList, 7 style = string.style, 8 format = string.format, 9 Appender = require("./appender"), 10 Level = require("../level"), 11 fs = require("fs"); 12 13 /** 14 * @class Appends messages to a file. 15 * 16 * <pre class="code"> 17 * var fileAppender = new comb.logging.appenders.FileAppender({ 18 * file : "/var/log/myLog.log" 19 * }); 20 * </pre> 21 * 22 * @name FileAppender 23 * @augments comb.logging.appenders.Appender 24 * @memberOf comb.logging.appenders 25 * 26 * @param {Object} [options] options to assign to this Appender 27 * @param {String} [options.name="appender"] the name of this Appender. If you want two of the same type of appender 28 * on a logger it must have a different name. 29 * @param {String} [options.pattern="[{[yyyy-MM-ddTHH:mm:ss:SSS (z)]timeStamp}] {[- 5]levelName} {[-20]name} - {message}"] 30 * <p>Available Options for formatting see {@link comb.string.format} for formatting options</p> 31 * <ul> 32 * <li>timeStamp - the timestamp of the event being logged</li> 33 * <li>level - the {@link comb.logging.Level} of the event</li> 34 * <li>levelName - the name of the level being logged</li> 35 * <li>name - the name of the logger logging the event</li> 36 * <li>message - the message being logged</li> 37 * </ul> 38 * @param {comb.logging.Level|String} [options.level=comb.logging.Level.INFO] the logging level of this appender 39 * <p><b>Note:</b> the level can be different from the logger in the case that you want a particular logger 40 * to only log particular event of a level. For example an appender that only logs errors. BEWARE that if the 41 * appenders level is lower than the logger is will not recieve any messages.</p> 42 * 43 * @param {String} [options.file="./log.log"] the file to log events to. 44 * @param {String} [options.encoding="utf8"] the encoding of the file. 45 * @param {Boolean} [options.overwrite=false] if true the log file is overwritten otherwise it is appended to. 46 * 47 */ 48 exports = module.exports = define(Appender, { 49 instance : { 50 51 constructor : function(options) { 52 options = options || {}; 53 !options.name && (options.name = "fileAppender"); 54 this.__file = options.file || "./log.log"; 55 this.__encoding = options.encoding || "utf8"; 56 this.__overwrite = options.overwrite || false; 57 this.__writeStream = options.writeStream || fs.createWriteStream(this.__file, { flags: this.__overwrite ? "w" : 'a', encoding: this.__encoding}); 58 this._super(arguments, [options]); 59 this.__pattern += "\n"; 60 process.addListener("exit", base.hitch(this, "__onExit")); 61 }, 62 63 __onExit : function() { 64 var ret = new Promise(); 65 var ws = this.__writeStream; 66 this.__writeStream = null; 67 ws.on("close", base.hitch(ret, "callback")); 68 ws.destroySoon(); 69 return ret; 70 }, 71 72 append : function(event) { 73 var ws = this.__writeStream; 74 if (this._canAppend(event) && ws && ws.writable) { 75 var message = format(this.__pattern, event); 76 var level = event.level; 77 ws.write(message); 78 } 79 } 80 } 81 });