自定义Egg Logger(一):egg-logger源码分析
简介
egg-logger 是 EGG 框架内置的企业级日志模块,提供了日志分级,统一错误日志、自定义日志、自动切割日志等特性,
该模块由 logger 和 transport 组成。
有哪些 Logger?
- Agent Logger(
egg-agent.log
):agent 进程日志,框架和使用到 agent 进程执行任务的插件会打印一些日志到这里。 - Core Logger(
egg-web.log
): 框架内核、插件日志。 - Error Logger(
common-error.log
):实际一般不会直接使用它,任何 logger 的.error()
调用输出的日志都会重定向到这里,重点通过查看此日志定位异常。 - App Logger (
${appInfo.name}-web.log
):应用相关日志,供应用开发者使用的日志。我们在绝大数情况下都在使用它。 - Custom Logger: 自定义的日志
1 |
|
有哪些 Transport?
Transport 是一种传输通道,一个 logger 可包含多个传输通道。比如默认的 logger 就有 fileTransport 和 consoleTransport 两个通道, 分别负责打印到文件和终端。
- Console Transport: 指定日志级别,输出日志到控制台(egg-logger/transports/console.js)
- File Transport : 输出日志到文件(egg-logger/transports/file.js)
- File Buffer Transport : FileBufferTransport 是 FileTransport 的子类。在内存中保存日志,并间隔一定的时间将日志刷新到文件中(egg-logger/transports/file_buffer.js)
1 |
|
也可以根据实际项目需要可以定义自己的 Transport。
app.getLogger('xxLogger').set('custom', new CustomTransport(...));
如何输出日志?
egg-logger 通过 logger、transport 的 log 函数将需要打印的日志信息输出到 console 或者 file 中,具体如下:
1. 根据日志级别调用 Logger 的 log 函数
1 |
|
2. 发送日志到所有的 Transport
1 |
|
3. Console Transport 和 File Transport 的 log 函数
通过调用父类 Transport 的 log 函数,格式化日志并输出到 Console、File
4. 格式化日志
Transport 类中,通过调用 utils.format(level, args, meta, options) 对日志进行格式化操作并返回
ctx.logger 与 app.logger 的区别?
app.logger 是 Logger 类的对象,而 ctx.logger 是在 app.logger 的基础上做的封装,是一个 ContextLogger 的对象。app.logger 调用的是 EggApplication 中的logger()
,app.logger 是通过 egg-logger 的 Loggers 类创建,日志输出格式使用 utils.defaultFormatter。
1 |
|
输出示例:2020-12-14 17:42:31,903 INFO 41228 …
ctx.logger 是一个 ContextLogger 对象,调用egg/app/extend/context.js
中的 logger()。该 logger 是在 app logger 的基础上进行了一次封装,添加了 ctx 的 userId、ctx.tracer、method、url 等输出信息。
1 |
|
输出示例:2020-12-14 17:42:32,183 INFO 41228 [-/127.0.0.1/affe8330-3df0-11eb-a788-5fdd50ee8eb3/297ms POST /app/v1/login]…
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!