1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-26 16:09:27 -05:00

std/log - Expose Logger type and improve public interface for get & set log levels (#6617)

This commit is contained in:
Paul Thompson 2020-07-06 13:57:31 +10:00 committed by GitHub
parent d1289db1c3
commit c3c13351a9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 166 additions and 13 deletions

View file

@ -43,22 +43,43 @@ export interface LoggerOptions {
} }
export class Logger { export class Logger {
level: number; #level: LogLevels;
levelName: LevelName; #handlers: BaseHandler[];
// eslint-disable-next-line @typescript-eslint/no-explicit-any readonly #loggerName: string;
handlers: any[];
loggerName: string;
constructor( constructor(
loggerName: string, loggerName: string,
levelName: LevelName, levelName: LevelName,
options: LoggerOptions = {} options: LoggerOptions = {}
) { ) {
this.loggerName = loggerName; this.#loggerName = loggerName;
this.level = getLevelByName(levelName); this.#level = getLevelByName(levelName);
this.levelName = levelName; this.#handlers = options.handlers || [];
}
this.handlers = options.handlers || []; get level(): LogLevels {
return this.#level;
}
set level(level: LogLevels) {
this.#level = level;
}
get levelName(): LevelName {
return getLevelName(this.#level);
}
set levelName(levelName: LevelName) {
this.#level = getLevelByName(levelName);
}
get loggerName(): string {
return this.#loggerName;
}
set handlers(hndls: BaseHandler[]) {
this.#handlers = hndls;
}
get handlers(): BaseHandler[] {
return this.#handlers;
} }
/** If the level of the logger is greater than the level to log, then nothing /** If the level of the logger is greater than the level to log, then nothing
@ -68,7 +89,7 @@ export class Logger {
* function, not the function itself, unless the function isn't called, in which * function, not the function itself, unless the function isn't called, in which
* case undefined is returned. All types are coerced to strings for logging. * case undefined is returned. All types are coerced to strings for logging.
*/ */
_log<T>( private _log<T>(
level: number, level: number,
msg: (T extends Function ? never : T) | (() => T), msg: (T extends Function ? never : T) | (() => T),
...args: unknown[] ...args: unknown[]
@ -92,7 +113,7 @@ export class Logger {
loggerName: this.loggerName, loggerName: this.loggerName,
}); });
this.handlers.forEach((handler): void => { this.#handlers.forEach((handler): void => {
handler.handle(record); handler.handle(record);
}); });

View file

@ -10,7 +10,8 @@ import {
import { assert } from "../_util/assert.ts"; import { assert } from "../_util/assert.ts";
import { LevelName } from "./levels.ts"; import { LevelName } from "./levels.ts";
export { LogLevels } from "./levels.ts"; export { LogLevels, LevelName } from "./levels.ts";
export { Logger } from "./logger.ts";
export class LoggerConfig { export class LoggerConfig {
level?: LevelName; level?: LevelName;

View file

@ -8,8 +8,10 @@ import {
error, error,
critical, critical,
setup, setup,
Logger,
LogLevels,
LevelName,
} from "./mod.ts"; } from "./mod.ts";
import { Logger } from "./logger.ts";
import { BaseHandler } from "./handlers.ts"; import { BaseHandler } from "./handlers.ts";
class TestHandler extends BaseHandler { class TestHandler extends BaseHandler {
@ -89,3 +91,132 @@ Deno.test({
assertEquals(anotherConsoleHandler.messages[0], "[tasks] ERROR world"); assertEquals(anotherConsoleHandler.messages[0], "[tasks] ERROR world");
}, },
}); });
Deno.test({
name: "Loggers have level and levelName to get/set loglevels",
async fn() {
const testHandler = new TestHandler("DEBUG");
await setup({
handlers: {
test: testHandler,
},
loggers: {
// configure default logger available via short-hand methods above
default: {
level: "DEBUG",
handlers: ["test"],
},
},
});
const logger: Logger = getLogger();
assertEquals(logger.levelName, "DEBUG");
assertEquals(logger.level, LogLevels.DEBUG);
logger.debug("debug");
logger.error("error");
logger.critical("critical");
assertEquals(testHandler.messages.length, 3);
assertEquals(testHandler.messages[0], "DEBUG debug");
assertEquals(testHandler.messages[1], "ERROR error");
assertEquals(testHandler.messages[2], "CRITICAL critical");
testHandler.messages = [];
logger.level = LogLevels.WARNING;
assertEquals(logger.levelName, "WARNING");
assertEquals(logger.level, LogLevels.WARNING);
logger.debug("debug2");
logger.error("error2");
logger.critical("critical2");
assertEquals(testHandler.messages.length, 2);
assertEquals(testHandler.messages[0], "ERROR error2");
assertEquals(testHandler.messages[1], "CRITICAL critical2");
testHandler.messages = [];
const setLevelName: LevelName = "CRITICAL";
logger.levelName = setLevelName;
assertEquals(logger.levelName, "CRITICAL");
assertEquals(logger.level, LogLevels.CRITICAL);
logger.debug("debug3");
logger.error("error3");
logger.critical("critical3");
assertEquals(testHandler.messages.length, 1);
assertEquals(testHandler.messages[0], "CRITICAL critical3");
},
});
Deno.test({
name: "Loggers have loggerName to get logger name",
async fn() {
const testHandler = new TestHandler("DEBUG");
await setup({
handlers: {
test: testHandler,
},
loggers: {
namedA: {
level: "DEBUG",
handlers: ["test"],
},
namedB: {
level: "DEBUG",
handlers: ["test"],
},
},
});
assertEquals(getLogger("namedA").loggerName, "namedA");
assertEquals(getLogger("namedB").loggerName, "namedB");
assertEquals(getLogger().loggerName, "default");
assertEquals(getLogger("nonsetupname").loggerName, "nonsetupname");
},
});
Deno.test({
name: "Logger has mutable handlers",
async fn() {
const testHandlerA = new TestHandler("DEBUG");
const testHandlerB = new TestHandler("DEBUG");
await setup({
handlers: {
testA: testHandlerA,
testB: testHandlerB,
},
loggers: {
default: {
level: "DEBUG",
handlers: ["testA"],
},
},
});
const logger: Logger = getLogger();
logger.info("msg1");
assertEquals(testHandlerA.messages.length, 1);
assertEquals(testHandlerA.messages[0], "INFO msg1");
assertEquals(testHandlerB.messages.length, 0);
logger.handlers = [testHandlerA, testHandlerB];
logger.info("msg2");
assertEquals(testHandlerA.messages.length, 2);
assertEquals(testHandlerA.messages[1], "INFO msg2");
assertEquals(testHandlerB.messages.length, 1);
assertEquals(testHandlerB.messages[0], "INFO msg2");
logger.handlers = [testHandlerB];
logger.info("msg3");
assertEquals(testHandlerA.messages.length, 2);
assertEquals(testHandlerB.messages.length, 2);
assertEquals(testHandlerB.messages[1], "INFO msg3");
logger.handlers = [];
logger.info("msg4");
assertEquals(testHandlerA.messages.length, 2);
assertEquals(testHandlerB.messages.length, 2);
},
});