1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
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 |
|
18 | this.separator = options.separator || ' ';
|
19 |
|
20 | |
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 | this.formatEntry = function(entry, thisArg) {
|
29 | const apdr = thisArg || appender;
|
30 |
|
31 | const fields = [];
|
32 |
|
33 | if (entry.domain) {
|
34 | fields.push( entry.domain );
|
35 | }
|
36 |
|
37 | fields.push( apdr.formatTimestamp( entry.ts ) );
|
38 | fields.push( apdr.formatLevel( entry.level ) );
|
39 |
|
40 | if (entry.category) {
|
41 | fields.push( entry.category );
|
42 | }
|
43 |
|
44 | fields.push( apdr.formatMessage( entry.msg ) );
|
45 |
|
46 | return fields;
|
47 | };
|
48 |
|
49 | |
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | this.formatMessage = function(msg, thisArg) {
|
58 | const apdr = thisArg || appender;
|
59 |
|
60 | if (!msg) {
|
61 | return '';
|
62 | }
|
63 |
|
64 | if (util.isArray( msg )) {
|
65 | const list = msg.map(function(item) {
|
66 | if (util.isDate( item )) {
|
67 | return apdr.formatDate( item );
|
68 | } else {
|
69 | return apdr.formatObject( item );
|
70 | }
|
71 | });
|
72 |
|
73 | return list.join('');
|
74 | } else {
|
75 | return msg;
|
76 | }
|
77 | };
|
78 |
|
79 | this.formatDate = function(value) {
|
80 | return value.toJSON();
|
81 | };
|
82 |
|
83 | this.formatObject = function(value) {
|
84 | if (!value) {
|
85 | return '';
|
86 | }
|
87 |
|
88 | if (dash.isObject( value )) {
|
89 | if (value instanceof Error) {
|
90 | return [ value.message, value.stack ].join('\n');
|
91 | }
|
92 | try {
|
93 | return JSON.stringify( value );
|
94 | } catch (ignore) {
|
95 | return 'json error: ' + value.toString();
|
96 | }
|
97 | } else {
|
98 | var s = value.toString();
|
99 | if (s === '[object Object]') {
|
100 | return util.inspect( value );
|
101 | } else {
|
102 | return s;
|
103 | }
|
104 | }
|
105 | };
|
106 |
|
107 | |
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 | this.formatLevel = function(level) {
|
114 | let str = level.toUpperCase();
|
115 | if (str.length < 5) {
|
116 | str += ' ';
|
117 | }
|
118 |
|
119 | return str;
|
120 | };
|
121 |
|
122 | |
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 | this.formatTimestamp = function(ts) {
|
129 | return moment( ts ).format( timestampFormat );
|
130 | };
|
131 |
|
132 | |
133 |
|
134 |
|
135 | this.getTypeName = function() {
|
136 | return typeName;
|
137 | };
|
138 |
|
139 |
|
140 | if (!typeName) {
|
141 | throw new Error('appender must be constructed with a type name');
|
142 | }
|
143 | };
|
144 |
|
145 | module.exports = AbstractAppender;
|
146 |
|
147 | AbstractAppender.extend = function(child, options) {
|
148 | 'use strict';
|
149 |
|
150 | const parent = new AbstractAppender( options );
|
151 |
|
152 | dash.extend( child, parent );
|
153 |
|
154 | return parent;
|
155 | };
|