Skip to content
Merged
77 changes: 59 additions & 18 deletions packages/logger/src/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ import type {
HandlerMethodDecorator,
SyncHandler,
} from '@aws-lambda-powertools/commons/types';
import {
getBooleanFromEnv,
getNumberFromEnv,
getStringFromEnv,
getXRayTraceIdFromEnv,
isDevMode,
} from '@aws-lambda-powertools/commons/utils/env';
import type { Context, Handler } from 'aws-lambda';
import merge from 'lodash.merge';
import { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js';
Expand Down Expand Up @@ -850,7 +857,7 @@ class Logger extends Utility implements LoggerInterface {
const unformattedBaseAttributes = {
logLevel: this.getLogLevelNameFromNumber(logLevel),
timestamp: new Date(),
xRayTraceId: this.envVarsService.getXrayTraceId(),
xRayTraceId: getXRayTraceIdFromEnv(),
...this.getPowertoolsLogData(),
message: '',
};
Expand Down Expand Up @@ -1081,7 +1088,7 @@ class Logger extends Utility implements LoggerInterface {
input: LogItemMessage,
extraInput: LogItemExtraInput
): void {
const traceId = this.envVarsService.getXrayTraceId();
const traceId = getXRayTraceIdFromEnv();
if (traceId !== undefined && this.shouldBufferLog(traceId, logLevel)) {
try {
this.bufferLogItem(
Expand Down Expand Up @@ -1125,7 +1132,7 @@ class Logger extends Utility implements LoggerInterface {
* or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value.
*/
private setConsole(): void {
if (!this.getEnvVarsService().isDevMode()) {
if (!isDevMode()) {
this.console = new Console({
stdout: process.stdout,
stderr: process.stderr,
Expand Down Expand Up @@ -1190,9 +1197,21 @@ class Logger extends Utility implements LoggerInterface {

return;
}
const envVarsValue = this.getEnvVarsService()?.getLogLevel()?.toUpperCase();
if (this.isValidLogLevel(envVarsValue)) {
this.logLevel = LogLevelThreshold[envVarsValue];

const logLevelVariable = getStringFromEnv({
key: 'POWERTOOLS_LOG_LEVEL',
defaultValue: '',
});
const logLevelVariableAlias = getStringFromEnv({
key: 'LOG_LEVEL',
defaultValue: '',
});

const logLevelValue =
logLevelVariable !== '' ? logLevelVariable : logLevelVariableAlias;

if (this.isValidLogLevel(logLevelValue)) {
this.logLevel = LogLevelThreshold[logLevelValue];
this.#initialLogLevel = this.logLevel;

return;
Expand All @@ -1212,8 +1231,15 @@ class Logger extends Utility implements LoggerInterface {
const constructorValue = sampleRateValue;
const customConfigValue =
this.getCustomConfigService()?.getSampleRateValue();
const envVarsValue = this.getEnvVarsService().getSampleRateValue();
for (const value of [constructorValue, customConfigValue, envVarsValue]) {
const sampleRateEnvVariable = getNumberFromEnv({
key: 'POWERTOOLS_LOGGER_SAMPLE_RATE',
defaultValue: 0,
});
for (const value of [
constructorValue,
customConfigValue,
sampleRateEnvVariable,
]) {
if (this.isValidSampleRate(value)) {
this.#debugLogSampling.sampleRateValue = value;
this.powertoolsLogData.sampleRateValue = value;
Expand All @@ -1236,9 +1262,10 @@ class Logger extends Utility implements LoggerInterface {
* the event passed to the Lambda function handler should be logged or not.
*/
private setLogEvent(): void {
if (this.getEnvVarsService().getLogEvent()) {
this.logEvent = true;
}
this.logEvent = getBooleanFromEnv({
key: 'POWERTOOLS_LOGGER_LOG_EVENT',
defaultValue: false,
});
}

/**
Expand All @@ -1265,7 +1292,7 @@ class Logger extends Utility implements LoggerInterface {
* add JSON indentation for pretty printing logs.
*/
private setLogIndentation(): void {
if (this.getEnvVarsService().isDevMode()) {
if (isDevMode()) {
this.logIndentation = LogJsonIndent.PRETTY;
}
}
Expand Down Expand Up @@ -1307,7 +1334,13 @@ class Logger extends Utility implements LoggerInterface {
);

// configurations that affect Logger behavior
const AlcLogLevel = this.getEnvVarsService().getAwsLogLevel();
const lambdaLogLevel = getStringFromEnv({
key: 'AWS_LAMBDA_LOG_LEVEL',
defaultValue: '',
});
const AlcLogLevel =
lambdaLogLevel === 'FATAL' ? 'CRITICAL' : lambdaLogLevel;

if (this.isValidLogLevel(AlcLogLevel)) {
this.#alcLogLevel = AlcLogLevel;
}
Expand Down Expand Up @@ -1340,15 +1373,23 @@ class Logger extends Utility implements LoggerInterface {
persistentKeys?: ConstructorOptions['persistentKeys']
): void {
this.addToPowertoolsLogData({
awsRegion: this.getEnvVarsService().getAwsRegion(),
awsRegion: getStringFromEnv({
key: 'AWS_REGION',
}),
environment:
environment ||
this.getCustomConfigService()?.getCurrentEnvironment() ||
this.getEnvVarsService().getCurrentEnvironment(),
getStringFromEnv({
key: 'ENVIRONMENT',
defaultValue: '',
}),
serviceName:
serviceName ||
this.getCustomConfigService()?.getServiceName() ||
this.getEnvVarsService().getServiceName() ||
getStringFromEnv({
key: 'POWERTOOLS_SERVICE_NAME',
defaultValue: '',
}) ||
this.defaultServiceName,
});
persistentKeys && this.appendPersistentKeys(persistentKeys);
Expand Down Expand Up @@ -1433,7 +1474,7 @@ class Logger extends Utility implements LoggerInterface {
* your function throws an error.
*/
public flushBuffer(): void {
const traceId = this.envVarsService.getXrayTraceId();
const traceId = getXRayTraceIdFromEnv();
if (traceId === undefined) {
return;
}
Expand Down Expand Up @@ -1477,7 +1518,7 @@ class Logger extends Utility implements LoggerInterface {
* Empties the buffer for the current request
*/
public clearBuffer(): void {
const traceId = this.envVarsService.getXrayTraceId();
const traceId = getXRayTraceIdFromEnv();
if (traceId === undefined) {
return;
}
Expand Down
28 changes: 28 additions & 0 deletions packages/logger/tests/unit/configFromEnv.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { LogLevel } from '@aws-lambda-powertools/testing-utils';
import { beforeEach, describe, expect, it } from 'vitest';
import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js';

Expand All @@ -22,6 +23,18 @@ describe('Class: EnvironmentVariablesService', () => {
expect(value).toEqual('CRITICAL');
});

it('returns the original value when AWS_LAMBDA_LOG_LEVEL is not FATAL', () => {
// Prepare
process.env.AWS_LAMBDA_LOG_LEVEL = LogLevel.INFO;
const service = new EnvironmentVariablesService();

// Act
const value = service.getAwsLogLevel();

// Assess
expect(value).toEqual('INFO');
});

it('returns the value of the environment variable AWS_REGION', () => {
// Prepare
process.env.AWS_REGION = 'us-east-1';
Expand Down Expand Up @@ -169,6 +182,21 @@ describe('Class: EnvironmentVariablesService', () => {
expect(value).toEqual(0.01);
});

it.each([undefined, ''])(
'returns undefined sample rate when POWERTOOLS_LOGGER_SAMPLE_RATE is %s',
(sampleRateValue) => {
// Prepare
process.env.POWERTOOLS_LOGGER_SAMPLE_RATE = sampleRateValue;
const service = new EnvironmentVariablesService();

// Act
const value = service.getSampleRateValue();

// Assess
expect(value).toBeUndefined();
}
);

it('returns the value of the TZ environment variable when set', () => {
// Prepare
process.env.TZ = 'Europe/London';
Expand Down
11 changes: 11 additions & 0 deletions packages/logger/tests/unit/logLevels.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,17 @@ describe('Log levels', () => {
expect(logger.getLevelName()).toBe(LogLevel.CRITICAL);
});

it('sets the log level to CRITICAL when AWS_LAMBDA_LOG_LEVEL is FATAL', () => {
// Prepare
process.env.AWS_LAMBDA_LOG_LEVEL = 'FATAL';

// Act
const logger = new Logger();

// Assess
expect(logger.getLevelName()).toBe('CRITICAL');
});

it('sets the correct log level when using a custom config service', () => {
// Prepare
process.env.POWERTOOLS_LOG_LEVEL = undefined;
Expand Down