Skip to content
On this page

hono-logger

简介

hono-logger 是 Hono 框架的日志中间件,它提供了简单而强大的请求日志记录功能。这个中间件可以记录请求的方法、路径、状态码和响应时间等信息,帮助开发者监控和调试应用程序。

安装

bash
npm install hono @hono/logger

基本使用

typescript
import { Hono } from 'hono'
import { logger } from '@hono/logger'

const app = new Hono()

// 使用默认配置
app.use('*', logger())

app.get('/', (c) => {
  return c.text('Hello World')
})

app.post('/users', (c) => {
  return c.json({ id: 1, name: 'User' })
})

app.listen(3000)
// 输出示例: [GET] / 200 0ms
// 输出示例: [POST] /users 200 2ms

高级配置

typescript
import { Hono } from 'hono'
import { logger } from '@hono/logger'

const app = new Hono()

// 自定义日志格式
app.use(
  '*',
  logger({
    // 自定义日志格式
    format: (info) => {
      return `${info.timestamp} [${info.method}] ${info.path} - ${info.status} ${info.responseTime}ms`
    },

    // 自定义时间戳格式
    timestamp: () => {
      return new Date().toISOString()
    },

    // 日志输出函数
    log: (msg) => {
      // 可以使用自定义日志库或写入文件
      console.log(`[Hono]`, msg)
    },
  }),
)

// 条件日志记录
app.use(
  '*',
  logger({
    // 根据条件决定是否记录日志
    skip: (c) => {
      // 跳过健康检查路由的日志
      return c.req.path === '/health'
    },
  }),
)

// 记录请求体和响应体
app.use(
  '*',
  logger({
    // 记录请求体(小心处理大型请求体)
    logRequestBody: true,

    // 记录响应体(小心处理大型响应体)
    logResponseBody: true,

    // 自定义格式以包含请求体和响应体
    format: (info) => {
      let log = `[${info.method}] ${info.path} ${info.status} ${info.responseTime}ms`

      if (info.requestBody) {
        log += `\nRequest: ${JSON.stringify(info.requestBody)}`
      }

      if (info.responseBody) {
        log += `\nResponse: ${JSON.stringify(info.responseBody)}`
      }

      return log
    },
  }),
)

// 不同环境使用不同配置
const isDev = process.env.NODE_ENV === 'development'

app.use(
  '*',
  logger({
    // 开发环境使用彩色输出,生产环境使用简洁格式
    format: isDev
      ? 'dev' // 预定义的开发格式,带颜色
      : 'short', // 预定义的简洁格式

    // 生产环境只记录错误
    skip: !isDev ? (c) => c.res.status < 400 : undefined,
  }),
)

注意事项

  1. 在生产环境中,考虑只记录错误或重要信息,避免日志过于冗长
  2. 小心记录请求体和响应体,它们可能包含敏感信息或过大的数据
  3. 对于高流量应用,日志记录可能影响性能,考虑使用异步日志或采样
  4. 可以结合其他日志库(如 Winston、Pino)进行更复杂的日志管理
  5. 健康检查等频繁调用的端点可以跳过日志记录,减少噪音
  6. 在处理敏感数据时,确保日志中不包含密码、令牌等敏感信息

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命