Skip to content

Commit 04f64ce

Browse files
authored
fix(logger): warn customers when the ALC log level is less verbose than log buffer (#3834)
1 parent 48e93fd commit 04f64ce

File tree

2 files changed

+80
-4
lines changed

2 files changed

+80
-4
lines changed

Diff for: packages/logger/src/Logger.ts

+35-4
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,13 @@ class Logger extends Utility implements LoggerInterface {
133133
* Log level used internally by the current instance of Logger.
134134
*/
135135
private logLevel: number = LogLevelThreshold.INFO;
136+
137+
/**
138+
* Advanced Logging Control Log Level
139+
* If not a valid value this will be left undefined, even if the
140+
* environment variable AWS_LAMBDA_LOG_LEVEL is set
141+
*/
142+
#alcLogLevel?: Uppercase<LogLevel>;
136143
/**
137144
* Persistent log attributes that will be logged in all log items.
138145
*/
@@ -819,16 +826,15 @@ class Logger extends Utility implements LoggerInterface {
819826
}
820827

821828
private awsLogLevelShortCircuit(selectedLogLevel?: string): boolean {
822-
const awsLogLevel = this.getEnvVarsService().getAwsLogLevel();
823-
if (this.isValidLogLevel(awsLogLevel)) {
824-
this.logLevel = LogLevelThreshold[awsLogLevel];
829+
if (this.#alcLogLevel !== undefined) {
830+
this.logLevel = LogLevelThreshold[this.#alcLogLevel];
825831

826832
if (
827833
this.isValidLogLevel(selectedLogLevel) &&
828834
this.logLevel > LogLevelThreshold[selectedLogLevel]
829835
) {
830836
this.#warnOnce(
831-
`Current log level (${selectedLogLevel}) does not match AWS Lambda Advanced Logging Controls minimum log level (${awsLogLevel}). This can lead to data loss, consider adjusting them.`
837+
`Current log level (${selectedLogLevel}) does not match AWS Lambda Advanced Logging Controls minimum log level (${this.#alcLogLevel}). This can lead to data loss, consider adjusting them.`
832838
);
833839
}
834840

@@ -1306,6 +1312,11 @@ class Logger extends Utility implements LoggerInterface {
13061312
);
13071313

13081314
// configurations that affect Logger behavior
1315+
const AlcLogLevel = this.getEnvVarsService().getAwsLogLevel();
1316+
if (this.isValidLogLevel(AlcLogLevel)) {
1317+
this.#alcLogLevel = AlcLogLevel;
1318+
}
1319+
13091320
this.setLogEvent();
13101321
this.setInitialLogLevel(logLevel);
13111322
this.setInitialSampleRate(sampleRateValue);
@@ -1378,6 +1389,16 @@ class Logger extends Utility implements LoggerInterface {
13781389
this.#bufferConfig.bufferAtVerbosity =
13791390
LogLevelThreshold[bufferAtLogLevel];
13801391
}
1392+
1393+
if (
1394+
this.#alcLogLevel !== undefined &&
1395+
LogLevelThreshold[this.#alcLogLevel] >
1396+
this.#bufferConfig.bufferAtVerbosity
1397+
) {
1398+
this.#warnOnce(
1399+
'Advanced Loggging Controls (ALC) Log Level is less verbose than Log Buffering Log Level. Buffered logs will be filtered by ALC'
1400+
);
1401+
}
13811402
}
13821403

13831404
/**
@@ -1444,6 +1465,16 @@ class Logger extends Utility implements LoggerInterface {
14441465
);
14451466
}
14461467

1468+
if (
1469+
this.#alcLogLevel !== undefined &&
1470+
LogLevelThreshold[this.#alcLogLevel] >
1471+
this.#bufferConfig.bufferAtVerbosity
1472+
) {
1473+
this.#warnOnce(
1474+
'Advanced Loggging Controls (ALC) Log Level is less verbose than Log Buffering Log Level. Some logs might be missing.'
1475+
);
1476+
}
1477+
14471478
this.#buffer?.delete(traceId);
14481479
}
14491480

Diff for: packages/logger/tests/unit/logBuffer.test.ts

+45
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,51 @@ describe('Buffer logs', () => {
9292
);
9393
});
9494

95+
it('outputs a warning when the Advanced Logging Configuration Log Level is less verbose than the Log Buffering Log Level', () => {
96+
// Assemble
97+
process.env.AWS_LAMBDA_LOG_LEVEL = 'INFO';
98+
const logger = new Logger({
99+
logLevel: LogLevel.DEBUG,
100+
logBufferOptions: { enabled: true, bufferAtVerbosity: 'DEBUG' },
101+
});
102+
103+
// Act
104+
logger.debug('This is a debug');
105+
106+
// Assess
107+
expect(console.warn).toHaveLogged(
108+
expect.objectContaining({
109+
message: expect.stringContaining(
110+
'Advanced Loggging Controls (ALC) Log Level is less verbose than Log Buffering Log Level. Buffered logs will be filtered by ALC'
111+
),
112+
level: LogLevel.WARN,
113+
})
114+
);
115+
});
116+
117+
it('When the buffer is flushed it outputs a warning if the Advanced Logging Configuration Log Level is less verbose than the Log Buffering Log Level', () => {
118+
// Assemble
119+
process.env.AWS_LAMBDA_LOG_LEVEL = 'INFO';
120+
const logger = new Logger({
121+
logLevel: LogLevel.DEBUG,
122+
logBufferOptions: { enabled: true, bufferAtVerbosity: 'DEBUG' },
123+
});
124+
125+
// Act
126+
logger.debug('This is a debug');
127+
logger.flushBuffer();
128+
129+
// Assess
130+
expect(console.warn).toHaveLogged(
131+
expect.objectContaining({
132+
message: expect.stringContaining(
133+
'Advanced Loggging Controls (ALC) Log Level is less verbose than Log Buffering Log Level. Some logs might be missing.'
134+
),
135+
level: LogLevel.WARN,
136+
})
137+
);
138+
});
139+
95140
it('outputs a warning when there is an error buffering the log', () => {
96141
// Prepare
97142
const logger = new Logger({ logBufferOptions: { maxBytes: 100 } });

0 commit comments

Comments
 (0)