Skip to content

Commit 6a1d78f

Browse files
committed
- BKNDLSS-31341 improve logging
1 parent 7a7ac6a commit 6a1d78f

File tree

4 files changed

+203
-10
lines changed

4 files changed

+203
-10
lines changed

backendless.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,8 @@ declare module Backendless {
944944

945945
function setLogReportingPolicy(numOfMessages: number, timeFrequencySec: number): void;
946946

947+
function setMessagesLimit(limit: number): void;
948+
947949
function getLogger(name: string): Backendless.Logger;
948950
}
949951

src/logging/index.js

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ export default class Logging {
1010

1111
reset() {
1212
this.loggers = {}
13-
this.pool = []
13+
this.messages = []
1414
this.numOfMessages = 10
1515
this.timeFrequency = 1
16+
this.messagesLimit = 100
1617
}
1718

1819
getLogger(loggerName) {
@@ -28,19 +29,26 @@ export default class Logging {
2829
}
2930

3031
async flush() {
31-
if (!this.flushRequest && this.pool.length) {
32+
if (!this.flushRequest && this.messages.length) {
3233
this.stopFlushInterval()
3334

35+
const messages = [...this.messages]
36+
37+
this.messages = []
38+
3439
this.flushRequest = this.app.request
3540
.put({
3641
url : this.app.urls.logging(),
37-
data: this.pool
38-
})
39-
.then(() => {
40-
delete this.flushRequest
42+
data: messages
4143
})
44+
.catch(error => {
45+
this.messages = [...messages, ...this.messages]
46+
47+
this.checkMessagesLimit()
4248

43-
this.pool = []
49+
throw error
50+
})
51+
.finally(() => delete this.flushRequest)
4452
}
4553

4654
return this.flushRequest
@@ -51,17 +59,24 @@ export default class Logging {
5159
throw new Error('"message" must be a string')
5260
}
5361

54-
this.pool.push({ logger, message, exception, 'log-level': logLevel, timestamp: Date.now() })
62+
this.messages.push({ logger, message, exception, 'log-level': logLevel, timestamp: Date.now() })
5563

64+
this.checkMessagesLimit()
5665
this.checkMessagesLen()
5766
}
5867

5968
checkMessagesLen() {
60-
if (this.pool.length >= this.numOfMessages) {
69+
if (this.messages.length >= this.numOfMessages) {
6170
this.startFlushInterval()
6271
}
6372
}
6473

74+
checkMessagesLimit() {
75+
if (this.messages.length > this.messagesLimit) {
76+
this.messages = this.messages.slice(this.messages.length - this.messagesLimit)
77+
}
78+
}
79+
6580
startFlushInterval() {
6681
if (!this.flushInterval) {
6782
this.flushInterval = setTimeout(() => this.flush(), this.timeFrequency * 1000)
@@ -81,10 +96,20 @@ export default class Logging {
8196
this.stopFlushInterval()
8297
}
8398

99+
if (numOfMessages > this.messagesLimit) {
100+
this.messagesLimit = numOfMessages
101+
}
102+
84103
this.numOfMessages = numOfMessages
85104
this.timeFrequency = timeFrequency
86105

87106
this.checkMessagesLen()
88107
}
89108

109+
setMessagesLimit(messagesLimit) {
110+
this.messagesLimit = messagesLimit
111+
112+
this.checkMessagesLimit()
113+
}
114+
90115
}

test/tsd.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1885,6 +1885,7 @@ function testLogging() {
18851885
let logger: Backendless.Logger;
18861886
const message: string = 'str';
18871887
const exception: string = 'str';
1888+
let resultVoid: void;
18881889

18891890
const restUrl: string = Backendless.Logging.restUrl;
18901891
const loggers: object = Backendless.Logging.loggers;
@@ -1893,7 +1894,8 @@ function testLogging() {
18931894
const numOfMessages: number = Backendless.Logging.numOfMessages;
18941895
const timeFrequency: number = Backendless.Logging.timeFrequency;
18951896

1896-
Backendless.Logging.setLogReportingPolicy(numOfMessagesValue, timeFrequencySecValue);
1897+
resultVoid = Backendless.Logging.setLogReportingPolicy(numOfMessagesValue, timeFrequencySecValue);
1898+
resultVoid = Backendless.Logging.setMessagesLimit(123);
18971899

18981900
logger = Backendless.Logging.getLogger(loggerName);
18991901
logger.debug(message);

test/unit/specs/logging.js

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,170 @@ describe('<Logging>', function() {
211211
})
212212
})
213213

214+
it('should try to send next time if it was failed', async () => {
215+
const req1 = prepareMockRequest(() => {
216+
throw new Error('Test Error')
217+
})
218+
219+
const req2 = prepareMockRequest()
220+
221+
Backendless.Logging.setLogReportingPolicy(1, 0.5)
222+
223+
logger.debug('debug message - 1')
224+
logger.debug('debug message - 2')
225+
226+
await Utils.wait(1000)
227+
228+
expect(req1).to.deep.include({
229+
method : 'PUT',
230+
path : `${APP_PATH}/log`,
231+
headers: { 'Content-Type': 'application/json' },
232+
})
233+
234+
expect(req1.body).to.deep.equal([
235+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 1', timestamp: req1.body[0].timestamp },
236+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req1.body[1].timestamp }
237+
])
238+
239+
logger.debug('debug message - 3')
240+
241+
await Utils.wait(1000)
242+
243+
expect(req2.body).to.deep.equal([
244+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 1', timestamp: req1.body[0].timestamp },
245+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req1.body[1].timestamp },
246+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 3', timestamp: req2.body[2].timestamp }
247+
])
248+
})
249+
250+
it('should keep messages if they were not sent #1', async () => {
251+
const req1 = prepareMockRequest(() => {
252+
throw new Error('Test Error1')
253+
})
254+
const req2 = prepareMockRequest(() => {
255+
throw new Error('Test Error2')
256+
})
257+
const req3 = prepareMockRequest()
258+
259+
Backendless.Logging.setLogReportingPolicy(2, 0.5)
260+
Backendless.Logging.setMessagesLimit(5)
261+
262+
logger.debug('debug message - 1')
263+
logger.debug('debug message - 2')
264+
265+
await Utils.wait(1000)
266+
267+
logger.debug('debug message - 3')
268+
logger.debug('debug message - 4')
269+
270+
await Utils.wait(1000)
271+
272+
logger.debug('debug message - 5')
273+
logger.debug('debug message - 6')
274+
275+
await Utils.wait(1000)
276+
277+
expect(req1.body).to.deep.equal([
278+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 1', timestamp: req1.body[0].timestamp },
279+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req1.body[1].timestamp },
280+
])
281+
282+
expect(req2.body).to.deep.equal([
283+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 1', timestamp: req2.body[0].timestamp },
284+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req2.body[1].timestamp },
285+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 3', timestamp: req2.body[2].timestamp },
286+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 4', timestamp: req2.body[3].timestamp },
287+
])
288+
289+
expect(req3.body).to.deep.equal([
290+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req3.body[0].timestamp },
291+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 3', timestamp: req3.body[1].timestamp },
292+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 4', timestamp: req3.body[2].timestamp },
293+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 5', timestamp: req3.body[3].timestamp },
294+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 6', timestamp: req3.body[4].timestamp },
295+
])
296+
})
297+
298+
it('should keep messages if they were not sent #2', async () => {
299+
const req1 = prepareMockRequest(() => {
300+
throw new Error('Test Error1')
301+
})
302+
const req2 = prepareMockRequest(() => {
303+
throw new Error('Test Error2')
304+
})
305+
const req3 = prepareMockRequest()
306+
307+
Backendless.Logging.setLogReportingPolicy(2, 0.5)
308+
Backendless.Logging.setMessagesLimit(5)
309+
310+
logger.debug('debug message - 1')
311+
logger.debug('debug message - 2')
312+
logger.debug('debug message - 3')
313+
314+
await Utils.wait(1000)
315+
316+
logger.debug('debug message - 4')
317+
logger.debug('debug message - 5')
318+
logger.debug('debug message - 6')
319+
320+
await Utils.wait(1000)
321+
322+
logger.debug('debug message - 7')
323+
logger.debug('debug message - 8')
324+
325+
await Utils.wait(1000)
326+
327+
expect(req1.body).to.deep.equal([
328+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 1', timestamp: req1.body[0].timestamp },
329+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req1.body[1].timestamp },
330+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 3', timestamp: req1.body[2].timestamp },
331+
])
332+
333+
expect(req2.body).to.deep.equal([
334+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 2', timestamp: req2.body[0].timestamp },
335+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 3', timestamp: req2.body[1].timestamp },
336+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 4', timestamp: req2.body[2].timestamp },
337+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 5', timestamp: req2.body[3].timestamp },
338+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 6', timestamp: req2.body[4].timestamp },
339+
])
340+
341+
expect(req3.body).to.deep.equal([
342+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 4', timestamp: req3.body[0].timestamp },
343+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 5', timestamp: req3.body[1].timestamp },
344+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 6', timestamp: req3.body[2].timestamp },
345+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 7', timestamp: req3.body[3].timestamp },
346+
{ 'log-level': 'DEBUG', 'logger': loggerName, 'message': 'debug message - 8', timestamp: req3.body[4].timestamp },
347+
])
348+
})
349+
350+
it('should send 100 messages by default', async () => {
351+
const req1 = prepareMockRequest()
352+
353+
Backendless.Logging.setLogReportingPolicy(2, 0.5)
354+
355+
for (let i = 1; i <= 100; i++) {
356+
logger.debug(`debug message - ${i}`)
357+
}
358+
359+
await Utils.wait(1000)
360+
361+
expect(req1.body).to.have.length(100)
362+
})
363+
364+
it('should change max limit when setting numOfMessages', async () => {
365+
const req1 = prepareMockRequest()
366+
367+
Backendless.Logging.setLogReportingPolicy(200, 0.5)
368+
369+
for (let i = 1; i <= 200; i++) {
370+
logger.debug(`debug message - ${i}`)
371+
}
372+
373+
await Utils.wait(1000)
374+
375+
expect(req1.body).to.have.length(200)
376+
})
377+
214378
it('should return the same request promise', async () => {
215379
prepareMockRequest(() => ({ delay: 2000 }))
216380

0 commit comments

Comments
 (0)