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
    评论
好的,这是一个比较具体的问题,我尽量给出详细的回答。 首先,你需要了解每个工具的作用: - Node.js: 一个基于 Chrome V8 引擎的 JavaScript 运行时,可用于构建高性能的网络应用程序。 - Midway.js: 一个基于 Egg.js 的 Serverless Node.js 框架,提供了函数计算、API 网关等 Serverless 场景下的解决方案。 - Koa: 一个基于 Node.js 平台的 Web 开发框架,旨在提供更小、更富有表现力、更健壮的 Web 应用程序。 - TypeScript: 是 JavaScript 的一个超集,可以编译成纯 JavaScript。 接下来,你可以按照以下步骤进行开发: 1. 创建一个基于 Midway.js 的应用程序: ``` $ npm init midwayjs-app jsapi ``` 2. 安装需要的依赖: ``` $ cd jsapi $ npm install koa koa-bodyparser koa-router cross-env --save $ npm install @midwayjs/koa @midwayjs/faas @midwayjs/socketio --save $ npm install typescript ts-node @types/node --save-dev ``` 3. 创建 TypeScript 配置文件 `tsconfig.json`: ``` { "extends": "@midwayjs/tsconfig/tsconfig.json", "compilerOptions": { "outDir": "dist", "rootDir": "src" }, "include": ["src"] } ``` 4. 创建一个简单的 TypeScript 控制器: ``` import { Provide, Controller, Get, Post, Body } from '@midwayjs/decorator'; import { Context } from 'koa'; @Provide() @Controller('/api') export class ApiController { @Get('/hello') async hello(ctx: Context) { ctx.body = 'Hello Midwayjs'; } @Post('/share') async share(@Body() body) { const { url } = body; // 解析分享链接 // ... // 返回解析结果 return { title, desc }; } } ``` 5. 创建 Koa 应用程序: ``` import { App, Config, Inject } from '@midwayjs/decorator'; import { ILifeCycle, IMidwayApplication } from '@midwayjs/core'; import { Application } from 'egg'; import * as bodyParser from 'koa-bodyparser'; import * as Router from 'koa-router'; @Config() export class AppConfig implements ILifeCycle { @Inject() app: IMidwayApplication; async onReady() { const app = this.app.getApplication() as Application; // 添加中间件 app.use(bodyParser()); app.use(app.get('koaRouter').routes()); // 启动应用程序 app.listen(3000, () => { console.log('Server listening on http://localhost:3000'); }); } } @App() export class ApiApplication implements ILifeCycle { @Inject() app: IMidwayApplication; async onReady() { const router = this.app.getApplicationContext().get('koaRouter') as Router; router.get('/api/hello', async (ctx) => { ctx.body = 'Hello Koa'; }); } } ``` 6. 启动应用程序: ``` $ npm run dev ``` 7. 使用 curl 或者 Postman 等工具测试 API: ``` $ curl -X GET http://localhost:3000/api/hello ``` ``` $ curl -X POST http://localhost:3000/api/share -d '{"url": "http://example.com"}' ``` 这样,一个基于 Node.js、Midway.js、Koa、TypeScript 的 API 解析程序就完成了。当然,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值