Skip to content

Commit

Permalink
feat: add fatal log level support (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
theogravity committed May 6, 2024
1 parent c3b5468 commit 2dfe830
Show file tree
Hide file tree
Showing 13 changed files with 140 additions and 49 deletions.
10 changes: 10 additions & 0 deletions .changeset/tall-suits-lie.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"loglayer": minor
---

Add `fatal` log level support

- Adds the `fatal()` method in `loglayer` to write to a `fatal`
log level.
* Any logging libraries that do not support `fatal` level will
be written as an `error` level instead.
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ app.listen(port, () => {

Generics (all are optional):

- `LoggerInstanceType`: A definition that implements log `info` / `warn` / `error` / `trace` / `debug` methods.
- `LoggerInstanceType`: A definition that implements log `info` / `warn` / `error` / `trace` / `debug` / `fatal` methods.
* Used for returning the proper type in the `getLoggerInstance()` method.
- `ErrorType`: A type that represents the `Error` type. Used with the serializer and error methods. Defaults to `any`.

Expand Down Expand Up @@ -563,9 +563,16 @@ const childLog = parentLog.child()
- `LogLayer#error(...messages: MessageDataType[]): void`
- `LogLayer#debug(...messages: MessageDataType[]): void`
- `LogLayer#trace(...messages: MessageDataType[]): void`
- `LogLayer#fatal(...messages: MessageDataType[]): void`

`type MessageDataType = string | number | null | undefined`

Some logging libraries do not support a `trace` or `fatal` level. `loglayer` will re-map
to the following levels in that situation:

* `trace` -> `debug`
* `fatal` -> `error`

*Your logging library may or may not support passing multiple parameters. See your logging library's
documentation for more details.*

Expand Down
65 changes: 34 additions & 31 deletions livetests/utils.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,53 @@
import { LogLayer } from '../src/LogLayer'
import type { LogLayer } from "../src";

export function testMethods(p: LogLayer) {
console.log('===== info() ====')
p.info('info', 'message', '3')
console.log("===== info() ====");
p.info("info", "message", "3");

console.log('===== warn() ====')
p.warn('warn message %s', 1)
console.log("===== warn() ====");
p.warn("warn message %s", 1);

console.log('===== error() ====')
p.error('error message')
console.log("===== error() ====");
p.error("error message");

console.log('===== debug() ====')
p.debug('debug message')
console.log("===== debug() ====");
p.debug("debug message");

console.log('===== trace() ====')
p.trace('trace message')
console.log("===== trace() ====");
p.trace("trace message");

console.log('===== withMetadata() ====')
console.log("===== fatal() ====");
p.fatal("fatal message");

console.log("===== withMetadata() ====");
p.withMetadata({
test: 'metadata',
test2: 'metadata2',
}).trace('trace message')
test: "metadata",
test2: "metadata2",
}).trace("trace message");

console.log('===== withError() ====')
p.withError(new Error('error object')).trace('trace message')
console.log("===== withError() ====");
p.withError(new Error("error object")).trace("trace message");

console.log('===== withError() + withMetadata() ====')
console.log("===== withError() + withMetadata() ====");
p.withMetadata({
test: 'metadata',
test2: 'metadata2',
test: "metadata",
test2: "metadata2",
})
.withError(new Error('error object'))
.error('error message')
.withError(new Error("error object"))
.error("error message");

console.log('===== onlyError() ====')
p.errorOnly(new Error('error message'))
console.log("===== onlyError() ====");
p.errorOnly(new Error("error message"));

console.log('===== onlyMetadata() ====')
console.log("===== onlyMetadata() ====");
p.metadataOnly({
only: 'metadata',
})
only: "metadata",
});

console.log('===== withContext() ====')
console.log("===== withContext() ====");
p.withContext({
test: 'data',
})
test: "data",
});

p.info('context data')
p.info("context data");
}
46 changes: 33 additions & 13 deletions package-lock.json

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

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"livetest:pino": "ts-node-dev livetests/pino.ts",
"livetest:roarr": "ROARR_LOG=true ts-node-dev livetests/roarr.ts",
"livetest:winston": "ts-node-dev livetests/winston.ts",
"livetest:log4js": "ts-node-dev livetests/log4js-node.ts",
"livetest:log4js-node": "ts-node-dev livetests/log4js-node.ts",
"prepare": "husky install",
"release": "changeset publish",
"test": "vitest run",
Expand Down
11 changes: 11 additions & 0 deletions src/LogBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,17 @@ export class LogBuilder<ExternalLogger extends LoggerLibrary = LoggerLibrary, Er
this.formatLog(LogLevel.trace, messages);
}

/**
* Sends a log message to the logging library under the fatal log level
*
* The logging library may or may not support multiple message parameters and only
* the first parameter would be used.
*/
fatal(...messages: MessageDataType[]) {
this.structuredLogger._formatMessage(messages);
this.formatLog(LogLevel.fatal, messages);
}

/**
* All logging inputs are dropped and stops sending logs to the logging library.
*/
Expand Down
Loading

0 comments on commit 2dfe830

Please sign in to comment.