struct-logger 0.0.1-security → 1.0.8

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,296 @@
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 AbstractAppender = SimpleLogger.AbstractAppender;
16
+ type ISimpleLoggerOptions = SimpleLogger.ISimpleLoggerOptions;
17
+ declare class SimpleLogger
18
+ {
19
+ constructor(opts?: ISimpleLoggerOptions);
20
+ createLogger(options?: SimpleLogger.ILoggerOptions): Logger;
21
+ createLogger(category?: string, level?: STANDARD_LEVELS): Logger;
22
+ createConsoleAppender(opts?: IConsoleAppenderOptions): ConsoleAppender;
23
+ createFileAppender(opts?: IFileAppenderOptions): FileAppender;
24
+ createRollingFileAppender(opts?: IRollingFileAppenderOptions): RollingFileAppender;
25
+ addAppender<T extends AbstractAppender>(appender: AbstractAppender): T;
26
+ getAppenders(): AbstractAppender[];
27
+ getLoggers(): Logger[];
28
+ startRefreshThread(): void;
29
+ setAllLoggerLevels(level: STANDARD_LEVELS): void;
30
+ readConfig(completeCallback?: (err?: any) => void): void;
31
+ }
32
+
33
+
34
+
35
+ declare namespace SimpleLogger
36
+ {
37
+ export type STANDARD_LEVELS = 'all' | 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
38
+ interface IEntry
39
+ {
40
+ ts: moment.MomentInput;
41
+ pid: number;
42
+ domain?: string;
43
+ category?: string;
44
+ level: STANDARD_LEVELS;
45
+ msg: any | any[];
46
+ }
47
+ interface ISimpleLoggerOptions
48
+ {
49
+ domain?: string;
50
+ loggers?: Logger[];
51
+ level?: STANDARD_LEVELS;
52
+ loggerConfigFile?: string;
53
+ refresh?: number;
54
+ fs?: any;
55
+ createInterval?: typeof setInterval;
56
+ minRefresh?: number;
57
+ errorEventName?: string;
58
+ }
59
+ export interface ILoggerOptions
60
+ {
61
+ pid?: number;
62
+ errorEventName?: string;
63
+ domain?: string;
64
+ category?: string;
65
+ level?: STANDARD_LEVELS;
66
+ levels?: STANDARD_LEVELS[];
67
+ appenders?: AbstractAppender[]
68
+ }
69
+ export namespace Logger
70
+ {
71
+ var STANDARD_LEVELS: STANDARD_LEVELS[];
72
+ var DEFAULT_LEVEL: STANDARD_LEVELS;
73
+ }
74
+ export class Logger
75
+ {
76
+
77
+ constructor(options?: ILoggerOptions);
78
+ /**
79
+ * log the statement message
80
+ *
81
+ * @param level the level of this message (label, i.e, info, warn, etc)
82
+ * @param msg
83
+ */
84
+ log(level: STANDARD_LEVELS, msg: any[] | any): void;
85
+
86
+ /**
87
+ * set the level
88
+ *
89
+ * @param lvl one of the recognized logger levels
90
+ */
91
+ setLevel(lvl: STANDARD_LEVELS): void;
92
+
93
+ /**
94
+ * return the current level string
95
+ */
96
+ getLevel(): STANDARD_LEVELS;
97
+
98
+ /**
99
+ * set the list of appenders
100
+ * @param appenderList
101
+ */
102
+ setAppenders(appenderList: AbstractAppender[]): void;
103
+
104
+ /**
105
+ * add an appender to the list
106
+ *
107
+ * @param appender - implements write method
108
+ */
109
+ addAppender<T extends AbstractAppender>(appender: T): T;
110
+
111
+ /**
112
+ * remove the appender using the type name
113
+ */
114
+ removeAppender(typeName: string): void;
115
+
116
+
117
+ getAppenders(): AbstractAppender[];
118
+ isDebug(): boolean;
119
+ isInfo(): boolean;
120
+
121
+ /**
122
+ * return the status map with log counts for each level
123
+ */
124
+ getStats(): Map<STANDARD_LEVELS, number>;
125
+
126
+ getCategory(): string | undefined;
127
+
128
+ getDomain(): string | undefined;
129
+
130
+ all(...arr: any[]): void;
131
+ trace(...arr: any[]): void;
132
+ debug(...arr: any[]): void;
133
+ info(...arr: any[]): void;
134
+ warn(...arr: any[]): void;
135
+ error(...arr: any[]): void;
136
+ fatal(...arr: any[]): void;
137
+ }
138
+
139
+ export interface IAbstractAppenderOptions
140
+ {
141
+ typeName?: string;
142
+ timestampFormat?: string;
143
+ prettyPrint?: boolean;
144
+ separator?: string;
145
+ level?: STANDARD_LEVELS;
146
+ levels?: STANDARD_LEVELS[];
147
+ }
148
+ export interface IConsoleAppenderOptions extends IAbstractAppenderOptions
149
+ {
150
+ typeName?: string;
151
+ writer?: Function;
152
+ }
153
+ export interface IFileAppenderOptions extends IAbstractAppenderOptions
154
+ {
155
+ typeName?: string;
156
+ fs?: any;
157
+ autoOpen?: boolean;
158
+ logFilePath: string;
159
+ writer?: any;
160
+ }
161
+ export interface IRollingFileAppenderOptions extends IAbstractAppenderOptions
162
+ {
163
+ typeName?: string;
164
+ fs?: any;
165
+ autoOpen?: boolean;
166
+ logDirectory: string;
167
+ fileNamePattern: string;
168
+ dateFormat?: string;
169
+ currentFile?: string;
170
+ createInterval?: typeof setInterval;
171
+ }
172
+
173
+ export abstract class AbstractAppender
174
+ {
175
+ constructor(options?: IAbstractAppenderOptions);
176
+ /**
177
+ * format the entry and return the field list
178
+ *
179
+ * @param entry the log entry
180
+ * @param thisArg - use this to override the base object
181
+ *
182
+ * @returns field array
183
+ */
184
+ formatEntry(entry: any, thisArg?: AbstractAppender): string[];
185
+
186
+ /**
187
+ * format the message
188
+ *
189
+ * @param msg the log message
190
+ * @param thisArg - use this to override the base object
191
+ *
192
+ * @returns field array
193
+ */
194
+ formatMessage(msg: any | any[], thisArg?: AbstractAppender): string;
195
+
196
+ formatDate(value: Date): string;
197
+ formatObject(value: any): string;
198
+ formatLevel(level: STANDARD_LEVELS): string;
199
+ formatTimestamp(ts: moment.MomentInput): string;
200
+ getTypeName(): string;
201
+
202
+ //formatter(entry: any): string;
203
+ abstract write(entry: IEntry): void;
204
+ abstract setLevel(level: STANDARD_LEVELS): void;
205
+
206
+ __protected(): any;
207
+ }
208
+
209
+ //export type IConsoleAppenderOptions = appenders.IConsoleAppenderOptions;
210
+ //export type IFileAppenderOptions = appenders.IFileAppenderOptions;
211
+ //export type IRollingFileAppenderOptions = appenders.IRollingFileAppenderOptions;
212
+
213
+ export namespace appenders
214
+ {
215
+
216
+
217
+ export class ConsoleAppender extends AbstractAppender
218
+ {
219
+ constructor(options: IAbstractAppenderOptions & IConsoleAppenderOptions);
220
+ formatter(entry: IEntry): string;
221
+ write(entry: IEntry): void;
222
+ setLevel(level: STANDARD_LEVELS): void;
223
+ }
224
+
225
+
226
+ export class FileAppender extends AbstractAppender
227
+ {
228
+ constructor(options?: IFileAppenderOptions);
229
+ formatter(entry: IEntry): string;
230
+ write(entry: IEntry): void;
231
+ setLevel(level: STANDARD_LEVELS): void;
232
+ }
233
+
234
+
235
+ export class RollingFileAppender extends AbstractAppender
236
+ {
237
+ constructor(options?: IRollingFileAppenderOptions);
238
+ formatter(entry: IEntry): string;
239
+ write(entry: IEntry): void;
240
+ setLevel(level: STANDARD_LEVELS): void;
241
+
242
+ checkForRoll(now?: moment.Moment): boolean;
243
+ createFileName(now?: moment.Moment): string;
244
+ }
245
+ }
246
+
247
+
248
+ /**
249
+ * static convenience method to create a file logger (no console logging);
250
+ *
251
+ * @param options - if string then it's the logFilePath, else options with the logFilePath
252
+ * @returns Logger
253
+ */
254
+ export function createSimpleLogger(): Logger;
255
+ export function createSimpleLogger(logFilePath: string): Logger;
256
+ export function createSimpleLogger(options: ISimpleLoggerOptions &
257
+ Partial<IConsoleAppenderOptions> &
258
+ Partial<IFileAppenderOptions>): Logger;
259
+
260
+ /**
261
+ * create a rolling file logger by passing options to SimpleLogger and Logger. this enables setting
262
+ * of domain, category, etc.
263
+ *
264
+ * @param options
265
+ * @returns rolling logger
266
+ */
267
+ export function createSimpleFileLogger(logFilePath: string): Logger;
268
+ export function createSimpleFileLogger(options: ISimpleLoggerOptions &
269
+ IFileAppenderOptions): Logger;
270
+
271
+ /**
272
+ * create a rolling file appender and add it to the appender list
273
+ *
274
+ * @param options
275
+ * @returns the appender
276
+ */
277
+ export function createRollingFileLogger(options: ISimpleLoggerOptions &
278
+ IRollingFileAppenderOptions &
279
+ { readLoggerConfig?: Function }): Logger;
280
+
281
+ /**
282
+ * create a log manager
283
+ *
284
+ * @param options - file or rolling file specs;
285
+ */
286
+ export function createLogManager(options?: ISimpleLoggerOptions &
287
+ Partial<IRollingFileAppenderOptions> &
288
+ Partial<IConsoleAppenderOptions> &
289
+ { readLoggerConfig?: Function }): SimpleLogger;
290
+ }
291
+
292
+ export = SimpleLogger;
293
+
294
+
295
+
296
+
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;