diff --git a/lib/log4js-node.js b/lib/log4js-node.js deleted file mode 100644 index 6857baf..0000000 --- a/lib/log4js-node.js +++ /dev/null @@ -1,609 +0,0 @@ -var fs = require('fs'), sys = require('sys'); -var DEFAULT_CATEGORY = '[default]'; -var ALL_CATEGORIES = '[all]'; - -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jsl:option explicit*/ - -/** - * @fileoverview log4js is a library to log in JavaScript in similar manner - * than in log4j for Java. The API should be nearly the same. - * - * This file contains all log4js code and is the only file required for logging. - * - *
- * var logging = require('log4js-node');
- * //add an appender that logs all messages to stdout.
- * logging.addAppender(logging.consoleAppender());
- * //add an appender that logs "some-category" to a file
- * logging.addAppender(logging.fileAppender("file.log"), "some-category");
- * //get a logger
- * var log = logging.getLogger("some-category");
- * log.setLevel(logging.levels.TRACE); //set the Level
- *
- * ...
- *
- * //call the log
- * log.trace("trace me" );
- *
- *
- * @version 1.0
- * @author Stephan Strittmatter - http://jroller.com/page/stritti
- * @author Seth Chisamore - http://www.chisamore.com
- * @since 2005-05-20
- * @static
- * Website: http://log4js.berlios.de
- */
-var log4js = {
-
- /**
- * Current version of log4js-node.
- * @static
- * @final
- */
- version: "0.1.0",
-
- /**
- * Date of logger initialized.
- * @static
- * @final
- */
- applicationStartDate: new Date(),
-
- /**
- * Hashtable of loggers.
- * @static
- * @final
- * @private
- */
- loggers: {},
-
- appenders: {}
-};
-
-
- /**
- * Get a logger instance. Instance is cached on categoryName level.
- * @param {String} categoryName name of category to log to.
- * @return {Logger} instance of logger for the category
- * @static
- */
-exports.getLogger = log4js.getLogger = function(categoryName) {
-
- // Use default logger if categoryName is not specified or invalid
- if (!(typeof categoryName == "string")) {
- categoryName = DEFAULT_CATEGORY;
- }
-
- var appenderList;
- if (!log4js.loggers[categoryName]) {
- // Create the logger for this name if it doesn't already exist
- log4js.loggers[categoryName] = new Logger(categoryName);
- if (log4js.appenders[categoryName]) {
- appenderList = log4js.appenders[categoryName];
- appenderList.forEach(function(appender) {
- log4js.loggers[categoryName].addListener("log", appender);
- });
- }
- if (log4js.appenders[ALL_CATEGORIES]) {
- appenderList = log4js.appenders[ALL_CATEGORIES];
- appenderList.forEach(function(appender) {
- log4js.loggers[categoryName].addListener("log", appender);
- });
- }
- }
-
- return log4js.loggers[categoryName];
-};
-
- /**
- * Get the default logger instance.
- * @return {Logger} instance of default logger
- * @static
- */
-exports.getDefaultLogger = log4js.getDefaultLogger = function() {
- return log4js.getLogger(DEFAULT_CATEGORY);
-};
-
-exports.addAppender = log4js.addAppender = function (appender, categoryName) {
- var category = categoryName || ALL_CATEGORIES;
- if (!log4js.appenders[category]) {
- log4js.appenders[category] = [];
- }
- log4js.appenders[category].push(appender);
-
- if (category === ALL_CATEGORIES) {
- for (var logger in log4js.loggers) {
- if (log4js.loggers.hasOwnProperty(logger)) {
- log4js.loggers[logger].addListener("log", appender);
- }
- }
- } else if (log4js.loggers[category]) {
- log4js.loggers[category].addListener("log", appender);
- }
-};
-
-exports.clearAppenders = log4js.clearAppenders = function() {
- log4js.appenders = [];
- for (var logger in log4js.loggers) {
- if (log4js.loggers.hasOwnProperty(logger)) {
- log4js.loggers[logger].listeners.length = 0;
- }
- }
-};
-
-exports.configure = log4js.configure = function(configurationFile) {
- var config = JSON.parse(fs.readFileSync(configurationFile));
- configureAppenders(config.appenders);
- configureLevels(config.levels);
-};
-
-exports.levels = log4js.levels = {
- ALL: new Level(Number.MIN_VALUE, "ALL"),
- TRACE: new Level(5000, "TRACE"),
- DEBUG: new Level(10000, "DEBUG"),
- INFO: new Level(20000, "INFO"),
- WARN: new Level(30000, "WARN"),
- ERROR: new Level(40000, "ERROR"),
- FATAL: new Level(50000, "FATAL"),
- OFF: new Level(Number.MAX_VALUE, "OFF")
-};
-
-var appenderMakers = {
- "file": function(config) {
- var layout;
- if (config.layout) {
- layout = layoutMakers[config.layout.type](config.layout);
- }
- return fileAppender(config.filename, layout);
- },
- "console": function(config) {
- var layout;
- if (config.layout) {
- layout = layoutMakers[config.layout.type](config.layout);
- }
- return consoleAppender(layout);
- },
- "logLevelFilter": function(config) {
- var appender = appenderMakers[config.appender.type](config.appender);
- return logLevelFilter(config.level, appender);
- }
-};
-
-var layoutMakers = {
- "messagePassThrough": function() { return messagePassThroughLayout; },
- "basic": function() { return basicLayout; },
- "pattern": function (config) {
- var pattern = config.pattern || undefined;
- return patternLayout(pattern);
- }
-};
-
-function configureAppenders(appenderList) {
- log4js.clearAppenders();
- if (appenderList) {
- appenderList.forEach(function(appenderConfig) {
- var appender = appenderMakers[appenderConfig.type](appenderConfig);
- if (appender) {
- log4js.addAppender(appender, appenderConfig.category);
- } else {
- throw new Error("log4js configuration problem for "+sys.inspect(appenderConfig));
- }
- });
- } else {
- log4js.addAppender(consoleAppender);
- }
-}
-
-function configureLevels(levels) {
- if (levels) {
- for (var category in levels) {
- if (levels.hasOwnProperty(category)) {
- log4js.getLogger(category).setLevel(levels[category]);
- }
- }
- }
-}
-
-
-/**
- * Log4js.Level Enumeration. Do not use directly. Use static objects instead.
- * @constructor
- * @param {Number} level number of level
- * @param {String} levelString String representation of level
- * @private
- */
-function Level(level, levelStr) {
- this.level = level;
- this.levelStr = levelStr;
-};
-
-/**
- * converts given String to corresponding Level
- * @param {String} sArg String value of Level
- * @param {Log4js.Level} defaultLevel default Level, if no String representation
- * @return Level object
- * @type Log4js.Level
- */
-Level.toLevel = function(sArg, defaultLevel) {
-
- if (sArg === null) {
- return defaultLevel;
- }
-
- if (typeof sArg == "string") {
- var s = sArg.toUpperCase();
- if (log4js.levels[s]) {
- return log4js.levels[s];
- }
- }
- return defaultLevel;
-};
-
-Level.prototype.toString = function() {
- return this.levelStr;
-};
-
-Level.prototype.isLessThanOrEqualTo = function(otherLevel) {
- return this.level <= otherLevel.level;
-};
-
-Level.prototype.isGreaterThanOrEqualTo = function(otherLevel) {
- return this.level >= otherLevel.level;
-};
-
-/**
- * Models a logging event.
- * @constructor
- * @param {String} categoryName name of category
- * @param {Log4js.Level} level level of message
- * @param {String} message message to log
- * @param {Log4js.Logger} logger the associated logger
- * @author Seth Chisamore
- */
-LoggingEvent = function(categoryName, level, message, exception, logger) {
- /**
- * the timestamp of the Logging Event
- * @type Date
- * @private
- */
- this.startTime = new Date();
- /**
- * category of event
- * @type String
- * @private
- */
- this.categoryName = categoryName;
- /**
- * the logging message
- * @type String
- * @private
- */
- this.message = message;
- /**
- * the logging exception
- * @type Exception
- * @private
- */
- this.exception = exception;
- /**
- * level of log
- * @type Log4js.Level
- * @private
- */
- this.level = level;
- /**
- * reference to logger
- * @type Log4js.Logger
- * @private
- */
- this.logger = logger;
-};
-
-/**
- * Logger to log messages.
- * use {@see Log4js#getLogger(String)} to get an instance.
- * @constructor
- * @param name name of category to log to
- * @author Stephan Strittmatter
- */
-Logger = function(name, level) {
- this.category = name || DEFAULT_CATEGORY;
- this.level = Level.toLevel(level, log4js.levels.TRACE);
-};
-
-sys.inherits(Logger, process.EventEmitter);
-
-Logger.prototype.setLevel = function(level) {
- this.level = Level.toLevel(level, log4js.levels.TRACE);
-};
-
-Logger.prototype.log = function(logLevel, message, exception) {
- var loggingEvent = new LoggingEvent(this.category, logLevel, message, exception, this);
- this.emit("log", loggingEvent);
-};
-
-Logger.prototype.isLevelEnabled = function(otherLevel) {
- return this.level.isLessThanOrEqualTo(otherLevel);
-};
-
-['Trace','Debug','Info','Warn','Error','Fatal'].forEach(
- function(levelString) {
- var level = Level.toLevel(levelString);
- Logger.prototype['is'+levelString+'Enabled'] = function() {
- return this.isLevelEnabled(level);
- };
-
- Logger.prototype[levelString.toLowerCase()] = function (message, exception) {
- if (this.isLevelEnabled(level)) {
- this.log(level, message, exception);
- }
- };
- }
-);
-
-var consoleAppender = function (layout) {
- layout = layout || basicLayout;
- return function(loggingEvent) {
- sys.puts(layout(loggingEvent));
- };
-};
-
-/**
- * File Appender writing the logs to a text file.
- *
- * @param file file log messages will be written to
- * @param layout a function that takes a logevent and returns a string (defaults to basicLayout).
- */
-var fileAppender = function(file, layout) {
- layout = layout || basicLayout;
- file = file || "log4js.log";
- //syncs are generally bad, but we need
- //the file to be open before we start doing any writing.
- var logFile = fs.openSync(file, process.O_APPEND | process.O_WRONLY | process.O_CREAT, 0644);
- //register ourselves as listeners for shutdown
- //so that we can close the file.
- //not entirely sure this is necessary, but still.
- process.addListener("exit", function() { fs.close(logFile); });
-
- return function(loggingEvent) {
- fs.write(logFile, layout(loggingEvent)+'\n', null, "utf-8");
- };
-};
-
-var logLevelFilter = function(levelString, appender) {
- var level = Level.toLevel(levelString);
- return function(logEvent) {
- if (logEvent.level.isGreaterThanOrEqualTo(level)) {
- appender(logEvent);
- }
- }
-};
-
-/**
- * BasicLayout is a simple layout for storing the logs. The logs are stored
- * in following format:
- * - * [startTime] [logLevel] categoryName - message\n - *- * - * @author Stephan Strittmatter - */ -var basicLayout = function(loggingEvent) { - var timestampLevelAndCategory = '[' + loggingEvent.startTime.toFormattedString() + '] '; - timestampLevelAndCategory += '[' + loggingEvent.level.toString() + '] '; - timestampLevelAndCategory += loggingEvent.categoryName + ' - '; - - var output = timestampLevelAndCategory + loggingEvent.message; - - if (loggingEvent.exception) { - output += '\n' - output += timestampLevelAndCategory; - if (loggingEvent.exception.stack) { - output += loggingEvent.exception.stack; - } else { - output += loggingEvent.exception.name + ': '+loggingEvent.exception.message; - } - } - return output; -}; - -var messagePassThroughLayout = function(loggingEvent) { - return loggingEvent.message; -}; - -/** - * PatternLayout - * Takes a pattern string and returns a layout function. - * @author Stephan Strittmatter - */ -var patternLayout = function(pattern) { - pattern = pattern || patternLayout.DEFAULT_CONVERSION_PATTERN; - var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([cdmnpr%])(\{([^\}]+)\})?|([^%]+)/; - - return function(loggingEvent) { - var formattedString = ""; - var result; - var searchString = this.pattern; - - while ((result = regex.exec(searchString))) { - var matchedString = result[0]; - var padding = result[1]; - var truncation = result[2]; - var conversionCharacter = result[3]; - var specifier = result[5]; - var text = result[6]; - - // Check if the pattern matched was just normal text - if (text) { - formattedString += "" + text; - } else { - // Create a raw replacement string based on the conversion - // character and specifier - var replacement = ""; - switch(conversionCharacter) { - case "c": - var loggerName = loggingEvent.categoryName; - if (specifier) { - var precision = parseInt(specifier, 10); - var loggerNameBits = loggingEvent.categoryName.split("."); - if (precision >= loggerNameBits.length) { - replacement = loggerName; - } else { - replacement = loggerNameBits.slice(loggerNameBits.length - precision).join("."); - } - } else { - replacement = loggerName; - } - break; - case "d": - var dateFormat = Date.ISO8601_FORMAT; - if (specifier) { - dateFormat = specifier; - // Pick up special cases - if (dateFormat == "ISO8601") { - dateFormat = Date.ISO8601_FORMAT; - } else if (dateFormat == "ABSOLUTE") { - dateFormat = Date.ABSOLUTETIME_FORMAT; - } else if (dateFormat == "DATE") { - dateFormat = Date.DATETIME_FORMAT; - } - } - // Format the date - replacement = loggingEvent.startTime.toFormattedString(dateFormat); - break; - case "m": - replacement = loggingEvent.message; - break; - case "n": - replacement = "\n"; - break; - case "p": - replacement = loggingEvent.level.toString(); - break; - case "r": - replacement = "" + loggingEvent.startTime.toLocaleTimeString(); //TODO: .getDifference(Log4js.applicationStartDate); - break; - case "%": - replacement = "%"; - break; - default: - replacement = matchedString; - break; - } - // Format the replacement according to any padding or - // truncation specified - - var len; - - // First, truncation - if (truncation) { - len = parseInt(truncation.substr(1), 10); - replacement = replacement.substring(0, len); - } - // Next, padding - if (padding) { - if (padding.charAt(0) == "-") { - len = parseInt(padding.substr(1), 10); - // Right pad with spaces - while (replacement.length < len) { - replacement += " "; - } - } else { - len = parseInt(padding, 10); - // Left pad with spaces - while (replacement.length < len) { - replacement = " " + replacement; - } - } - } - formattedString += replacement; - } - searchString = searchString.substr(result.index + result[0].length); - } - return formattedString; - }; - -}; - -patternLayout.TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n"; -patternLayout.DEFAULT_CONVERSION_PATTERN = "%m%n"; - -Date.ISO8601_FORMAT = "yyyy-MM-dd hh:mm:ss.SSS"; -Date.ISO8601_WITH_TZ_OFFSET_FORMAT = "yyyy-MM-ddThh:mm:ssO"; -Date.DATETIME_FORMAT = "dd MMM YYYY hh:mm:ss.SSS"; -Date.ABSOLUTETIME_FORMAT = "hh:mm:ss.SSS"; - -Date.prototype.toFormattedString = function(format) { - format = format || Date.ISO8601_FORMAT; - - var vDay = addZero(this.getDate()); - var vMonth = addZero(this.getMonth()+1); - var vYearLong = addZero(this.getFullYear()); - var vYearShort = addZero(this.getFullYear().toString().substring(3,4)); - var vYear = (format.indexOf("yyyy") > -1 ? vYearLong : vYearShort); - var vHour = addZero(this.getHours()); - var vMinute = addZero(this.getMinutes()); - var vSecond = addZero(this.getSeconds()); - var vMillisecond = padWithZeros(this.getMilliseconds(), 3); - var vTimeZone = offset(this); - var formatted = format - .replace(/dd/g, vDay) - .replace(/MM/g, vMonth) - .replace(/y{1,4}/g, vYear) - .replace(/hh/g, vHour) - .replace(/mm/g, vMinute) - .replace(/ss/g, vSecond) - .replace(/SSS/g, vMillisecond) - .replace(/O/g, vTimeZone); - return formatted; - - function padWithZeros(vNumber, width) { - var numAsString = vNumber + ""; - while (numAsString.length < width) { - numAsString = "0" + numAsString; - } - return numAsString; - } - - function addZero(vNumber) { - return padWithZeros(vNumber, 2); - } - - /** - * Formats the TimeOffest - * Thanks to http://www.svendtofte.com/code/date_format/ - * @private - */ - function offset(date) { - // Difference to Greenwich time (GMT) in hours - var os = Math.abs(date.getTimezoneOffset()); - var h = String(Math.floor(os/60)); - var m = String(os%60); - h.length == 1? h = "0"+h:1; - m.length == 1? m = "0"+m:1; - return date.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m; - } -}; - -exports.consoleAppender = log4js.consoleAppender = consoleAppender; -exports.fileAppender = log4js.fileAppender = fileAppender; -exports.logLevelFilter = log4js.logLevelFilter = logLevelFilter; -exports.basicLayout = log4js.basicLayout = basicLayout; -exports.patternLayout = log4js.patternLayout = patternLayout; -exports.messagePassThroughLayout = log4js.messagePassThroughLayout = messagePassThroughLayout; -