koa+ts+mysql后台开发——(四)采用log4js收集日志


前言

官方文档:https://npmmirror.com/package/log4js

先看下图总览,接下来,主要由浅入深的记录log4js的常见配置。
在这里插入图片描述


一、log4js的日志级别

import log4js from 'log4js'
//logger 是log4js的实例
const logger = log4js.getLogger();
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');

下面用一张图来说明日志级别,类似于console实例中的log/error等,这里先实例化log4js,采用不同的等级输出不同的信息。等级有低到高颜色渐变。
在这里插入图片描述

很直观的将不同的等级的日志分类。一方面方便了我们查看终端日志,另外之后在过滤中同样可以起到作用。

二、出口【输出日志】

1.appender(输出位置)

刚我们只是初始化实例,以不同的类型、等级输出。默认为console输出,如何保存在文件中,就是appender上场了。
在这里插入图片描述

这里指定输出的类型和位置

log4js.configure({
  //是appenders,不是单数
  appenders:[{
      //以文件格式存储
      type: 'file',
      //自动创建123.log文件
      filename: '123.log'
    }]
})
let logger = log4js.getLogger('appenders');
logger.info('this no error');

2.datefile保存(指定日期格式的保存)

最简单的日期保存例子,将日志保存在日志文件中,以天为单位。

/*
  dateFile,根据时间保存文件位置,文件自动创建
 */
log4js.configure({
  appenders:[{
    type: 'dateFile',
    //文件名为= filename + pattern, 设置为alwaysIncludePattern:true
    filename: '234',
    pattern: '-yyyy-MM-dd.log',
    //包含模型
    alwaysIncludePattern: true,
  }]
})
let logger = log4js.getLogger();
logger.info('this is datefile');

3.levelFilter 过滤筛选

筛选出不同类型的日志。

/*
  loglevelFilter 过滤筛选
 */
log4js.configure({
  appenders:[
    //控制台输出
    {"type": "console"},
    { //日志过滤
      type: 'loglevelFilter',
      //  权重大于或者等于level【debug】的日志将会输出
      level: 'WARN',
      //筛选model1
      category: 'model1',
      // 同时支持数组
      // category:['model1', 'model2'],
      appender:{
        type: 'file',
        filename: '345.log'
      }
    }
  ],
  "replaceConsole": true // 替换 console.log
})

let logger = log4js.getLogger('model1');
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');

let logger = log4js.getLogger('model2');
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');



项目中使用

tips 配置项最好写在统一的config.ts文件夹中

一、引入

npm i log4js -S

二、项目中引入

1、logger.ts入口文件

import { configure, getLogger } from "log4js";
import config from '../config'

configure(config.logConfig); // 配置的配置文件

export const dbLogger = getLogger('db')
export const accessLoger = getLogger('http')
export default getLogger()

2、log4js配置文件

上面 config.logConfig 代表的对象

{
  "appenders": {
    "access": {
      "type": "dateFile",
      "filename": "logs/access.log",
      "pattern": "-yyyy-MM-dd",
      "category": "http"
    },
    "db": {
      "type": "dateFile",
      "filename": "logs/db.log",
      "pattern": "-yyyy-MM-dd",
      "category": "http"
    },
    "app": {
      "type": "file",
      "filename": "logs/app.log",
      "maxLogSize": 10485760,
      "numBackups": 3
    },
    "errorFile": {
      "type": "file",
      "filename": "logs/errors.log"
    },
    "errors": {
      "type": "logLevelFilter",
      "level": "ERROR",
      "appender": "errorFile"
    }
  },
  "categories": {
    "default": { "appenders": ["app", "errors"], "level": "DEBUG" },
    "http": { "appenders": ["access"], "level": "DEBUG" },
    "db": { "appenders": ["db"], "level": "DEBUG" }
  }
}

3、区分开发、生产环境引入不同的配置

// log4j 配置
const NODE_ENV = process.env.NODE_ENV || 'dev'; // 获取当前环境
const logConfig = require('./' + NODE_ENV + '/log4js.json'); // 引入当前环境的配置文件

const config = {
  server: {
    port: process.env.SERVER_PORT,
  },
  db: {
    db_host: process.env.DB_HOST,
    db_name: process.env.DB_NAME,
    db_user: process.env.DB_USER,
    db_password: process.env.DB_PASSWORD,
    db_port: process.env.DB_PORT
  },
  logConfig: logConfig, // log4js配置文件
  jwt: {
    jwt_secret: process.env.JWT_SECRET,
    jwt_expire: process.env.JWT_EXPIRE
  },
  isValidateCaptcha: true, // 是否校验验证码
}

export default config

目录结构如下:
在这里插入图片描述


记录登录信息(浏览器标识、ip、请求方式)

1、结合上面的 logger.ts代码片段使用。
2、该中间件请在 koa的路由当中使用。

import { Context, Next } from "koa";
import { accessLoger } from '../logger'

// 获取 ip信息
const getIp = function (req: Object | any) {
  let ip = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddres || req.socket.remoteAddress || '';
  if (ip.split(',').length > 0) {
    ip = ip.split(',')[0];
  }
  return ip;
};

function AccessLogMiddleware(ctx: Context, next: Next) {
  // console.log(ctx.req)
  // console.log(getIp(ctx.req))
  const logStr = `path:${ctx.path} | method:${ctx.method} | ip:${getIp(ctx.req)} | ua:${ctx.header["user-agent"]}`
  accessLoger.info(logStr)
  return next()
}

export default AccessLogMiddleware

总结

log4js可以记录很多的报错信息、数据库信息、登录信息等,增加系统的可维护性,方便后续的系统维护和漏洞修复。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值