Skip to content

Commit

Permalink
feat: use config component (#97)
Browse files Browse the repository at this point in the history
* feat: use config component

* use config component

* fix build

* Update README.md
  • Loading branch information
menduz authored Aug 1, 2022
1 parent d1e9760 commit 4b802f1
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 50 deletions.
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@ Simple stdout & stderr logger component. Prints JSON when `NODE_ENV=production`

## Config

### logLevel
### `LOG_LEVEL` configuration

Adjust the default level to be used for logging. It will log everything after the assigned level according to the following hierarchy:
Using the LOG_LEVEL value provided by the IConfigComponent, the following scale is used to filter out the log levels based on the following scale:

"ALL" > "LOG" > "DEBUG" > "INFO" > "WARN" > "ERROR" > "OFF"

Eg:

```typescript
const config = { logLevel: "INFO" } // Set the log level
const config: IConfigComponent =
createConfigComponent({ ...process.env, LOG_LEVEL: "INFO" })

const loggerComponent = createLogComponent({ config })
const logger = getLogger("Test")

Expand Down
8 changes: 4 additions & 4 deletions etc/logger.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@
```ts

import { IConfigComponent } from '@well-known-components/interfaces';
import { ILoggerComponent } from '@well-known-components/interfaces';
import { IMetricsComponent } from '@well-known-components/interfaces';

// Warning: (ae-forgotten-export) The symbol "LoggerComponents" needs to be exported by the entry point index.d.ts
//
// @public
export function createConsoleLogComponent(components: LoggerComponents): ILoggerComponent;
export function createConsoleLogComponent(components: LoggerComponents): Promise<ILoggerComponent>;

// @public
export function createJsonLogComponent(components: LoggerComponents): ILoggerComponent;
export function createJsonLogComponent(components: LoggerComponents): Promise<ILoggerComponent>;

// @public
export function createLogComponent(components: LoggerComponents): ILoggerComponent;
export function createLogComponent(components: LoggerComponents): Promise<ILoggerComponent>;

// @public
export const metricDeclarations: IMetricsComponent.MetricsRecordDefinition<"wkc_logger_logs_total">;


// (No @packageDocumentation comment for this package)

```
43 changes: 40 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@well-known-components/logger",
"version": "2.1.0",
"version": "3.0.0",
"description": "base component",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
Expand All @@ -23,7 +23,8 @@
"devDependencies": {
"@microsoft/api-extractor": "^7.17.0",
"@types/jest": "^28.1.0",
"@well-known-components/interfaces": "next",
"@well-known-components/env-config-provider": "^1.1.1",
"@well-known-components/interfaces": "^1.1.1",
"jest": "^28.1.0",
"ts-jest": "^28.0.4",
"typescript": "latest"
Expand Down
33 changes: 28 additions & 5 deletions src/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { ILoggerComponent, IMetricsComponent } from "@well-known-components/interfaces"
import { ILoggerComponent, IMetricsComponent, IConfigComponent } from "@well-known-components/interfaces"
import { metricDeclarations } from "./metrics"

/**
* @public
*/
export type LoggerComponents = {
metrics?: IMetricsComponent<keyof typeof metricDeclarations>
config?: ILoggerConfigComponent
config?: IConfigComponent
}

/**
Expand Down Expand Up @@ -36,11 +36,34 @@ export type LogLevel = "ALL" | "LOG" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "OF
* Creates a scoped logger component using a LogLineFunction function.
* @public
*/
export function createGenericLogComponent(components: LoggerComponents, print: LogLineFunction): ILoggerComponent {
export async function createGenericLogComponent(
components: LoggerComponents,
print: LogLineFunction
): Promise<ILoggerComponent> {
const levelsEnum = { ALL: 0, LOG: 1, DEBUG: 2, INFO: 4, WARN: 8, ERROR: 16, OFF: 1 | 2 | 4 | 8 | 16 }

const minLogLevel = (components.config?.logLevel.toUpperCase() || "ALL") as LogLevel
const numericMinLevel = levelsEnum[minLogLevel]
let minLogLevel: LogLevel = "ALL"
let numericMinLevel = levelsEnum[minLogLevel] || 0

function setLogLevel(level: LogLevel) {
if (level && level in levelsEnum) {
minLogLevel = level
numericMinLevel = levelsEnum[minLogLevel] || 0
}
}

// set ALL log level by default
setLogLevel("ALL")

if (components.config) {
try {
// if a config component is provided, we try to get the LOG_LEVEL config
const newLevel = await components.config.getString("LOG_LEVEL")
if (newLevel) setLogLevel(newLevel as LogLevel)
} catch (error: any) {
print(components, "ERROR", "LOG_LEVEL", error.toString(), error)
}
}

// Print every log greater than or equal to a certain level
const shouldPrint = (logLevel: LogLevel) => {
Expand Down
12 changes: 4 additions & 8 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,15 @@ export { metricDeclarations }
* and json logger for NODE_ENV=production
* @public
*/
export function createLogComponent(components: LoggerComponents): ILoggerComponent {
if (process.env.NODE_ENV == "production") {
return createJsonLogComponent(components)
} else {
return createConsoleLogComponent(components)
}
export async function createLogComponent(components: LoggerComponents): Promise<ILoggerComponent> {
return createConsoleLogComponent(components)
}

/**
* Creates a scoped logger component to print a readable output to the stderr
* @public
*/
export function createConsoleLogComponent(components: LoggerComponents): ILoggerComponent {
export async function createConsoleLogComponent(components: LoggerComponents): Promise<ILoggerComponent> {
return createGenericLogComponent(components, printConsole)
}

Expand All @@ -32,6 +28,6 @@ export function createConsoleLogComponent(components: LoggerComponents): ILogger
* Useful for cloudwatch and other logging services.
* @public
*/
export function createJsonLogComponent(components: LoggerComponents): ILoggerComponent {
export async function createJsonLogComponent(components: LoggerComponents): Promise<ILoggerComponent> {
return createGenericLogComponent(components, printCloudwatch)
}
51 changes: 26 additions & 25 deletions test/helpers.spec.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { createGenericLogComponent } from "../src/helpers"
import { createConfigComponent } from "@well-known-components/env-config-provider"

describe("Helpers", () => {
describe("Log Level", () => {
it("should log all messages when no config log level is provided", () => {
describe("Helpers", () => {
describe("Log Level", () => {
it("should log all messages when no config log level is provided", async () => {
const print = jest.fn()
const loggerComponent = createGenericLogComponent({}, print)
const loggerComponent = await createGenericLogComponent({}, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -15,10 +16,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(5)
})

it("should log all messages when the log level is ALL", () => {
const config = { logLevel: "ALL" }
it("should log all messages when the log level is ALL", async () => {
const config = createConfigComponent({ LOG_LEVEL: "ALL" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -29,10 +30,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(5)
})

it("should log all messages with a log level greater than LOG", () => {
const config = { logLevel: "LOG" }
it("should log all messages with a log level greater than LOG", async () => {
const config = createConfigComponent({ LOG_LEVEL: "LOG" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -43,10 +44,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(5)
})

it("should log all messages with a log level greater than DEBUG", () => {
const config = { logLevel: "DEBUG" }
it("should log all messages with a log level greater than DEBUG", async () => {
const config = createConfigComponent({ LOG_LEVEL: "DEBUG" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -59,10 +60,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(4)
})

it("should log all messages with a log level greater than INFO", () => {
const config = { logLevel: "INFO" }
it("should log all messages with a log level greater than INFO", async () => {
const config = createConfigComponent({ LOG_LEVEL: "INFO" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -75,10 +76,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(3)
})

it("should log all messages with a log level greater than WARN", () => {
const config = { logLevel: "WARN" }
it("should log all messages with a log level greater than WARN", async () => {
const config = createConfigComponent({ LOG_LEVEL: "WARN" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -91,10 +92,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(2)
})

it("should log all messages with a log level greater than ERROR", () => {
const config = { logLevel: "ERROR" }
it("should log all messages with a log level greater than ERROR", async () => {
const config = createConfigComponent({ LOG_LEVEL: "ERROR" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand All @@ -107,10 +108,10 @@ describe("Helpers", () => {
expect(print).toHaveBeenCalledTimes(1)
})

it("should not log any message when the log level is OFF", () => {
const config = { logLevel: "OFF" }
it("should not log any message when the log level is OFF", async () => {
const config = createConfigComponent({ LOG_LEVEL: "OFF" })
const print = jest.fn()
const loggerComponent = createGenericLogComponent({ config }, print)
const loggerComponent = await createGenericLogComponent({ config }, print)
const logger = loggerComponent.getLogger("test")

logger.log("log")
Expand Down

0 comments on commit 4b802f1

Please sign in to comment.