UNPKG

7.67 kBJavaScriptView Raw
1// Copyright (c) 2015 Uber Technologies, Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20
21'use strict';
22
23var test = require('tape');
24var path = require('path');
25var os = require('os');
26var uuid = require('uuid');
27var dateFormat = require('date-format');
28var fs = require('fs');
29var rimraf = require('rimraf');
30var SentryServer = require(
31 'sentry-logger/test/lib/sentry-server.js');
32var KafkaServer = require('./lib/kafka-rest-server.js');
33
34var defaultLevels = require('../default-levels.js');
35var captureStdio = require('./lib/capture-stdio.js');
36var Logger = require('../index.js');
37
38test('Logger is a function', function t(assert) {
39 assert.equal(typeof Logger, 'function');
40
41 assert.end();
42});
43
44test('has defaultBackends method', function t(assert) {
45 assert.equal(typeof Logger.defaultBackends, 'function');
46
47 assert.end();
48});
49
50test('empty defaultBackends', function t(assert) {
51 var backends = Logger.defaultBackends();
52
53 assert.deepEqual(Object.keys(backends), [
54 '_isDefaultBackends',
55 'file',
56 'disk',
57 'kafka',
58 'console',
59 'sentry',
60 'access'
61 ]);
62 assert.equal(backends._isDefaultBackends, true);
63 assert.equal(backends.disk, null);
64 assert.equal(backends.kafka, null);
65 assert.equal(backends.console, null);
66 assert.equal(backends.sentry, null);
67 assert.equal(backends.access, null);
68
69 assert.end();
70});
71
72test('logger without backends', function t(assert) {
73 assert.throws(function throwIt() {
74 Logger();
75 }, /Must call Logger with opts argument/);
76
77 assert.end();
78});
79
80test('console logging without defaultBackends', function t(assert) {
81 var logger = Logger({
82 meta: {},
83 backends: {
84 console: Logger.Console()
85 }
86 });
87
88 assert.ok(logger);
89
90 assert.ok(captureStdio('info: hello foo=bar', function log() {
91 logger.info('hello', { foo: 'bar' });
92 }));
93
94 logger.destroy();
95 assert.end();
96});
97
98test('console logging', function t(assert) {
99 var logger = Logger({
100 meta: {},
101 backends: Logger.defaultBackends({
102 console: true
103 })
104 });
105
106 assert.ok(logger);
107
108 assert.ok(captureStdio('info: hello foo=bar', function log() {
109 logger.info('hello', { foo: 'bar' });
110 }));
111
112 logger.destroy();
113 assert.end();
114});
115
116test('disk logging', function t(assert) {
117 var loc = path.join(os.tmpDir(), uuid());
118
119 var logger = Logger({
120 meta: { team: 'rt', project: 'foo' },
121 backends: Logger.defaultBackends({
122 logFolder: loc
123 })
124 });
125
126 var fileUri = 'rt-foo.log-' + dateFormat('yyyyMMdd');
127
128 logger.info('some message', {
129 some: 'object'
130 }, onLogged);
131
132 function onLogged(err) {
133 assert.ifError(err);
134
135 fs.readdir(loc, onDir);
136 }
137
138 function onDir(err, files) {
139 assert.ifError(err);
140
141 assert.deepEqual(files, [fileUri]);
142
143 fs.readFile(path.join(loc, fileUri), onFile);
144 }
145
146 function onFile(err, buf) {
147 assert.ifError(err);
148
149 buf = String(buf);
150 assert.ok(buf.indexOf('some message') !== -1);
151 assert.ok(buf.indexOf('some=object') !== -1);
152
153 rimraf(loc, assert.end);
154 }
155});
156
157test('access logging', function t(assert) {
158 var loc = path.join(os.tmpDir(), uuid());
159
160 var logger = Logger({
161 meta: { team: 'rt', project: 'foo' },
162 backends: Logger.defaultBackends({
163 console: true,
164 access: { logFolder: loc }
165 })
166 });
167
168 assert.ok(captureStdio('info: hello foo=bar', function log() {
169 logger.info('hello', { foo: 'bar' });
170 }));
171
172 assert.ok(captureStdio('access: line one fooOne=bar',
173 function log() {
174 logger.access('line one', { fooOne: 'bar' });
175 }));
176
177 var fileUri = 'rt-foo.log-' + dateFormat('yyyyMMdd');
178
179 assert.ok(captureStdio('access: line two', function log() {
180 logger.access('line two', { fooTwo: 'bar'}, onLogged);
181 }));
182
183 function onLogged(err) {
184 assert.ifError(err);
185
186 fs.readdir(loc, onDir);
187 }
188
189 function onDir(err, files) {
190 assert.ifError(err);
191
192 assert.deepEqual(files, [fileUri]);
193
194 fs.readFile(path.join(loc, fileUri), onFile);
195 }
196
197 function onFile(err, buf) {
198 assert.ifError(err);
199
200 buf = String(buf);
201 assert.ok(buf.indexOf('access: line one') !== -1);
202 assert.ok(buf.indexOf('fooOne=bar') !== -1);
203
204 assert.ok(buf.indexOf('access: line two') !== -1);
205 assert.ok(buf.indexOf('fooTwo=bar') !== -1);
206
207 assert.ok(buf.indexOf('info: hello') === -1);
208 assert.ok(buf.indexOf('foo=bar') === -1);
209
210 rimraf(loc, assert.end);
211 }
212});
213
214test('sentry logging', function t(assert) {
215 var messages = [];
216 var server = SentryServer(function listener(arg) {
217 messages.push(arg);
218
219 if (messages.length === 1) {
220 onLogged();
221 }
222 });
223
224 var logger = Logger({
225 meta: {},
226 backends: Logger.defaultBackends({
227 sentry: { id: server.dsn }
228 })
229 });
230
231 logger.info('hello');
232 logger.error('sad');
233
234 function onLogged() {
235 assert.equal(messages.length, 1);
236 var message = messages[0];
237
238 assert.equal(message.message, 'default-backends.js: sad');
239 assert.equal(typeof message.extra.stack, 'string');
240
241 server.close();
242 assert.end();
243 }
244});
245
246test('kafka logging', function t(assert) {
247 var messages = [];
248 var server = KafkaServer(function listener(err, msg) {
249 assert.ifError(err, 'no unexpected server error');
250
251 messages.push(msg);
252
253 if (messages.length === 2) {
254 onLogged();
255 }
256 });
257
258 var logger = Logger({
259 meta: {
260 team: 'rt',
261 project: 'foo'
262 },
263 backends: Logger.defaultBackends({
264 kafka: {
265 proxyHost: 'localhost',
266 batching: false,
267 proxyPort: server.port
268 }
269 })
270 });
271
272 logger.info('hello', {});
273 logger.info('hi', {});
274
275 function onLogged() {
276 var message = messages[0];
277
278 assert.equal(message.topic, 'rt-foo');
279 assert.equal(messages.length, 2);
280
281 var payload = message.messages[0].payload;
282
283 assert.equal(payload.level, 'info');
284 assert.equal(payload.msg, 'hello');
285
286 logger.destroy();
287 server.close();
288 assert.end();
289 }
290});
291
292test('default levels have not been altered', function t(assert) {
293 assert.ok(!('transforms' in defaultLevels.trace));
294 assert.end();
295});