-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheasylog.js
197 lines (178 loc) · 5.21 KB
/
easylog.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/**
* easylog .. simple file logger
*
* @author Ruchir Godura [email protected]
* Copyright (c) 2015 Cerient Technology LLC.
*/
/**
* Module easylog. A simple log to file mechanism that handles
* multiple log levels and file size rollover with autonaming.
* @module easylog
*
* @example
* var easylog = require('./easylog');
* logfn1 = easylog.logger('logfile1.log');
* logfn2 = easylog.logger(); // default is xo.log
*
* //generate log messages
* logfn1('ERROR', 'module1', 'this is %s message number %d', 'test', 1);
* logfn2('INFO', 'module2', 'this is a JSON object %j', {key1: 'val1', key2: 'val2'});
*
*/
"use strict";
/* jshint browserify: true, browser: true, node: true */
var fs;
try {
fs = require('fs');
} catch (e) {
fs = null;
}
var path = require('path');
var util = require("util");
/**
* ERROR LEVELS.
* Higher Levels include the lower levels.
*/
var levels = {
ERROR: 0,
WARN: 1,
INFO: 2,
DEBUG: 3,
TRACE: 4,
ALL: 5
};
var MAXFILESIZE = 2000000;
var LOGFOLDER = null;
var DEFAULTLOGFILE = 'xo.log';
var LogFuncs = {};
var TZOFFSET = (new Date()).getTimezoneOffset() * 60000; // timezone offset in milliseconds
/**
* Returns a logging function function
* @param {String} [logfile=DEFAULTLOGFILE] The name of te log file to write to.
* The log file is created in the folder LOGFOLDER
* @returns {Function} logger function function(level, name, message [, args...]) if successful.
* Null if some error occured in opening the log file
* for writing.
*/
var logger = function(logfile) {
logfile = logfile || DEFAULTLOGFILE;
if (logfile in LogFuncs)
return LogFuncs[logfile];
if (LOGFOLDER && fs){
try {
fs.appendFileSync(LOGFOLDER+logfile, '');
} catch (e) {
return null;
}
}
var logfn = function(level, name, message) {
if (!(level in levels))
return false;
if (levels[level] > logfn.loglevel)
return false;
name = name || 'log';
if(arguments.length > 2)
message = util.format.apply(null, Array.prototype.slice.call(arguments, 2));
else
message = message || level;
var ts = (new Date(Date.now()-TZOFFSET)).toISOString().slice(0,-1);
var msg = ts+' ['+level+'] ['+name+'] '+message+'\n';
if (LOGFOLDER && fs){
fs.appendFileSync(LOGFOLDER+logfn.logfile, msg);
logfn.filesize += msg.length;
if (logfn.filesize > logfn.maxFileSize){
var newlogfile = ts.slice(0,16)+ '_' +
logfn.logfile;
fs.renameSync(LOGFOLDER+logfn.logfile, LOGFOLDER+newlogfile);
fs.appendFileSync(LOGFOLDER+logfn.logfile, '');
logfn.filesize = 0;
}
} else {
console.log(msg);
}
return true;
};
logfn.logfile = logfile;
if (LOGFOLDER && fs)
logfn.filesize = fs.statSync(LOGFOLDER+logfile).size;
else
logfn.filesize = 0;
logfn.maxFileSize = MAXFILESIZE;
logfn.loglevel = levels.ERROR;
logfn.setlevel = function(level) {
if (!(level in levels))
return false;
logfn.loglevel = levels[level];
return true;
};
LogFuncs[logfile] = logfn;
return logfn;
};
/**
* Set the log level for one or more log files.
* @param {String} logfile Name of the log file. If null, all open log files are selected
* @param {String} level 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL'
* @returns {Boolean} true if set successfully. False if invalid level or logfile
*/
var setLogLevel = function(logfile, level) {
if (!(level in levels))
return false;
if (!logfile) { // set all logs to same level
for (var log in LogFuncs) {
LogFuncs[log].loglevel = levels[level];
}
return true;
}
if (logfile in LogFuncs) {
LogFuncs[logfile].loglevel = level;
return true;
}
return false;
};
/**
* Set the max file size for a log file
* @param {String} logfile Name of log file. If null, all open log files are selected.
* @param {Number} size Max size of log file before it rolls over. Old file is saved
* with current date and time prepended to the file name.
* @returns {Boolean} True if size set successfully. False if invalid file or size;
*/
var setMaxFileSize = function(logfile, size) {
if ((size > 10000000) || (size < 100))
return false;
if (!logfile) { // set all logs to same level
for (var log in LogFuncs) {
LogFuncs[log].maxFileSize = size;
}
return true;
}
if (logfile in LogFuncs) {
LogFuncs[logfile].maxFileSize = size;
return true;
}
return false;
};
/**
* Set the folder under which log files will be created. Should be called once at the entry
* point to the application.
* @param {String} logFolder The full path of the folder
*/
var setLogFolder = function(logFolder) {
if (logFolder) {
LOGFOLDER = logFolder + '/';
}
};
/**
* Returns the current log folder.
* @returns {String} The name of the current log folder
*/
var getLogFolder = function() {
return LOGFOLDER;
};
exports.logger = logger;
exports.setLogLevel = setLogLevel;
exports.setMaxFileSize = setMaxFileSize;
exports.setLogFolder = setLogFolder;
exports.getLogFolder = getLogFolder;
if (require.main === module){
//eval(require('./easyrepl'));
}