node.js学习笔记(23) log4js

在前面的笔记里讲过express-genrator创建的express项目使用morgan日志,将morgan作为应用级中间件,express项目就会自动记录http访问日志。

Morgan默认了5中日志的格式,也可以让用户自定义日志格式,是一个简单使用的日志中间件。

但是,我用java编程多年,非常清楚log4j的强大与好用。因此,仅仅log4js这个名字就已经让我先入为主了,尽管morgan也是一个不错的日志中间件。

Log4js相比morgan,更加强大,更加贴近java程序员的习惯。

Section 1


让我们从一个简单是例子来开始log4js的体验:

mkdir log4js-examples
cd log4js-examples
npm init
npm install log4js

创建一个log4js-minimal.js文件:

var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Some debug messages");

运行效果:

lee@mypc ~/works/nodejs/study23/log4js-examples $ node log4js-minimal.js
[2016-01-19 19:07:08.258] [DEBUG] [default] - Some debug messages

这就是一个最最简单的log4js实例:启动,debug信息输出到控制台,over。

Section 2

再来一个输出到文件,log4js-file.js:


var log4js = require('log4js');
//console log is loaded by default, so you won't normally need to do this
//log4js.loadAppender('console');
log4js.loadAppender('file');
//log4js.addAppender(log4js.appenders.console());
log4js.addAppender(log4js.appenders.file('logs/cheese.log'), 'cheese');

var logger = log4js.getLogger('cheese');
logger.setLevel('ERROR');

logger.trace('Entering cheese testing');
logger.debug('Got cheese.');
logger.info('Cheese is Gouda.');
logger.warn('Cheese is quite smelly.');
logger.error('Cheese is too ripe!');
logger.fatal('Cheese was breeding ground for listeria.');

 

运行:

lee@mypc ~/works/nodejs/study23/log4js-examples $ node log4js-file.js
[2016-01-19 19:11:16.447] [ERROR] cheese - Cheese is too ripe!
[2016-01-19 19:11:16.452] [FATAL] cheese - Cheese was breeding ground for listeria.
lee@mypc ~/works/nodejs/study23/log4js-examples $ ls logs
cheese.log
lee@mypc ~/works/nodejs/study23/log4js-examples $ cat logs/cheese.log
[2016-01-19 14:02:40.929] [ERROR] cheese - Cheese is too ripe!
[2016-01-19 14:02:40.933] [FATAL] cheese - Cheese was breeding ground for listeria.

运行完,我们可以看到日志输出到文件logs/cheese.log

Section 3

log4js-file.js也可以这样配置,效果是一样的。

log4js-configure.js:

var log4js = require('log4js');
log4js.configure({
    appenders: [
        { type: 'console' },
        { type: 'file', filename: 'logs/cheese-configure.log', category: 'cheese' }
    ]
});

var logger = log4js.getLogger('cheese');
logger.setLevel('ERROR');

logger.trace('Entering cheese testing');
logger.debug('Got cheese.');
logger.info('Cheese is Gouda.');
logger.warn('Cheese is quite smelly.');
logger.error('Cheese is too ripe!');
logger.fatal('Cheese was breeding ground for listeria.');

Section 4

我们在javaEE中使用log4j的时候,总是习惯配置log4j.properties,有没有?!

Log4js也可以从配置文件来读取配置。

configfile.json:

{
  "appenders": [
    { "type": "console" },
    { "type": "file", "filename": "logs/cheese-configfile.log", "category": "cheese" }
  ]
}

log4js-configfile.js:

var log4js = require('log4js');
log4js.configure('configfile.json');

var logger = log4js.getLogger('cheese');
logger.setLevel('ERROR');

logger.trace('Entering cheese testing');
logger.debug('Got cheese.');
logger.info('Cheese is Gouda.');
logger.warn('Cheese is quite smelly.');
logger.error('Cheese is too ripe!');
logger.fatal('Cheese was breeding ground for listeria.');

Section 5

log4js完全想morgan一样当express的中间件用。

来试一下

创建一个项目log-log4js:

express log-log4js
cd log-log4js
#install node-modules
npm install
#install log4js
npm install log4js
#create a directory for save log files
mkdir logs

可以这样修改app.js:

...
//var logger = require('morgan');
var log4js = require('log4js');
...
//app.use(logger('dev'));
log4js.configure({
  appenders: [
    { type: 'console' }, //控制台输出
    {
      type: 'file', //文件输出
      filename: 'logs/access.log',
      maxLogSize: 1024,
      backups:3,
      category: 'normal'
    }
  ]
});
var logger = log4js.getLogger('normal');
logger.setLevel(log4js.levels.INFO);
app.use(log4js.connectLogger(logger, {level:log4js.levels.INFO}));
...

运行并测试log-log4js:

npm start

curl http://localhost:3000/
curl http://localhost:3000/users

这时,可以看到logs有一个日志文件access.log

lee@mypc ~/works/nodejs/study23/log-log4js $ ls logs
access.log
lee@mypc ~/works/nodejs/study23/log-log4js $ cat logs/access.log
[2016-01-22 20:40:54.977] [INFO] normal - ::ffff:127.0.0.1 - - "GET / HTTP/1.1" 200 170 "" "curl/7.35.0"
[2016-01-22 20:41:03.245] [INFO] normal - ::ffff:127.0.0.1 - - "GET /users HTTP/1.1" 200 23 "" "curl/7.35.0"
[2016-01-22 20:41:05.817] [INFO] normal - ::ffff:127.0.0.1 - - "GET / HTTP/1.1" 200 170 "" "curl/7.35.0"
[2016-01-22 20:41:07.422] [INFO] normal - ::ffff:127.0.0.1 - - "GET /users HTTP/1.1" 200 23 "" "curl/7.35.0"

Section 6

看到这儿,有没有发现section2中的代码输出了很多日志信息,而在日志文件中却只有两行。

Log4js一定有比morgan更强大的地方,否则它就不配叫log4js。

Log4js的输出级别有6个,从低到高分别是 trace, debug, info, warn, error, fatal。

在section2的实例中,设置了log的输出级别是error,所以低于error级别的trace,debug,info和warn都没有输出。

设置输出级别的好处尤其体现在测试环境和生产环境,测试环境中跟踪测试,往往需要非常详细的debug信息,而在生产环境中运行稳定版本则不需要过多的日志信息,只需要必要的warn,error或fetal。

时间: 2024-09-11 13:16:36

node.js学习笔记(23) log4js的相关文章

Node.js 学习笔记之简介、安装及配置

 本文是Node.js学习笔记系列文章的第一篇,主要给大家讲解的是在Windows和Linux上安装Node.js的方法.软件安装版本以0.12.0为例.希望大家能够喜欢.     简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 谁适合阅

node.js学习笔记(9) 和谐模式

众所周知,ECMAScript 是一种开放的.国际上广为接受的脚本语言规范. 它本身并不是一种脚本语言.正如在 Web 应用程序中执行有用操作的 bean 集合(例如,Netscape 的 AWT)是 Sun 的 JavaBean 规范的一种实现一样,JavaScript 是 ECMAScript 规范的一种实现. 2015年6月17日,ECMA国际发布了EcmaScript2015,即EcmaScript6(以下简称ES6)草案的正式版.ES6是继ES5之后的一次主要改进,语言规范由ES5.1

node.js学习笔记(16) child_process(三)

学习过前两篇笔记的源码分析,再来应用child_process的7个方法就不难理解了. By default, pipes for stdin, stdout and stderr are established between the parent Node.js process and the spawned child. 默认情况下,Node.js主进程和子进程间就会建立三个管道:stdin.stdout和stderr,即标准输入流.标准输出流和标准错误流. 如今热播的<芈月传>中有一段

node.js学习笔记(0) 前记

学习笔记原本是从1开始的,然而为了永远"怀念"已经离职的钱童鞋,我决定补上一篇.话说,程序员的数数不都是从0开始的吗. 初识node.js大概是一年前的这个时候,钱童鞋来单位面试,简历上的其中一项技能是node.js.当时我还傻傻的以为又是一个类似jquery的js框架-- 过完年,钱童鞋入职,然后慢慢得熟悉,交流得越来越多,也就慢慢得知node.js的众多优点. google的V8引擎 高速IO 非阻塞 异步回调 单线程 事件驱动 ... 然并卵,吸引我的却是javascript.在

node.js学习笔记(26) node-orm进阶一

上一个笔记中,我们已经认识了node-orm,它可以支持mongodb.mysql.postgres.  redshift. _shared和sqlite. 之所以能支持这么多中数据库,是因为node-orm的lib中有对各种数据库支持的backend脚本,可以看一下orm/lib/Drivers/DML目录下的文件有mongodb.js.mysql.js.postgres.js.redshift.js._shared.js.sqlite.js.这其中的每一个脚本其实都是对各种数据库驱动的封装,

node.js学习笔记(24) 箭头函数

11月下旬,我安装了Node.js-v5.1.0开始学习和使用Node.js. 然而Node.js开发团队在12月发布了v5.1.1,v5.2.0,v5.3.0,16年1月又发布了v5.4.0,v5.4.1,v5.5.0.这速度,是要坐火箭才能赶上呀-- 言归正传,第一次看到"=>"这个符号是在v5.4.0的api文档中.文档中频繁出现这样的代码示例: ()=>{ ... } 通过查Node.js的更新说明得知,这就是箭头函数,是ES6的新特性,Node.js从v5.4.0

node.js学习笔记(21) express日志

创建一个新的express项目,然后运行: mkdir study21 cd study21 express log-morgan cd log-morgan npm install npm start 再用curl,测试http request: curl http://localhost:3000 curl -d '' http://localhost:3000 curl http://localhsot:3000/users curl -d '' http://localhost:3000

node.js学习笔记(2) node包管理器--npm

npm(node package manager),是node.js的一个包管理器,用于第三方模块的下载.安装和管理. npm收录着庞大而丰富的第三方资源,截至目前为止已经收录了220102个包.npm之于node.js,其重要程度可比maven与java.pip与python. 一.npm安装 npm的安装非常简单,在linux下只要一条命令即可完成安装,如下: apt-get install npm 安装完后,运行"npm"命令检查一下是否安装成功,出现如下提示说明安装成功: le

node.js学习笔记(13) global objects

Global objects可简单地译为全局对象,但它又不全是全局对象.Global objects 其实包括真正的全局对象和模块级的全局对象. 来看看它们分别有哪些吧. 真正的全局对象 Class: Buffer setInterval(cb, ms) setTimeout(cb, ms) clearInterval(t) clearTimeout(t) console global process 模块级的全局变量 __dirname __filename require() module