文章目录
前言
官方文档: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可以记录很多的报错信息、数据库信息、登录信息等,增加系统的可维护性,方便后续的系统维护和漏洞修复。