log4js快速写一个Node服务访问日志

log4js是Node.js中非常棒的日志模块,使用起来非常简单且好用。这一篇和大家分享下如何很快的写一个日志记录服务,因为node的中间件模式,所以我们将日志服务写为一个中间件。

下面将以koa为例写一个访问日志中间件

安装log4js

npm install log4js
复制代码

log4js配置讲解

log4js.configure({
  appenders: {
    visitor: {
      type: "dateFile", 
      filename: `./logs/visitor-`,
      pattern: ".yyyy-MM-dd.log",
      alwaysIncludePattern: true,
      daysToKeep: 30,
      layout: {
        type: "messagePassThrough"
      }
    }
  },
  categories: { default: { appenders: ["visitor"], level: "info" } }
});
复制代码

appenders.visitor我们做了一些个性化配置,为什么要这样做呢?

  • type: "dateFile":日志文件可以安特定的日期模式滚动,例如今天输出为visitor-2019-03-08.log,明天输为visitor-2019-03-09.log
  • filename: './logs/visitor.log':设置log输出的文件路劲和文件名
  • alwaysIncludePattern: true: 和上面同时使用 设置每天生成log名
  • daysToKeep: 30: 日志只保存30天 layout.type 我们设为messagePassThrough,不适用log4js提供的日志模版,完全使用自己的代码,这样做的好处是当我们的日志要和阿里云日志关联的时候必须要写成JSON的,为了方便查询以及可控性,我们要使用自己的定义的JSON。

完整代码

const log4js = require("log4js");
log4js.configure({
  appenders: {
    visitor: {
      type: "dateFile", 
      filename: `./logs/visitor.log`,
      alwaysIncludePattern: true,
      daysToKeep: 30,
      layout: {
        type: "messagePassThrough"
      }
    }
  },
  categories: { default: { appenders: ["visitor"], level: "info" } }
});
const logger = log4js.getLogger("visitor");

module.exports = function() {
  return async function(ctx, next) {
    const start = new Date();
    await next();
    // 根据文件结尾筛选
    const index = ctx.url.lastIndexOf(".");
    const ext = ctx.url.substr(index + 1);
    const extArr = ["js", "png", "otf", "txt", "html", "xml", "json", "ico"]; 
    if (extArr.indexOf(ext) === -1 ) {
      const end = new Date();
      // 这里是取nginx反向代理后的ip信息, ctx.ip + "i"这个是给坏人准备的,如果ip结尾带了i且不是你们公司的ip,那是有很大概率是坏人的。如果你们没有使用nginx那就只取 ctx.ip。
      const Uip =
        ctx.get("HTTP_X_REAL_IP") ||
        ctx.get("X-Read-IP") ||
        ctx.get("HTTP_X_FORWARDED_FOR") ||
        ctx.get("X-Forwarded-For") ||
        ctx.get("Remote_Addr") ||
        ctx.ip + "i";
      let data = {
        startTime: start.toJSON(),
        endTime: end.toJSON(),
        uri: ctx.url,
        ip: Uip || "",
        status: ctx.status,
        referrer: ctx.headers.referer || "",
        msec: end - start,
        ua: ctx.header["user-agent"]
      };
      logger.info(JSON.stringify(data));
    }
  };
};

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值