feat: Add option to change the log level of logs emitted by Cloud Functions (#8530)
This commit is contained in:
@@ -182,6 +182,42 @@ describe('Cloud Code Logger', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should log cloud function execution using the custom log level', async done => {
|
||||||
|
Parse.Cloud.define('aFunction', () => {
|
||||||
|
return 'it worked!';
|
||||||
|
});
|
||||||
|
|
||||||
|
Parse.Cloud.define('bFunction', () => {
|
||||||
|
throw new Error('Failed');
|
||||||
|
});
|
||||||
|
|
||||||
|
await Parse.Cloud.run('aFunction', { foo: 'bar' }).then(() => {
|
||||||
|
const log = spy.calls.allArgs().find(log => log[1].startsWith('Ran cloud function '))?.[0];
|
||||||
|
expect(log).toEqual('info');
|
||||||
|
});
|
||||||
|
|
||||||
|
await reconfigureServer({
|
||||||
|
silent: true,
|
||||||
|
logLevels: {
|
||||||
|
cloudFunctionSuccess: 'warn',
|
||||||
|
cloudFunctionError: 'info',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
spy = spyOn(Config.get('test').loggerController.adapter, 'log').and.callThrough();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await Parse.Cloud.run('bFunction', { foo: 'bar' });
|
||||||
|
throw new Error('bFunction should have failed');
|
||||||
|
} catch {
|
||||||
|
const log = spy.calls
|
||||||
|
.allArgs()
|
||||||
|
.find(log => log[1].startsWith('Failed running cloud function bFunction for '))?.[0];
|
||||||
|
expect(log).toEqual('info');
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should log cloud function triggers using the custom log level', async () => {
|
it('should log cloud function triggers using the custom log level', async () => {
|
||||||
Parse.Cloud.beforeSave('TestClass', () => {});
|
Parse.Cloud.beforeSave('TestClass', () => {});
|
||||||
Parse.Cloud.afterSave('TestClass', () => {});
|
Parse.Cloud.afterSave('TestClass', () => {});
|
||||||
|
|||||||
@@ -993,6 +993,16 @@ module.exports.AuthAdapter = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
module.exports.LogLevels = {
|
module.exports.LogLevels = {
|
||||||
|
cloudFunctionError: {
|
||||||
|
env: 'PARSE_SERVER_LOG_LEVELS_CLOUD_FUNCTION_ERROR',
|
||||||
|
help: 'Log level used by the Cloud Code Functions on error. Default is `error`.',
|
||||||
|
default: 'error',
|
||||||
|
},
|
||||||
|
cloudFunctionSuccess: {
|
||||||
|
env: 'PARSE_SERVER_LOG_LEVELS_CLOUD_FUNCTION_SUCCESS',
|
||||||
|
help: 'Log level used by the Cloud Code Functions on success. Default is `info`.',
|
||||||
|
default: 'info',
|
||||||
|
},
|
||||||
triggerAfter: {
|
triggerAfter: {
|
||||||
env: 'PARSE_SERVER_LOG_LEVELS_TRIGGER_AFTER',
|
env: 'PARSE_SERVER_LOG_LEVELS_TRIGGER_AFTER',
|
||||||
help:
|
help:
|
||||||
|
|||||||
@@ -236,6 +236,8 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @interface LogLevels
|
* @interface LogLevels
|
||||||
|
* @property {String} cloudFunctionError Log level used by the Cloud Code Functions on error. Default is `error`.
|
||||||
|
* @property {String} cloudFunctionSuccess Log level used by the Cloud Code Functions on success. Default is `info`.
|
||||||
* @property {String} triggerAfter Log level used by the Cloud Code Triggers `afterSave`, `afterDelete`, `afterSaveFile`, `afterDeleteFile`, `afterFind`, `afterLogout`. Default is `info`.
|
* @property {String} triggerAfter Log level used by the Cloud Code Triggers `afterSave`, `afterDelete`, `afterSaveFile`, `afterDeleteFile`, `afterFind`, `afterLogout`. Default is `info`.
|
||||||
* @property {String} triggerBeforeError Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on error. Default is `error `.
|
* @property {String} triggerBeforeError Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on error. Default is `error `.
|
||||||
* @property {String} triggerBeforeSuccess Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on success. Default is `info`.
|
* @property {String} triggerBeforeSuccess Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on success. Default is `info`.
|
||||||
|
|||||||
@@ -577,4 +577,12 @@ export interface LogLevels {
|
|||||||
:DEFAULT: error
|
:DEFAULT: error
|
||||||
*/
|
*/
|
||||||
triggerBeforeError: ?string;
|
triggerBeforeError: ?string;
|
||||||
|
/* Log level used by the Cloud Code Functions on success. Default is `info`.
|
||||||
|
:DEFAULT: info
|
||||||
|
*/
|
||||||
|
cloudFunctionSuccess: ?string;
|
||||||
|
/* Log level used by the Cloud Code Functions on error. Default is `error`.
|
||||||
|
:DEFAULT: error
|
||||||
|
*/
|
||||||
|
cloudFunctionError: ?string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ export class FunctionsRouter extends PromiseRouter {
|
|||||||
result => {
|
result => {
|
||||||
try {
|
try {
|
||||||
const cleanResult = logger.truncateLogMessage(JSON.stringify(result.response.result));
|
const cleanResult = logger.truncateLogMessage(JSON.stringify(result.response.result));
|
||||||
logger.info(
|
logger[req.config.logLevels.cloudFunctionSuccess](
|
||||||
`Ran cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Result: ${cleanResult}`,
|
`Ran cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Result: ${cleanResult}`,
|
||||||
{
|
{
|
||||||
functionName,
|
functionName,
|
||||||
@@ -155,7 +155,7 @@ export class FunctionsRouter extends PromiseRouter {
|
|||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
try {
|
try {
|
||||||
logger.error(
|
logger[req.config.logLevels.cloudFunctionError](
|
||||||
`Failed running cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Error: ` +
|
`Failed running cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Error: ` +
|
||||||
JSON.stringify(error),
|
JSON.stringify(error),
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user