forked from googleapis/cloud-trace-nodejs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogger.ts
75 lines (65 loc) · 2.51 KB
/
logger.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {LEVELS, Logger, LoggerConfig} from '../src/logger';
const PASS_THROUGH_LOG_LEVEL = Number(process.env.GCLOUD_TEST_LOG_LEVEL || 0);
// Capture the value of common.Logger so that we don't enter an infinite loop
// if common.Logger is wrapped elsewhere.
const OriginalLogger = Logger;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type LoggerFunction<R> = (message: any, ...args: any[]) => R;
export class TestLogger extends Logger {
private logs: {[k in keyof Logger]: string[]} = {
error: [],
warn: [],
info: [],
debug: [],
};
private innerLogger = new OriginalLogger({
level: LEVELS[PASS_THROUGH_LOG_LEVEL],
});
constructor(options?: Partial<LoggerConfig>) {
super(Object.assign({tag: '@google-cloud/trace-agent'}, options));
}
private makeLoggerFn(logLevel: keyof Logger): LoggerFunction<this> {
// TODO(kjin): When we drop support for Node 4, use spread args.
// eslint-disable-next-line @typescript-eslint/no-this-alias
const that = this;
return function (this: null) {
// eslint-disable-next-line prefer-rest-params
const args = Array.prototype.slice.call(arguments, 0);
that.logs[logLevel].push(args.join(' '));
that.innerLogger[logLevel].apply(this, args);
return that;
};
}
error = this.makeLoggerFn('error');
warn = this.makeLoggerFn('warn');
info = this.makeLoggerFn('info');
debug = this.makeLoggerFn('debug');
getLogs(logLevel: keyof Logger): string[] {
return this.logs[logLevel];
}
getNumLogsWith(logLevel: keyof Logger, strOrReg: string | RegExp): number {
if (typeof strOrReg === 'string') {
return this.logs[logLevel].filter(line => line.includes(strOrReg)).length;
} else {
return this.logs[logLevel].filter(line => line.match(strOrReg)).length;
}
}
clearLogs(): void {
(Object.keys(this.logs) as Array<keyof Logger>).forEach(
logLevel => (this.logs[logLevel].length = 0)
);
}
}