Allow LogMessageFormatter to return FlattenedLogMessages.
Originally the idea was that a log formatter should turn the LogMessage into a string that can be appended via a LogAppender. However, all of the default LogAppenders can handle objects. In particular, the ConsoleLogAppender writes to the browser console which offers an interactive UI experience when logging raw objects. For LogAppenders that can only manage text, it seems an acceptable design decision to require users to provide a LogMessageFormatter that returns a string, or accept some sane default like JSON.stringify if their formatter returns objects.
This commit is contained in:
parent
13941840ce
commit
756ebf3c78
@ -1,14 +1,14 @@
|
|||||||
import {
|
import {
|
||||||
|
flattenMessage,
|
||||||
LogLevel,
|
LogLevel,
|
||||||
LogMessage,
|
LogMessage,
|
||||||
LogMessageFormatter,
|
LogMessageFormatter,
|
||||||
structuredLogMessageFormatter
|
|
||||||
} from './log-message';
|
} from './log-message';
|
||||||
import { LogAppender } from './log-appender';
|
import { LogAppender } from './log-appender';
|
||||||
|
|
||||||
export class ConsoleLogAppender implements LogAppender {
|
export class ConsoleLogAppender implements LogAppender {
|
||||||
public threshold = LogLevel.ALL;
|
public threshold = LogLevel.ALL;
|
||||||
public formatter = structuredLogMessageFormatter;
|
public formatter: LogMessageFormatter = flattenMessage
|
||||||
|
|
||||||
constructor(threshold?: LogLevel, formatter?: LogMessageFormatter) {
|
constructor(threshold?: LogLevel, formatter?: LogMessageFormatter) {
|
||||||
if (threshold) {
|
if (threshold) {
|
||||||
|
@ -50,12 +50,12 @@ export type FlattenedLogMessage = Record<string, unknown>;
|
|||||||
*
|
*
|
||||||
* Should result after flattening in a structured log message like:
|
* Should result after flattening in a structured log message like:
|
||||||
* ```json
|
* ```json
|
||||||
* {"scope":"example","level":4,"foo":"bar","baz":"qux","timestamp":"2020-01-01T00:00:00.000Z"}
|
* {"scope":"example","level":"INFO","foo":"bar","baz":"qux","timestamp":"2020-01-01T00:00:00.000Z"}
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function flattenMessage(msg: LogMessage): FlattenedLogMessage {
|
export function flattenMessage(msg: LogMessage): FlattenedLogMessage {
|
||||||
if (typeof msg.message === 'string') {
|
if (typeof msg.message === 'string') {
|
||||||
return { ...msg };
|
return { ...msg, level: LogLevel[msg.level] };
|
||||||
} else {
|
} else {
|
||||||
const { message, ...rest } = msg;
|
const { message, ...rest } = msg;
|
||||||
return {
|
return {
|
||||||
@ -67,10 +67,11 @@ export function flattenMessage(msg: LogMessage): FlattenedLogMessage {
|
|||||||
'timestamp',
|
'timestamp',
|
||||||
]),
|
]),
|
||||||
...rest,
|
...rest,
|
||||||
|
level: LogLevel[msg.level],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export type LogMessageFormatter = (msg: LogMessage) => string;
|
export type LogMessageFormatter = (msg: LogMessage) => string | FlattenedLogMessage;
|
||||||
|
|
||||||
export function structuredLogMessageFormatter(msg: LogMessage): string {
|
export function structuredLogMessageFormatter(msg: LogMessage): string {
|
||||||
return JSON.stringify(flattenMessage(msg));
|
return JSON.stringify(flattenMessage(msg));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user