日志记录是任何 Web 应用程序的重要组成部分,能够帮助开发人员快速定位和解决应用程序中的错误和问题。作为一个流行的 Node.js Web 框架,Express.js 提供了一些内置的日志记录工具和中间件,使开发人员能够在应用程序中方便地记录和管理日志。
日志的使用场景
在编写 Web 应用程序时,我们通常需要记录以下类型的日志:
- 请求日志:记录每个请求的 URL、HTTP 方法、响应状态码和响应时间等信息,以及请求所消耗的时间。
- 错误日志:记录应用程序中发生的错误、异常和警告等信息。
- 访问日志:记录指定目录或文件的访问记录,可以用于应用程序的安全审计或性能监控等。
中间件日志记录
Express.js 提供了两个内置的中间件来记录请求的日志:morgan
和 express-pino-logger
。
使用 Morgan
Morgan 是一个 Node.js 模块,用于记录 HTTP 请求的信息。它支持几种不同的日志格式,其中默认格式是如下所示:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ------------------ ----- --- - ---------- ---------------------------- ------------ ----- ---- -- - --------------- --------- --- ----- ------ - ---------------- -- -- - ------------------- --------- -- ---- --------------------------- ---
在上面的代码中,我们使用 morgan
中间件来将请求日志打印到控制台,并将记录的日志输出格式设置为 combined
。这样每次请求都会在控制台中输出类似于下面这样的信息:
::1 - - [31/Mar/2019:20:22:51 +0800] "GET / HTTP/1.1" 200 13 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
除了默认格式外,Morgan 还提供了其他一些格式,可以根据自己的需求进行配置,如下所示:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ------------------ ----- --- - ---------- -- -- --- -- ----------------------- -- -------- ----------------------- ---- ------- -------------------- - -------------- ------ ------------ ----- ---- -- - --------------- --------- --- ----- ------ - ---------------- -- -- - ------------------- --------- -- ---- --------------------------- ---
使用 express-pino-logger
express-pino-logger
是一个基于 Pino 的 Express.js 中间件,用于记录请求日志。它可以提供非常快速和低消耗的日志记录服务,支持多种日志格式,并且可以很容易地与其他 Pino 插件集成。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---- - --------------------------------- ----- --- - ---------- -------------- ------------ ----- ---- -- - --------------- --------- --- ----- ------ - ---------------- -- -- - ------------------- --------- -- ---- --------------------------- ---
在上面的代码中,我们使用 express-pino-logger
中间件来将请求日志记录到控制台。这样每次请求都会在控制台中输出类似于下面这样的信息:
{"level":"info","time":1532039012119,"pid":10023,"hostname":"localhost","req":{"method":"GET","url":"/","headers":{"host":"localhost:3000","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","accept-encoding":"gzip, deflate, br","accept-language":"zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7"},"remoteAddress":"::1","remotePort":64701},"responseTime":10,"res":{"statusCode":200}}
相比于 morgan
,使用 express-pino-logger
可以更好地支持 JSON 格式的日志,并可以方便地进行定制和插件集成。
自定义日志记录器
如果默认的日志格式不能满足您的需求,那么您可以通过创建自定义日志记录器来实现更高级的日志记录操作。以下是一个示例:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ------------------ ----- -- - -------------- ----- ---- - ---------------- ----- - ------------- ------- ---------- - - ------------------- -- -------- ----- ------ - -------------------- ------- -- -------- --------------------- -- --------------------- -- ------- ----- ------ - -------------- ------ -------- ------- --------------- ------------------ ------- ----------- ---------- --- -------------------- -- - ------ ------------------ -------------- ----------------- --- -- ----------- - --- ----------------- --------- ----------------- ----------- ------ ------- --- --- -------------------- ------ -------- --- -- --- ----- --- - ---------- -- ---------- -------------------------- - ------- ------------- ---- ------------ ----- ---- -- - --------------- --------- --- ----- ------ - ---------------- -- -- - ------------------- --------- -- ---- --------------------------- ---
在上面的代码中,我们使用 winston
创建了一个自定义日志记录器,并将请求日志记录到配置的文件和控制台中。morgan
中间件将请求日志输出到该记录器。
这个自定义日志记录器确保了更高级的日志记录操作,包括特定格式的时间戳、级别和信息,以及将日志写入文件和控制台等。
结论
日志记录是 Web 开发不可或缺的组成部分,能够帮助开发人员快速分析和解决应用程序中的问题。在 Express.js 中,我们可以使用内置的中间件 morgan
和 express-pino-logger
来记录请求日志,也可以通过自定义日志记录器来实现更高级的日志记录操作。无论您选择什么方式,始终要确保您的日志记录器能够提供有意义、详细和易于管理的日志信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6718ad44ad1e889fe22d4a9f