Skip to content

Commit a9fdf64

Browse files
committed
Adds logger on cloud code request object
1 parent 3945e0c commit a9fdf64

File tree

5 files changed

+104
-1
lines changed

5 files changed

+104
-1
lines changed

spec/CloudCodeLogger.spec.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
'use strict';
2+
var LoggerController = require('../src/Controllers/LoggerController').LoggerController;
3+
var FileLoggerAdapter = require('../src/Adapters/Logger/FileLoggerAdapter').FileLoggerAdapter;
4+
5+
var clearLogs = require('../src/logger').clearLogs;
6+
var loggerController = new LoggerController(new FileLoggerAdapter());
7+
8+
describe("Cloud Code Logger", () => {
9+
beforeAll(() => {
10+
clearLogs();
11+
});
12+
13+
afterAll(() => {
14+
clearLogs();
15+
});
16+
17+
it("should expose log to functions", (done) => {
18+
Parse.Cloud.define("loggerTest", (req, res) => {
19+
req.logger.info('loggerTest', 'info log', { info: 'some log' });
20+
req.logger.error('loggerTest','error log', {error: 'there was an error'});
21+
res.success({});
22+
});
23+
24+
Parse.Cloud.run('loggerTest').then(() => {
25+
Parse.Cloud._removeHook('Functions', 'loggerTest');
26+
return loggerController.getLogs({})
27+
}).then((res) => {
28+
expect(res.length).not.toBe(0);
29+
let lastLogs = res.slice(0, 2);
30+
let errorMessage = lastLogs[0];
31+
let infoMessage = lastLogs[1];
32+
expect(errorMessage.level).toBe('error');
33+
expect(errorMessage.error).toBe('there was an error');
34+
expect(errorMessage.message).toBe('loggerTest error log');
35+
expect(infoMessage.level).toBe('info');
36+
expect(infoMessage.info).toBe('some log');
37+
expect(infoMessage.message).toBe('loggerTest info log');
38+
done();
39+
});
40+
});
41+
42+
it("should expose log to trigger", (done) => {
43+
Parse.Cloud.beforeSave("MyObject", (req, res) => {
44+
req.logger.info('beforeSave MyObject', 'info log', { info: 'some log' });
45+
req.logger.error('beforeSave MyObject','error log', {error: 'there was an error'});
46+
res.success({});
47+
});
48+
let obj = new Parse.Object('MyObject')
49+
obj.save().then(() => {
50+
Parse.Cloud._removeHook('Triggers', 'beforeSave', 'MyObject');
51+
return loggerController.getLogs({})
52+
}).then((res) => {
53+
expect(res.length).not.toBe(0);
54+
let lastLogs = res.slice(0, 2);
55+
let errorMessage = lastLogs[0];
56+
let infoMessage = lastLogs[1];
57+
expect(errorMessage.level).toBe('error');
58+
expect(errorMessage.error).toBe('there was an error');
59+
expect(errorMessage.message).toBe('beforeSave MyObject error log');
60+
expect(infoMessage.level).toBe('info');
61+
expect(infoMessage.info).toBe('some log');
62+
expect(infoMessage.message).toBe('beforeSave MyObject info log');
63+
done();
64+
});
65+
});
66+
});

spec/LoggerController.spec.js

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

4+
var clearLogs = require('../src/logger').clearLogs;
5+
46
describe('LoggerController', () => {
7+
afterEach(() => {
8+
clearLogs();
9+
});
510
it('can check process a query witout throwing', (done) => {
611
// Make mock request
712
var query = {};

src/Routers/FunctionsRouter.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ var express = require('express'),
44
Parse = require('parse/node').Parse,
55
triggers = require('../triggers');
66

7+
import { addGroup } from '../logger';
78
import PromiseRouter from '../PromiseRouter';
89

10+
let logger = addGroup('cloud-code');
11+
912
export class FunctionsRouter extends PromiseRouter {
1013

1114
mountRoutes() {
@@ -38,7 +41,8 @@ export class FunctionsRouter extends PromiseRouter {
3841
params: params,
3942
master: req.auth && req.auth.isMaster,
4043
user: req.auth && req.auth.user,
41-
installationId: req.info.installationId
44+
installationId: req.info.installationId,
45+
logger
4246
};
4347

4448
if (theValidator && typeof theValidator === "function") {

src/logger.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,31 @@ if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {
1010
}
1111

1212
let currentLogsFolder = LOGS_FOLDER;
13+
let clearLogs;
14+
if (process.env.TESTING) {
15+
16+
var rmDirContents = function(dirPath) {
17+
try { var files = fs.readdirSync(dirPath); }
18+
catch(e) { return; }
19+
if (files.length > 0)
20+
for (var i = 0; i < files.length; i++) {
21+
var filePath = dirPath + '/' + files[i];
22+
if (fs.statSync(filePath).isFile())
23+
fs.unlinkSync(filePath);
24+
else
25+
rmDir(filePath);
26+
}
27+
};
28+
clearLogs = function() {
29+
let folder = currentLogsFolder;
30+
if (!path.isAbsolute(folder)) {
31+
folder = path.resolve(process.cwd(), folder);
32+
}
33+
rmDirContents(folder);
34+
}
35+
}
36+
37+
export { clearLogs };
1338

1439
function generateTransports(level) {
1540
let transports = [

src/triggers.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// triggers.js
22
import Parse from 'parse/node';
33
import cache from './cache';
4+
import { addGroup } from './logger';
45

56
export const Types = {
67
beforeSave: 'beforeSave',
@@ -113,6 +114,8 @@ export function getRequestObject(triggerType, auth, parseObject, originalParseOb
113114
if (auth.installationId) {
114115
request['installationId'] = auth.installationId;
115116
}
117+
let ccLogger = addGroup('cloud-code');
118+
request.logger = ccLogger;
116119
return request;
117120
}
118121

0 commit comments

Comments
 (0)