Nodejs log4js日志管理详解

最近用到nodejs日志模块--log4js,弥补一下之前大致使用的迷惑。先看下图总览,接下来,主要由浅入深的记录log4js的常见配置。

image.png

第一部分 入口【收集日志】

所谓的入口,其实就是所谓的收集日志信息,如何有效、分门别类的收集所需信息,使我们记录日志文件的第一步,当然,日志的作用就不在此啰嗦了。
log4js提供了等级分类别名分类

配置

npm install log4js

1.1 等级分类

创建文件testLog4.js,

//testLog4.js
var log4js = require('log4js');
//logger 是log4js的实例
var 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');

结果为

image.png

类似于console实例中的log/error等,这里先实例化log4js,采用不同的等级输出不同的信息。等级有低到高颜色渐变。

image.png

以上图片剽窃自Node.js 之 log4js 完全讲解.

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

分等级不就是为了便于查找么,第一种分类法到此结束。

1.2 类型分类

实例化log4js时指定一个别名,然后在日志中可以方便区分哪个文件等。

//testLog4.js
/*
  类型分类
 */
//实例化时,唯一可以传的一个参数category
var 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');

如下图

image.png

一图胜前言,收集日志的方法都有了,具体的使用方法,后续罗列,紧接的任务就是如何保存?

第二部分 出口【输出日志】

2.1 Appender

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

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

结果保存在123.log中:

//123.log
[2017-09-23 16:01:59.940] [INFO] appenders - this no error
2.1.2 datefile保存

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

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

结果:

//234-2017-09-23.log
[2017-09-23 16:17:06.764] [INFO] [default] - this is datefile

2.1.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

})

var 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');

var 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');

结果筛选如下

image.png

第三部分 layout配置

暂缓

第四部分 实例配置Express+log4js

4.1 需求一

  1. 每天生成一个日志文件,放在/logs目录下,名字如2017-09-23.log;
  2. 单独将log4js配置在一个文件中,外界不需要每次配置;
  3. 记录客户端请求的HTTP状态码、URL、方法。
  4. 终端显示所有日志信息,日志文件只记录WARN以及以上级别的信息。

GitHub--地址

配置文件:logConfig.js

var log4js = require('log4js');
const fs = require('fs');

levels = {
    'trace': log4js.levels.TRACE,
    'debug': log4js.levels.DEBUG,
    'info': log4js.levels.INFO,
    'warn': log4js.levels.WARN,
    'error': log4js.levels.ERROR,
    'fatal': log4js.levels.FATAL
};

function judgePath(pathStr) {
    if (!fs.existsSync(pathStr)) {
        fs.mkdirSync(pathStr);
        console.log('createPath: ' + pathStr);
    }
}

log4js.configure({
  appenders:[
    //控制台输出
    {"type": "console"},
    {type: 'dateFile',
    //文件名为= filename + pattern, 设置为alwaysIncludePattern:true
    filename: 'logs/', // 需要手动创建此文件夹
    pattern: 'yyyy-MM-dd.log',
    //包含模型
    alwaysIncludePattern: true,
  }],
  replaceConsole: true // 替换 console.log
})

exports.logger = function (name, level) {
    var logger = log4js.getLogger(name);
    //默认为debug权限及以上
    logger.setLevel(levels[level] || levels['debug']);
    return logger;
};

exports.use = function (app, level) {
  //加载中间件
    app.use(log4js.connectLogger(log4js.getLogger('logInfo'), {
        level: levels[level] || levels['debug'],
      //格式化http相关信息
        format: ':method :url :status'
    }));
};

app.js使用中间件

var log4js = require('./config/logConfig.js');
var app = express();
log4js.use(app);

index.js中使用log4js

var express = require('express');
var router = express.Router();
//category名字为inde.js 只收录warn以及以上权限信息
var logger = require('../config/logConfig.js').logger('index.js', 'warn');

/* GET home page. */
router.get('/', function (req, res, next) {
  //不显示
    console.log('This is an index page!');
    logger.trace('This is an index page! -- log4js');
    logger.debug('This is an index page! -- log4js');
    logger.info('This is an index page! -- log4js');
    logger.warn('This is an index page! -- log4js');
    logger.error('This is an index page! -- log4js');
    logger.fatal('This is an index page! -- log4js');

    res.render('index', {title: 'log4js'});
});
module.exports = router;

4.2 需求二

2.x版本的区别

log4js.configure(...); // set up your categories and appenders
const logger = log4js.getLogger('console');
console.log = logger.info.bind(logger); // do the same for others - console.debug, etc.

log

暂缓

参考列表

Node.js 之 log4js 完全讲解
log4js-Node.js中的日志管理模块使用与封装
Log4js配置详解
nodejs开发——log4js学习
大搜车NodeJS日志规范化与分析监控
基于node+express+log4js的前端异常信息监控
node.js项目中使用log4js保存日志文件

更多精彩内容请关注“IT实战联盟”哦~~~


IT实战联盟.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容