Skip to content

Commit fa736f1

Browse files
Arthur Cinaderflovilmart
authored andcommitted
Allow logger to add transports (#2363)
- Move all of the winston logic from FileLoggerAdapter to WinstonLoggerAdapter - Export WinstonLoggerAdapter so it can be sublcassed - Expost the ability to add adittional transports to logger - Import FirehoseLoggerAdapter alongside other adapters so it can be configured.
1 parent 36891f4 commit fa736f1

10 files changed

+79
-58
lines changed

spec/CloudCodeLogger.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
'use strict';
22
var LoggerController = require('../src/Controllers/LoggerController').LoggerController;
3-
var FileLoggerAdapter = require('../src/Adapters/Logger/FileLoggerAdapter').FileLoggerAdapter;
3+
var WinstonLoggerAdapter = require('../src/Adapters/Logger/WinstonLoggerAdapter').WinstonLoggerAdapter;
44

55
describe("Cloud Code Logger", () => {
66
it("should expose log to functions", (done) => {
7-
var logController = new LoggerController(new FileLoggerAdapter());
7+
var logController = new LoggerController(new WinstonLoggerAdapter());
88

99
Parse.Cloud.define("loggerTest", (req, res) => {
1010
req.log.info('logTest', 'info log', {info: 'some log' });
@@ -35,7 +35,7 @@ describe("Cloud Code Logger", () => {
3535
});
3636

3737
it("should expose log to trigger", (done) => {
38-
var logController = new LoggerController(new FileLoggerAdapter());
38+
var logController = new LoggerController(new WinstonLoggerAdapter());
3939

4040
Parse.Cloud.beforeSave("MyObject", (req, res) => {
4141
req.log.info('beforeSave MyObject', 'info log', {info: 'some log' });

spec/Logger.spec.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
var logger = require('../src/logger');
2+
var winston = require('winston');
3+
4+
class TestTransport extends winston.Transport {
5+
log(level, msg, meta, callback) {
6+
callback(null, true);
7+
}
8+
}
9+
10+
describe('Logger', () => {
11+
it('should add transport', () => {
12+
const testTransport = new (TestTransport)({});
13+
spyOn(testTransport, 'log');
14+
logger.addTransport(testTransport);
15+
logger.logger.info('hi');
16+
expect(testTransport.log).toHaveBeenCalled();
17+
});
18+
});

spec/LoggerController.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
var LoggerController = require('../src/Controllers/LoggerController').LoggerController;
2-
var FileLoggerAdapter = require('../src/Adapters/Logger/FileLoggerAdapter').FileLoggerAdapter;
2+
var WinstonLoggerAdapter = require('../src/Adapters/Logger/WinstonLoggerAdapter').WinstonLoggerAdapter;
33

44
describe('LoggerController', () => {
55
it('can check process a query without throwing', (done) => {
66
// Make mock request
77
var query = {};
88

9-
var loggerController = new LoggerController(new FileLoggerAdapter());
9+
var loggerController = new LoggerController(new WinstonLoggerAdapter());
1010

1111
expect(() => {
1212
loggerController.getLogs(query).then(function(res) {
@@ -69,7 +69,7 @@ describe('LoggerController', () => {
6969
level: 'error'
7070
};
7171

72-
var loggerController = new LoggerController(new FileLoggerAdapter());
72+
var loggerController = new LoggerController(new WinstonLoggerAdapter());
7373

7474
expect(() => {
7575
loggerController.getLogs(query).then(function(res) {

spec/LogsRouter.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
const request = require('request');
44
var LogsRouter = require('../src/Routers/LogsRouter').LogsRouter;
55
var LoggerController = require('../src/Controllers/LoggerController').LoggerController;
6-
var FileLoggerAdapter = require('../src/Adapters/Logger/FileLoggerAdapter').FileLoggerAdapter;
6+
var WinstonLoggerAdapter = require('../src/Adapters/Logger/WinstonLoggerAdapter').WinstonLoggerAdapter;
77

8-
const loggerController = new LoggerController(new FileLoggerAdapter());
8+
const loggerController = new LoggerController(new WinstonLoggerAdapter());
99

1010
describe('LogsRouter', () => {
1111
it('can check valid master key of request', (done) => {

spec/FileLoggerAdapter.spec.js renamed to spec/WinstonLoggerAdapter.spec.js

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
'use strict';
22

3-
var FileLoggerAdapter = require('../src/Adapters/Logger/FileLoggerAdapter').FileLoggerAdapter;
3+
var WinstonLoggerAdapter = require('../src/Adapters/Logger/WinstonLoggerAdapter').WinstonLoggerAdapter;
44
var Parse = require('parse/node').Parse;
55
var request = require('request');
66

77
describe('info logs', () => {
8+
89
it("Verify INFO logs", (done) => {
9-
var fileLoggerAdapter = new FileLoggerAdapter();
10-
fileLoggerAdapter.info('testing info logs', () => {
11-
fileLoggerAdapter.query({
12-
from: new Date(Date.now() - 500),
13-
size: 100,
14-
level: 'info'
15-
}, (results) => {
16-
if(results.length == 0) {
17-
fail('The adapter should return non-empty results');
18-
done();
19-
} else {
20-
expect(results[0].message).toEqual('testing info logs');
21-
done();
22-
}
10+
var winstonLoggerAdapter = new WinstonLoggerAdapter();
11+
winstonLoggerAdapter.info('testing info logs', () => {
12+
winstonLoggerAdapter.query({
13+
from: new Date(Date.now() - 500),
14+
size: 100,
15+
level: 'info'
16+
}, (results) => {
17+
if (results.length == 0) {
18+
fail('The adapter should return non-empty results');
19+
done();
20+
} else {
21+
expect(results[0].message).toEqual('testing info logs');
22+
done();
23+
}
24+
});
2325
});
2426
});
25-
});
2627
});
2728

2829
describe('error logs', () => {
2930
it("Verify ERROR logs", (done) => {
30-
var fileLoggerAdapter = new FileLoggerAdapter();
31-
fileLoggerAdapter.error('testing error logs', () => {
32-
fileLoggerAdapter.query({
31+
var winstonLoggerAdapter = new WinstonLoggerAdapter();
32+
winstonLoggerAdapter.error('testing error logs', () => {
33+
winstonLoggerAdapter.query({
3334
from: new Date(Date.now() - 500),
3435
size: 100,
3536
level: 'error'
@@ -52,8 +53,8 @@ describe('verbose logs', () => {
5253
reconfigureServer({ verbose: true })
5354
.then(() => createTestUser())
5455
.then(() => {
55-
let fileLoggerAdapter = new FileLoggerAdapter();
56-
return fileLoggerAdapter.query({
56+
let winstonLoggerAdapter = new WinstonLoggerAdapter();
57+
return winstonLoggerAdapter.query({
5758
from: new Date(Date.now() - 500),
5859
size: 100,
5960
level: 'verbose'
@@ -71,8 +72,8 @@ describe('verbose logs', () => {
7172
headers: headers,
7273
url: 'http://localhost:8378/1/login?username=test&password=moon-y'
7374
}, (error, response, body) => {
74-
let fileLoggerAdapter = new FileLoggerAdapter();
75-
return fileLoggerAdapter.query({
75+
let winstonLoggerAdapter = new WinstonLoggerAdapter();
76+
return winstonLoggerAdapter.query({
7677
from: new Date(Date.now() - 500),
7778
size: 100,
7879
level: 'verbose'
@@ -93,8 +94,8 @@ describe('verbose logs', () => {
9394
let obj = new Parse.Object('users');
9495
obj.set('password', 'pw');
9596
obj.save().then(() => {
96-
let fileLoggerAdapter = new FileLoggerAdapter();
97-
return fileLoggerAdapter.query({
97+
let winstonLoggerAdapter = new WinstonLoggerAdapter();
98+
return winstonLoggerAdapter.query({
9899
from: new Date(Date.now() - 500),
99100
size: 100,
100101
level: 'verbose'

src/Adapters/Logger/LoggerAdapter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// * info(obj1 [, obj2, .., objN])
77
// * error(obj1 [, obj2, .., objN])
88
// * query(options, callback)
9-
// Default is FileLoggerAdapter.js
9+
// Default is WinstonLoggerAdapter.js
1010

1111
export class LoggerAdapter {
1212
info() {}

src/Adapters/Logger/FileLoggerAdapter.js renamed to src/Adapters/Logger/WinstonLoggerAdapter.js

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,9 @@
1-
// Logger
2-
//
3-
// Wrapper around Winston logging library with custom query
4-
//
5-
// expected log entry to be in the shape of:
6-
// {"level":"info","message":"Your Message","timestamp":"2016-02-04T05:59:27.412Z"}
7-
//
81
import { LoggerAdapter } from './LoggerAdapter';
9-
import { Parse } from 'parse/node';
10-
import { logger, configure } from '../../logger';
2+
import { logger, addTransport } from '../../logger';
113

124
const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000;
135
const CACHE_TIME = 1000 * 60;
146

15-
let LOGS_FOLDER = './logs/';
16-
17-
if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {
18-
LOGS_FOLDER = './test_logs/'
19-
}
20-
217
let currentDate = new Date();
228

239
let simpleCache = {
@@ -65,8 +51,7 @@ let _isValidLogEntry = (from, until, entry) => {
6551
: false
6652
};
6753

68-
export class FileLoggerAdapter extends LoggerAdapter {
69-
54+
export class WinstonLoggerAdapter extends LoggerAdapter {
7055
info() {
7156
return logger.info.apply(undefined, arguments);
7257
}
@@ -75,6 +60,13 @@ export class FileLoggerAdapter extends LoggerAdapter {
7560
return logger.error.apply(undefined, arguments);
7661
}
7762

63+
addTransport(transport) {
64+
// Note that this is calling addTransport
65+
// from logger. See import - confusing.
66+
// but this is not recursive.
67+
addTransport(transport);
68+
}
69+
7870
// custom query as winston is currently limited
7971
query(options, callback = () => {}) {
8072
if (!options) {
@@ -114,4 +106,4 @@ export class FileLoggerAdapter extends LoggerAdapter {
114106
}
115107
}
116108

117-
export default FileLoggerAdapter;
109+
export default WinstonLoggerAdapter;

src/ParseServer.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { InMemoryCacheAdapter } from './Adapters/Cache/InMemoryCacheAdapter';
2828
import { AnalyticsController } from './Controllers/AnalyticsController';
2929
import { CacheController } from './Controllers/CacheController';
3030
import { AnalyticsAdapter } from './Adapters/Analytics/AnalyticsAdapter';
31-
import { FileLoggerAdapter } from './Adapters/Logger/FileLoggerAdapter';
31+
import { WinstonLoggerAdapter } from './Adapters/Logger/WinstonLoggerAdapter';
3232
import { FilesController } from './Controllers/FilesController';
3333
import { FilesRouter } from './Routers/FilesRouter';
3434
import { FunctionsRouter } from './Routers/FunctionsRouter';
@@ -71,7 +71,7 @@ const requiredUserFields = { fields: { ...SchemaController.defaultColumns._Defau
7171
// "analyticsAdapter": an adapter class for analytics
7272
// "filesAdapter": a class like GridStoreAdapter providing create, get,
7373
// and delete
74-
// "loggerAdapter": a class like FileLoggerAdapter providing info, error,
74+
// "loggerAdapter": a class like WinstonLoggerAdapter providing info, error,
7575
// and query
7676
// "jsonLogs": log as structured JSON objects
7777
// "databaseURI": a uri like mongodb://localhost:27017/dbname to tell us
@@ -186,7 +186,7 @@ class ParseServer {
186186
});
187187
// Pass the push options too as it works with the default
188188
const pushControllerAdapter = loadAdapter(push && push.adapter, ParsePushAdapter, push || {});
189-
const loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter);
189+
const loggerControllerAdapter = loadAdapter(loggerAdapter, WinstonLoggerAdapter);
190190
const emailControllerAdapter = loadAdapter(emailAdapter);
191191
const cacheControllerAdapter = loadAdapter(cacheAdapter, InMemoryCacheAdapter, {appId: appId});
192192
const analyticsControllerAdapter = loadAdapter(analyticsAdapter, AnalyticsAdapter);

src/cli/cli-definitions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ export default {
172172
},
173173
"customPages": {
174174
env: "PARSE_SERVER_CUSTOM_PAGES",
175-
help: "custom pages for pasword validation and reset",
175+
help: "custom pages for password validation and reset",
176176
action: objectParser
177177
},
178178
"maxUploadSize": {

src/logger.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ LOGS_FOLDER = process.env.PARSE_SERVER_LOGS_FOLDER || LOGS_FOLDER;
1313
const JSON_LOGS = process.env.JSON_LOGS || false;
1414

1515
let currentLogsFolder = LOGS_FOLDER;
16+
const additionalTransports = [];
1617

1718
function generateTransports(level, options = {}) {
1819
let transports = [
@@ -32,7 +33,7 @@ function generateTransports(level, options = {}) {
3233
level: 'error'
3334
}
3435
), options)
35-
];
36+
].concat(additionalTransports);
3637
if (!process.env.TESTING || process.env.VERBOSE) {
3738
transports = [
3839
new (winston.transports.Console)(
@@ -90,5 +91,14 @@ export function addGroup(groupName) {
9091
return winston.loggers.get(groupName);
9192
}
9293

93-
export { logger };
94+
export function addTransport(transport) {
95+
const level = winston.level;
96+
additionalTransports.push(transport);
97+
const transports = generateTransports(level);
98+
logger.configure({
99+
transports: transports
100+
});
101+
}
102+
103+
export { logger, addTransport };
94104
export default logger;

0 commit comments

Comments
 (0)