1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-29 02:29:06 -05:00
denoland-deno/log/README.md

142 lines
3.9 KiB
Markdown
Raw Normal View History

2019-02-02 09:41:54 -05:00
# Log
## Usage
2018-12-19 13:16:45 -05:00
2019-01-02 09:12:48 -05:00
```ts
2019-01-14 01:46:00 -05:00
import * as log from "https://deno.land/x/std/log/mod.ts";
2018-12-19 13:16:45 -05:00
2019-02-02 09:41:54 -05:00
// simple default logger, you can customize it
// by overriding logger and handler named "default"
2019-01-02 09:12:48 -05:00
log.debug("Hello world");
log.info("Hello world");
log.warning("Hello world");
log.error("Hello world");
log.critical("500 Internal server error");
2018-12-19 13:16:45 -05:00
2019-02-02 09:41:54 -05:00
// custom configuration
2019-01-02 09:12:48 -05:00
await log.setup({
2019-01-01 22:46:17 -05:00
handlers: {
console: new log.handlers.ConsoleHandler("DEBUG"),
2019-02-02 09:41:54 -05:00
file: new log.handlers.FileHandler("WARNING", {
filename: "./log.txt",
// you can change format of output message
formatter: "{levelName} {msg}"
})
2019-01-01 22:46:17 -05:00
},
2018-12-24 10:28:01 -05:00
2019-01-01 22:46:17 -05:00
loggers: {
2019-02-02 09:41:54 -05:00
// configure default logger available via short-hand methods above
2019-01-01 22:46:17 -05:00
default: {
level: "DEBUG",
handlers: ["console", "file"]
2019-02-02 09:41:54 -05:00
},
tasks: {
level: "ERROR",
handlers: ["console"]
2019-01-02 09:12:48 -05:00
}
2019-01-01 22:46:17 -05:00
}
2019-01-02 09:12:48 -05:00
});
2019-02-02 09:41:54 -05:00
let logger;
// get default logger
logger = log.getLogger();
logger.debug("fizz"); // logs to `console`, because `file` handler requires "WARNING" level
logger.warning("buzz"); // logs to both `console` and `file` handlers
// get custom logger
logger = log.getLogger("tasks");
logger.debug("fizz"); // won't get output becase this logger has "ERROR" level
logger.error("buzz"); // log to `console`
2019-01-02 09:12:48 -05:00
// if you try to use a logger that hasn't been configured
// you're good to go, it gets created automatically with level set to 0
// so no message is logged
2019-02-02 09:41:54 -05:00
unknownLogger = log.getLogger("mystery");
2019-01-01 22:46:17 -05:00
unknownLogger.info("foobar"); // no-op
```
2019-02-02 09:41:54 -05:00
## Advanced usage
### Loggers
Loggers are objects that you interact with. When you use logger method it constructs a `LogRecord` and passes it down to its handlers for output. To create custom loggers speficify them in `loggers` when calling `log.setup`.
#### `LogRecord`
`LogRecord` is an object that encapsulates provided message and arguments as well some meta data that can be later used when formatting a message.
```ts
interface LogRecord {
msg: string;
args: any[];
datetime: Date;
level: number;
levelName: string;
}
```
### Handlers
Handlers are responsible for actual output of log messages. When handler is called by logger it firstly checks that `LogRecord`'s level is not lower than level of the handler. If level check passes, handlers formats log record into string and outputs it to target.
`log` module comes with two built-in handlers:
- `ConsoleHandler` - (default)
- `FileHandler`
#### Custom message format
If you want to override default format of message you can define `formatter` option for handler. It can be either simple string-based format that uses `LogRecord` fields or more complicated function-based one that takes `LogRecord` as argument and outputs string.
Eg.
```ts
await log.setup({
handlers: {
stringFmt: new log.handlers.ConsoleHandler("DEBUG", {
formatter: "[{levelName}] {msg}"
}),
functionFmt: new log.handlers.ConsoleHandler("DEBUG", {
formatter: logRecord => {
let msg = `{logRecord.level} {logRecord.msg}`;
logRecord.args.forEach((arg, index) => {
msg += `, arg{index}: {arg}`;
});
return msg;
}
}),
},
loggers: {
default: {
level: "DEBUG",
handlers: ["stringFmt", "functionFmt"],
},
}
})
// calling
log.debug("Hello, world!", 1, "two", [3, 4, 5]);
// results in:
[DEBUG] Hello, world! // output from "stringFmt" handler
10 Hello, world!, arg0: 1, arg1: two, arg3: [3, 4, 5] // output from "functionFmt" formatter
```
#### Custom handlers
Custom handlers can be implemented by subclassing `BaseHandler` or `WriterHandler`.
`BaseHandler` is bare-bones handler that has no output logic at all,
`WriterHandler` is an abstract class that supports any target with `Writer` interface.
During setup async hooks `setup` and `destroy` are called, you can use them to open and close file/HTTP connection or any other action you might need.
For examples check source code of `FileHandler` and `TestHandler`.