struct-logger 0.0.1-security → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of struct-logger might be problematic. Click here for more details.

package/index.d.ts ADDED
@@ -0,0 +1,304 @@
1
+ ///<reference lib="ES2015"/>
2
+ ///<reference types="moment"/>
3
+
4
+ import moment = require("moment");
5
+
6
+ type STANDARD_LEVELS = SimpleLogger.STANDARD_LEVELS;
7
+ type Logger = SimpleLogger.Logger;
8
+
9
+ type IConsoleAppenderOptions = SimpleLogger.IConsoleAppenderOptions;
10
+ type ConsoleAppender = SimpleLogger.appenders.ConsoleAppender;
11
+ type IFileAppenderOptions = SimpleLogger.IFileAppenderOptions;
12
+ type FileAppender = SimpleLogger.appenders.FileAppender;
13
+ type IRollingFileAppenderOptions = SimpleLogger.IRollingFileAppenderOptions;
14
+ type RollingFileAppender = SimpleLogger.appenders.RollingFileAppender;
15
+ type PrepareLogger = SimpleLogger.PrepareLogger;
16
+ type AbstractAppender = SimpleLogger.AbstractAppender;
17
+ type ISimpleLoggerOptions = SimpleLogger.ISimpleLoggerOptions;
18
+ declare class SimpleLogger
19
+ {
20
+ constructor(opts?: ISimpleLoggerOptions);
21
+ createLogger(options?: SimpleLogger.ILoggerOptions): Logger;
22
+ createLogger(category?: string, level?: STANDARD_LEVELS): Logger;
23
+ createConsoleAppender(opts?: IConsoleAppenderOptions): ConsoleAppender;
24
+ createFileAppender(opts?: IFileAppenderOptions): FileAppender;
25
+ createPrepareLogger(): PrepareLogger;
26
+ createRollingFileAppender(opts?: IRollingFileAppenderOptions): RollingFileAppender;
27
+ addAppender<T extends AbstractAppender>(appender: AbstractAppender): T;
28
+ getAppenders(): AbstractAppender[];
29
+ getLoggers(): Logger[];
30
+ startRefreshThread(): void;
31
+ setAllLoggerLevels(level: STANDARD_LEVELS): void;
32
+ readConfig(completeCallback?: (err?: any) => void): void;
33
+ }
34
+
35
+
36
+
37
+ declare namespace SimpleLogger
38
+ {
39
+ export type STANDARD_LEVELS = 'all' | 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
40
+ interface IEntry
41
+ {
42
+ ts: moment.MomentInput;
43
+ pid: number;
44
+ domain?: string;
45
+ category?: string;
46
+ level: STANDARD_LEVELS;
47
+ msg: any | any[];
48
+ }
49
+ interface ISimpleLoggerOptions
50
+ {
51
+ domain?: string;
52
+ loggers?: Logger[];
53
+ level?: STANDARD_LEVELS;
54
+ loggerConfigFile?: string;
55
+ refresh?: number;
56
+ fs?: any;
57
+ createInterval?: typeof setInterval;
58
+ minRefresh?: number;
59
+ errorEventName?: string;
60
+ }
61
+ export interface ILoggerOptions
62
+ {
63
+ pid?: number;
64
+ errorEventName?: string;
65
+ domain?: string;
66
+ category?: string;
67
+ level?: STANDARD_LEVELS;
68
+ levels?: STANDARD_LEVELS[];
69
+ appenders?: AbstractAppender[]
70
+ }
71
+ export namespace PrepareLogger
72
+ {
73
+ var STANDARD_LEVELS: STANDARD_LEVELS[];
74
+ var DEFAULT_LEVEL: STANDARD_LEVELS;
75
+ }
76
+ export namespace Logger
77
+ {
78
+ var STANDARD_LEVELS: STANDARD_LEVELS[];
79
+ var DEFAULT_LEVEL: STANDARD_LEVELS;
80
+ }
81
+ export class Logger
82
+ {
83
+
84
+ constructor(options?: ILoggerOptions);
85
+ /**
86
+ * log the statement message
87
+ *
88
+ * @param level the level of this message (label, i.e, info, warn, etc)
89
+ * @param msg
90
+ */
91
+ log(level: STANDARD_LEVELS, msg: any[] | any): void;
92
+
93
+ /**
94
+ * set the level
95
+ *
96
+ * @param lvl one of the recognized logger levels
97
+ */
98
+ setLevel(lvl: STANDARD_LEVELS): void;
99
+
100
+ /**
101
+ * return the current level string
102
+ */
103
+ getLevel(): STANDARD_LEVELS;
104
+
105
+ /**
106
+ * set the list of appenders
107
+ * @param appenderList
108
+ */
109
+ setAppenders(appenderList: AbstractAppender[]): void;
110
+
111
+ /**
112
+ * add an appender to the list
113
+ *
114
+ * @param appender - implements write method
115
+ */
116
+ addAppender<T extends AbstractAppender>(appender: T): T;
117
+
118
+ /**
119
+ * remove the appender using the type name
120
+ */
121
+ removeAppender(typeName: string): void;
122
+
123
+
124
+ getAppenders(): AbstractAppender[];
125
+ isDebug(): boolean;
126
+ isInfo(): boolean;
127
+
128
+ /**
129
+ * return the status map with log counts for each level
130
+ */
131
+ getStats(): Map<STANDARD_LEVELS, number>;
132
+
133
+ getCategory(): string | undefined;
134
+
135
+ getDomain(): string | undefined;
136
+
137
+ all(...arr: any[]): void;
138
+ trace(...arr: any[]): void;
139
+ debug(...arr: any[]): void;
140
+ info(...arr: any[]): void;
141
+ warn(...arr: any[]): void;
142
+ error(...arr: any[]): void;
143
+ fatal(...arr: any[]): void;
144
+ }
145
+
146
+ export interface IAbstractAppenderOptions
147
+ {
148
+ typeName?: string;
149
+ timestampFormat?: string;
150
+ prettyPrint?: boolean;
151
+ separator?: string;
152
+ level?: STANDARD_LEVELS;
153
+ levels?: STANDARD_LEVELS[];
154
+ }
155
+ export interface IConsoleAppenderOptions extends IAbstractAppenderOptions
156
+ {
157
+ typeName?: string;
158
+ writer?: Function;
159
+ }
160
+ export interface IFileAppenderOptions extends IAbstractAppenderOptions
161
+ {
162
+ typeName?: string;
163
+ fs?: any;
164
+ autoOpen?: boolean;
165
+ logFilePath: string;
166
+ writer?: any;
167
+ }
168
+ export interface IRollingFileAppenderOptions extends IAbstractAppenderOptions
169
+ {
170
+ typeName?: string;
171
+ fs?: any;
172
+ autoOpen?: boolean;
173
+ logDirectory: string;
174
+ fileNamePattern: string;
175
+ dateFormat?: string;
176
+ currentFile?: string;
177
+ createInterval?: typeof setInterval;
178
+ }
179
+
180
+ export abstract class AbstractAppender
181
+ {
182
+ constructor(options?: IAbstractAppenderOptions);
183
+ /**
184
+ * format the entry and return the field list
185
+ *
186
+ * @param entry the log entry
187
+ * @param thisArg - use this to override the base object
188
+ *
189
+ * @returns field array
190
+ */
191
+ formatEntry(entry: any, thisArg?: AbstractAppender): string[];
192
+
193
+ /**
194
+ * format the message
195
+ *
196
+ * @param msg the log message
197
+ * @param thisArg - use this to override the base object
198
+ *
199
+ * @returns field array
200
+ */
201
+ formatMessage(msg: any | any[], thisArg?: AbstractAppender): string;
202
+
203
+ formatDate(value: Date): string;
204
+ formatObject(value: any): string;
205
+ formatLevel(level: STANDARD_LEVELS): string;
206
+ formatTimestamp(ts: moment.MomentInput): string;
207
+ getTypeName(): string;
208
+
209
+ //formatter(entry: any): string;
210
+ abstract write(entry: IEntry): void;
211
+ abstract setLevel(level: STANDARD_LEVELS): void;
212
+
213
+ __protected(): any;
214
+ }
215
+
216
+ //export type IConsoleAppenderOptions = appenders.IConsoleAppenderOptions;
217
+ //export type IFileAppenderOptions = appenders.IFileAppenderOptions;
218
+ //export type IRollingFileAppenderOptions = appenders.IRollingFileAppenderOptions;
219
+
220
+ export namespace appenders
221
+ {
222
+
223
+
224
+ export class ConsoleAppender extends AbstractAppender
225
+ {
226
+ constructor(options: IAbstractAppenderOptions & IConsoleAppenderOptions);
227
+ formatter(entry: IEntry): string;
228
+ write(entry: IEntry): void;
229
+ setLevel(level: STANDARD_LEVELS): void;
230
+ }
231
+
232
+
233
+ export class FileAppender extends AbstractAppender
234
+ {
235
+ constructor(options?: IFileAppenderOptions);
236
+ formatter(entry: IEntry): string;
237
+ write(entry: IEntry): void;
238
+ setLevel(level: STANDARD_LEVELS): void;
239
+ }
240
+
241
+
242
+ export class RollingFileAppender extends AbstractAppender
243
+ {
244
+ constructor(options?: IRollingFileAppenderOptions);
245
+ formatter(entry: IEntry): string;
246
+ write(entry: IEntry): void;
247
+ setLevel(level: STANDARD_LEVELS): void;
248
+
249
+ checkForRoll(now?: moment.Moment): boolean;
250
+ createFileName(now?: moment.Moment): string;
251
+ }
252
+ }
253
+
254
+
255
+ /**
256
+ * static convenience method to create a file logger (no console logging);
257
+ *
258
+ * @param options - if string then it's the logFilePath, else options with the logFilePath
259
+ * @returns Logger
260
+ */
261
+ export function createSimpleLogger(): Logger;
262
+ export function createPrepareLogger(): PrepareLogger;
263
+ export function createSimpleLogger(logFilePath: string): Logger;
264
+ export function createSimpleLogger(options: ISimpleLoggerOptions &
265
+ Partial<IConsoleAppenderOptions> &
266
+ Partial<IFileAppenderOptions>): Logger;
267
+
268
+ /**
269
+ * create a rolling file logger by passing options to SimpleLogger and Logger. this enables setting
270
+ * of domain, category, etc.
271
+ *
272
+ * @param options
273
+ * @returns rolling logger
274
+ */
275
+ export function createSimpleFileLogger(logFilePath: string): Logger;
276
+ export function createSimpleFileLogger(options: ISimpleLoggerOptions &
277
+ IFileAppenderOptions): Logger;
278
+
279
+ /**
280
+ * create a rolling file appender and add it to the appender list
281
+ *
282
+ * @param options
283
+ * @returns the appender
284
+ */
285
+ export function createRollingFileLogger(options: ISimpleLoggerOptions &
286
+ IRollingFileAppenderOptions &
287
+ { readLoggerConfig?: Function }): Logger;
288
+
289
+ /**
290
+ * create a log manager
291
+ *
292
+ * @param options - file or rolling file specs;
293
+ */
294
+ export function createLogManager(options?: ISimpleLoggerOptions &
295
+ Partial<IRollingFileAppenderOptions> &
296
+ Partial<IConsoleAppenderOptions> &
297
+ { readLoggerConfig?: Function }): SimpleLogger;
298
+ }
299
+
300
+ export = SimpleLogger;
301
+
302
+
303
+
304
+
package/index.js ADDED
@@ -0,0 +1,19 @@
1
+
2
+ /** darryl.west@raincitysoftware.com **/
3
+
4
+ module.exports = require('./lib/SimpleLogger');
5
+ module.exports.AbstractAppender = require('./lib/AbstractAppender');
6
+ module.exports.Logger = require('./lib/Logger');
7
+ module.exports.PrepareLogger = require('./lib/PrepareLogger');
8
+
9
+ module.exports.appenders = {
10
+ ConsoleAppender:require('./lib/ConsoleAppender'),
11
+ FileAppender:require('./lib/FileAppender'),
12
+ RollingFileAppender:require('./lib/RollingFileAppender')
13
+ };
14
+
15
+ module.exports.mocks = {
16
+ MockAppender:require('./test/mocks/MockAppender'),
17
+ MockLogger:require('./test/mocks/MockLogger')
18
+ };
19
+
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @class AbstractAppender
3
+ *
4
+ * @author: darryl.west@raincitysoftware.com
5
+ * @created: 7/7/14 5:58 PM
6
+ */
7
+ const util = require( 'util' );
8
+ const moment = require( 'moment' );
9
+ const dash = require( 'lodash' );
10
+
11
+ const AbstractAppender = function(options) {
12
+ 'use strict';
13
+
14
+ const appender = this;
15
+ const typeName = options.typeName;
16
+ const timestampFormat = options.timestampFormat || 'HH:mm:ss.SSS';
17
+ const prettyPrint = options.prettyPrint;
18
+
19
+ this.separator = options.separator || ' ';
20
+
21
+ /**
22
+ * format the entry and return the field list
23
+ *
24
+ * @param entry the log entry
25
+ * @param thisArg - use this to override the base object
26
+ *
27
+ * @returns field array
28
+ */
29
+ this.formatEntry = function(entry, thisArg) {
30
+ const apdr = thisArg || appender;
31
+
32
+ const fields = [];
33
+
34
+ if (entry.domain) {
35
+ fields.push( entry.domain );
36
+ }
37
+
38
+ fields.push( apdr.formatTimestamp( entry.ts ) );
39
+ fields.push( apdr.formatLevel( entry.level ) );
40
+
41
+ if (entry.category) {
42
+ fields.push( entry.category );
43
+ }
44
+
45
+ fields.push( apdr.formatMessage( entry.msg ) );
46
+
47
+ return fields;
48
+ };
49
+
50
+ /**
51
+ * format the message
52
+ *
53
+ * @param msg the log message
54
+ * @param thisArg - use this to override the base object
55
+ *
56
+ * @returns field array
57
+ */
58
+ this.formatMessage = function(msg, thisArg) {
59
+ const apdr = thisArg || appender;
60
+
61
+ if (!msg) {
62
+ return '';
63
+ }
64
+
65
+ if (util.isArray( msg )) {
66
+ const list = msg.map(function(item) {
67
+ if (util.isDate( item )) {
68
+ return apdr.formatDate( item );
69
+ } else {
70
+ return apdr.formatObject( item );
71
+ }
72
+ });
73
+
74
+ return list.join('');
75
+ } else {
76
+ return msg;
77
+ }
78
+ };
79
+
80
+ this.formatDate = function(value) {
81
+ return value.toJSON();
82
+ };
83
+
84
+ this.formatObject = function(value) {
85
+ if (!value) {
86
+ return '';
87
+ }
88
+
89
+ if (dash.isObject( value )) {
90
+ try {
91
+ if (value instanceof Error) {
92
+ return [
93
+ value.message,
94
+ (prettyPrint) ? JSON.stringify( value, null, 2) : JSON.stringify( value ),
95
+ value.stack
96
+ ].join('\n');
97
+ }
98
+
99
+ return (prettyPrint) ? JSON.stringify( value, null, 2) : JSON.stringify( value );
100
+ } catch (ignore) {
101
+ return 'json error: ' + value.toString();
102
+ }
103
+ } else {
104
+ var s = value.toString();
105
+ if (s === '[object Object]') {
106
+ return util.inspect( value );
107
+ } else {
108
+ return s;
109
+ }
110
+ }
111
+ };
112
+
113
+ /**
114
+ * format the level string by forcing to upper case and padding to 5 chars
115
+ *
116
+ * @param level
117
+ * @returns {string}
118
+ */
119
+ this.formatLevel = function(level) {
120
+ let str = level.toUpperCase();
121
+ if (str.length < 5) {
122
+ str += ' ';
123
+ }
124
+
125
+ return str;
126
+ };
127
+
128
+ /**
129
+ * format the timestamp to HH:mm:ss.SSS
130
+ *
131
+ * @param ts the unix milliseconds
132
+ * @returns formatted string
133
+ */
134
+ this.formatTimestamp = function(ts) {
135
+ return moment( ts ).format( timestampFormat );
136
+ };
137
+
138
+ /**
139
+ * return the type name of this appender (ConsoleAppender)
140
+ */
141
+ this.getTypeName = function() {
142
+ return typeName;
143
+ };
144
+
145
+ // constructor tests
146
+ if (!typeName) {
147
+ throw new Error('appender must be constructed with a type name');
148
+ }
149
+ };
150
+
151
+ module.exports = AbstractAppender;
152
+
153
+ AbstractAppender.extend = function(child, options) {
154
+ 'use strict';
155
+
156
+ const parent = new AbstractAppender( options );
157
+
158
+ dash.extend( child, parent );
159
+
160
+ return parent;
161
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @class ConsoleAppender
3
+ * @classdesc ConsoleAppender writes to the console all entries at or above the specified level.
4
+ *
5
+ * @author: darryl.west@raincitysoftware.com
6
+ * @created: 7/6/14 12:02 PM
7
+ */
8
+ const Logger = require('./Logger' );
9
+ const AbstractAppender = require('./AbstractAppender' );
10
+
11
+ /*eslint no-console: "off"*/
12
+ const ConsoleAppender = function(opts) {
13
+ 'use strict';
14
+
15
+ // get a copy of the opts
16
+ const options = Object.assign({}, opts);
17
+
18
+ const appender = this;
19
+ const typeName = options.typeName || 'ConsoleAppender';
20
+ const writer = options.writer || console.log;
21
+
22
+ let level = options.level || Logger.STANDARD_LEVELS[0];
23
+ let levels = options.levels || Logger.STANDARD_LEVELS;
24
+ let currentLevel = levels.indexOf( level );
25
+
26
+ options.typeName = typeName;
27
+ AbstractAppender.extend( this, options );
28
+
29
+ /**
30
+ * default formatter for this appender;
31
+ * @param entry
32
+ */
33
+ this.formatter = function(entry) {
34
+ const fields = appender.formatEntry( entry );
35
+
36
+ return fields.join( appender.separator );
37
+ };
38
+
39
+ /**
40
+ * call formatter then write the entry to the console output
41
+ * @param entry - the log entry
42
+ */
43
+ this.write = function(entry) {
44
+ if (levels.indexOf( entry.level ) >= currentLevel) {
45
+ writer( appender.formatter( entry ));
46
+ }
47
+ };
48
+
49
+ this.setLevel = function(level) {
50
+ const idx = levels.indexOf( level );
51
+ if (idx >= 0) {
52
+ currentLevel = idx;
53
+ }
54
+ };
55
+ };
56
+
57
+ module.exports = ConsoleAppender;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @class FileAppender
3
+ *
4
+ * @author: darryl.west@raincitysoftware.com
5
+ * @created: 7/7/14 5:15 PM
6
+ */
7
+ const Logger = require('./Logger' );
8
+ const AbstractAppender = require('./AbstractAppender' );
9
+ const dash = require( 'lodash' );
10
+ const path = require( 'path' );
11
+
12
+ const FileAppender = function(options) {
13
+ 'use strict';
14
+
15
+ const appender = this;
16
+ const fs = options.fs || require( 'fs' );
17
+ const newline = /^win/.test(process.platform) ? '\r\n' : '\n';
18
+ const typeName = options.typeName || 'FileAppender';
19
+ const autoOpen = dash.isBoolean( options.autoOpen ) ? options.autoOpen : true;
20
+ const levels = options.levels || Logger.STANDARD_LEVELS;
21
+
22
+ let level = options.level || Logger.DEFAULT_LEVEL;
23
+ let currentLevel = levels.indexOf( level );
24
+ let logFilePath = options.logFilePath;
25
+ let writer = options.writer;
26
+
27
+ options.typeName = typeName;
28
+ AbstractAppender.extend( this, options );
29
+
30
+ /**
31
+ * default formatter for this appender;
32
+ * @param entry
33
+ */
34
+ this.formatter = function(entry) {
35
+ const fields = appender.formatEntry( entry );
36
+
37
+ // add new line (for linux and windows)
38
+ fields.push( newline );
39
+
40
+ return fields.join( appender.separator );
41
+ };
42
+
43
+ /**
44
+ * call formatter then write the entry to the console output
45
+ * @param entry - the log entry
46
+ */
47
+ this.write = function(entry) {
48
+ if (levels.indexOf( entry.level ) >= currentLevel) {
49
+ writer.write( appender.formatter( entry ) );
50
+ }
51
+ };
52
+
53
+ this.setLevel = function(level) {
54
+ const idx = levels.indexOf( level );
55
+ if (idx >= 0) {
56
+ currentLevel = idx;
57
+ }
58
+ };
59
+
60
+ // writer is opened on construction
61
+ const openWriter = function() {
62
+ if (!writer) {
63
+ const file = path.normalize( logFilePath );
64
+ const opts = {
65
+ flags:'a',
66
+ encoding:'utf8'
67
+ };
68
+
69
+ writer = fs.createWriteStream( file, opts );
70
+ }
71
+ };
72
+
73
+ this.closeWriter = function() {
74
+ if (writer) {
75
+ writer.end('\n');
76
+ }
77
+ };
78
+
79
+ // constructor tests
80
+ (function() {
81
+ if (!logFilePath) {
82
+ throw new Error('appender must be constructed with a log file path');
83
+ }
84
+ }());
85
+
86
+ if (autoOpen) {
87
+ openWriter();
88
+ }
89
+ };
90
+
91
+ module.exports = FileAppender;