Skip to content

Commit

Permalink
fix(logger): avoid breaking change
Browse files Browse the repository at this point in the history
  • Loading branch information
Ashwin Kumar committed Dec 18, 2023
1 parent ac3c11e commit 62c043d
Show file tree
Hide file tree
Showing 16 changed files with 240 additions and 214 deletions.
7 changes: 4 additions & 3 deletions packages/aws-amplify/src/initSingleton.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
LibraryOptions,
ResourcesConfig,
defaultStorage,
ConsoleProvider,
consoleProvider,
} from '@aws-amplify/core';
import {
LegacyConfig,
Expand All @@ -25,12 +25,13 @@ export const DefaultAmplify = {
let resolvedResourceConfig: ResourcesConfig;

// add console logger provider by default
if (!Amplify.libraryOptions.Logger) {
if (!Amplify.libraryOptions?.Logger) {
const customProviders = libraryOptions?.Logger?.providers ?? [];
libraryOptions = {
...libraryOptions,
Logger: {
...libraryOptions?.Logger,
Console: { provider: ConsoleProvider },
providers: [consoleProvider, ...customProviders],
},
};
}
Expand Down
3 changes: 2 additions & 1 deletion packages/aws-amplify/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ export {
sharedInMemoryStorage,
KeyValueStorageInterface,
generateLogger,
CloudWatchProvider,
cloudWatchProvider,
consoleProvider,
} from '@aws-amplify/core';
29 changes: 3 additions & 26 deletions packages/core/src/Logger/AdministrateLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,10 @@
// PENDING: logger configs to be taken from singleton
// PENDING: log filtering
import { Amplify } from '../singleton/Amplify';
import { LogCallInputs, LogLevel } from './types';
import { LogParams } from './types';

const logLevelIndex = ['VERBOSE', 'DEBUG', 'INFO', 'WARN', 'ERROR'];
let logLevel: LogLevel = 'INFO';

export const log = (...params: LogCallInputs) => {
export const administrateLogger = (params: LogParams) => {
const loggers = Amplify.libraryOptions.Logger;
if (loggers)
Object.values(loggers).forEach(logger => logger.provider.log(...params));
};

export const setLogLevel = (level: LogLevel) => {
logLevel = level;
};

export const getLogLevel = (): LogLevel => {
if (typeof (<any>window) !== 'undefined' && (<any>window).LOG_LEVEL) {
const windowLog = (<any>window).LOG_LEVEL;
if (logLevelIndex.includes(windowLog)) return windowLog;
}
return logLevel;
};

export const checkLogLevel = (
level: LogLevel,
setLevel: LogLevel | undefined = undefined
): boolean => {
const targetLevel = setLevel ?? getLogLevel();
return logLevelIndex.indexOf(level) >= logLevelIndex.indexOf(targetLevel);
Object.values(loggers.providers).forEach(logger => logger.log(params));
};
10 changes: 9 additions & 1 deletion packages/core/src/Logger/ConsoleLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

import { AWS_CLOUDWATCH_CATEGORY } from '../constants';
import { consoleProvider } from './providers/console';

// TODO: cleanup these legacy logger types
// legacy logger types
Expand Down Expand Up @@ -66,7 +67,14 @@ export class ConsoleLogger implements Logger {
this._pluggables = [];
}

static LOG_LEVEL: string | null = null;
private static _logLevel: string | null = null;
static get LOG_LEVEL(): string | null {
return this._logLevel;
}
static set LOG_LEVEL(level: string | null) {
consoleProvider.LOG_LEVEL = level;
this._logLevel = level;
}

_padding(n: number) {
return n < 10 ? '0' + n : '' + n;
Expand Down
5 changes: 3 additions & 2 deletions packages/core/src/Logger/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

export { ConsoleLogger } from './ConsoleLogger'; // legacy
export { LoggerProvider } from './types';
export { generateExternalLogger, generateInternalLogger } from './logger';
export { logger as CloudWatchProvider } from './providers/CloudWatchProvider';
export { logger as ConsoleProvider } from './providers/ConsoleProvider';
export { cloudWatchProvider } from './providers/cloudWatch';
export { consoleProvider } from './providers/console';
26 changes: 13 additions & 13 deletions packages/core/src/Logger/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

import { LogLevel } from './types';
import { log as centralizedLog } from './AdministrateLogger';
import { administrateLogger } from './AdministrateLogger';
import { AmplifyLoggingCategories } from '../types';

/**
Expand All @@ -22,8 +22,8 @@ class Logger {
* @memeberof Logger
* @param {string|object} msg - Logging message or object
*/
info(message: string, ...objects: any) {
this._log('INFO', message, objects);
info(message: string) {
this._log('INFO', message);
}

/**
Expand All @@ -32,8 +32,8 @@ class Logger {
* @memeberof Logger
* @param {string|object} msg - Logging message or object
*/
warn(message: string, ...objects: any) {
this._log('WARN', message, objects);
warn(message: string) {
this._log('WARN', message);
}

/**
Expand All @@ -42,8 +42,8 @@ class Logger {
* @memeberof Logger
* @param {string|object} msg - Logging message or object
*/
error(message: string, ...objects: any) {
this._log('ERROR', message, objects);
error(message: string) {
this._log('ERROR', message);
}

/**
Expand All @@ -52,8 +52,8 @@ class Logger {
* @memeberof Logger
* @param {string|object} msg - Logging message or object
*/
debug(message: string, ...objects: any) {
this._log('DEBUG', message, objects);
debug(message: string) {
this._log('DEBUG', message);
}

/**
Expand All @@ -62,12 +62,12 @@ class Logger {
* @memeberof Logger
* @param {string|object} msg - Logging message or object
*/
verbose(message: string, ...objects: any) {
this._log('VERBOSE', message, objects);
verbose(message: string) {
this._log('VERBOSE', message);
}

_log(logLevel: LogLevel, message: string, ...objects: any) {
centralizedLog(this.namespaces, logLevel, message, objects);
_log(logLevel: LogLevel, message: string) {
administrateLogger({ namespaces: this.namespaces, logLevel, message });
}
}

Expand Down
80 changes: 0 additions & 80 deletions packages/core/src/Logger/providers/CloudWatchProvider.ts

This file was deleted.

54 changes: 0 additions & 54 deletions packages/core/src/Logger/providers/ConsoleProvider.ts

This file was deleted.

75 changes: 75 additions & 0 deletions packages/core/src/Logger/providers/cloudWatch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

// PENDING: complete implementation of cloudWatchProvider
import { Amplify } from '../../singleton/Amplify';
import { fetchAuthSession } from '../../index';
import { LoggerProvider, CloudWatchConfig, LogParams } from '../types';
import { checkLogLevel, getTimestamp, DEFAULT_LOG_LEVEL } from '../utils';
import {
CloudWatchLogsClient,
PutLogEventsCommand,
} from '@aws-sdk/client-cloudwatch-logs';
// import { generateRandomString } from '@aws-amplify/core/internals/utils';

let cloudWatchConfig: CloudWatchConfig;
const defaultConfig = {
enable: true,
localStoreMaxSizeInMB: 5,
flushIntervalInSeconds: 60,
loggingConstraints: {
defaultLogLevel: DEFAULT_LOG_LEVEL,
},
};

export const cloudWatchProvider: LoggerProvider<CloudWatchConfig> = {
initialize: (config: CloudWatchConfig) => {
if (cloudWatchConfig)
throw new Error('CloudWatch provider already initialised');
cloudWatchConfig = { ...defaultConfig, ...config };
},
log: (input: LogParams) => {
const { namespaces, logLevel, message } = input;
const date = new Date();
const timestamp = getTimestamp(date);
const prefix = `[${logLevel}] ${timestamp} ${namespaces.join(' - ')}`;
const currentLevel =
cloudWatchConfig.loggingConstraints?.defaultLogLevel ?? DEFAULT_LOG_LEVEL;

if (checkLogLevel(logLevel, currentLevel))
putLogEvents(`${prefix} ${message}`, date.getTime());
},
flushLogs: function (): Promise<void> {
return Promise.resolve(); // todo
},
};

async function putLogEvents(message: string, timestamp: number) {
try {
const { logGroupName, region } = cloudWatchConfig;
// todo: {mm-dd-yyyy}.{deviceId}.{userId|guest}
// const logStreamName = generateRandomString(10);
const logStreamName = 'central-logger-12-17-2023';

let session;
try {
session = await fetchAuthSession();
} catch (error) {
return Promise.reject('No credentials');
}
const client = new CloudWatchLogsClient({
region,
credentials: session.credentials,
});

const params = {
logEvents: [{ message, timestamp }],
logGroupName,
logStreamName,
};

await client.send(new PutLogEventsCommand(params));
} catch (error) {
console.error('Error putting log events:', error);
}
}
Loading

0 comments on commit 62c043d

Please sign in to comment.