node.js学习笔记(23) log4js

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

在前面的笔记里讲过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。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
开发框架 JavaScript 中间件
中间件应用Koa.js(Node.js)
我们添加了两个中间件。第一个中间件记录请求的开始时间,并在下一个中间件执行完毕后计算并打印出请求的总时间。第二个中间件与之前的示例相同,它设置响应体为 "Hello World"
20 6
|
15天前
|
JavaScript 前端开发 持续交付
【专栏】Vue.js和Node.js如何结合构建现代Web应用
【4月更文挑战第27天】本文探讨了Vue.js和Node.js如何结合构建现代Web应用。Vue.js作为轻量级前端框架,以其简洁易懂、组件化开发、双向数据绑定和虚拟DOM等特点受到青睐;而Node.js是高性能后端平台,具备事件驱动、非阻塞I/O、丰富生态系统和跨平台优势。两者结合实现前后端分离,高效通信,并支持热更新、持续集成、跨平台和多端适配,为开发高性能、易维护的Web应用提供强有力的支持。
|
1月前
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
|
5天前
|
JavaScript 中间件 API
中间件应用Express.js(Node.js)
我们定义了一个名为 `logger` 的中间件函数。它接受请求对象、响应对象以及下一个中间件函数作为参数。当接收到请求时,它会打印出请求的 HTTP 方法和 URL,然后调用 `next()` 函数来将控制权传递给下一个中间件或路由处理器。我们使用 `app.use()` 方法将 `logger` 中间件添加到了应用级别的中间件堆栈中,这意味着它将对所有请求生效。
12 3
|
12天前
|
JavaScript 前端开发 开发工具
【JavaScript 技术专栏】Node.js 基础与实战
【4月更文挑战第30天】本文介绍了Node.js的基础及应用,包括事件驱动的非阻塞I/O、单线程模型和模块系统。内容涵盖Node.js的安装配置、核心模块(如http、fs、path)及实战应用,如Web服务器、文件操作和实时通信。文章还讨论了Node.js的优劣势、与其他技术的结合,并通过案例分析展示项目实施流程。总结来说,Node.js是高效后端开发工具,适合构建高并发应用,其广阔的应用前景值得开发者探索。
|
13天前
|
JavaScript API 开发者
深入了解Node.js的文件系统:Node.js文件系统API的使用与探索
【4月更文挑战第30天】本文深入探讨了Node.js的文件系统API,介绍了如何引入`fs`模块进行文件操作。内容包括异步读取和写入文件、删除文件、创建目录以及使用文件流进行高效操作。此外,还提到了文件系统的监视功能,帮助开发者全面掌握在Node.js中处理文件和目录的方法。
|
18天前
|
移动开发 JavaScript 前端开发
webgl学习笔记3_javascript的HTML DOM
webgl学习笔记3_javascript的HTML DOM
19 0
webgl学习笔记3_javascript的HTML DOM
|
18天前
|
JavaScript 前端开发 Java
webgl学习笔记2_javascript基础快速学习
webgl学习笔记2_javascript基础快速学习
19 0
|
19天前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8引擎的JavaScript运行时,用于服务器端编程。以其事件驱动、非阻塞I/O模型著称,适用于高并发和实时应用。常见用途包括:构建Web服务器、实时应用(如聊天)、API服务、微服务、工具和命令行应用,以及搭配Electron开发桌面软件。
20 1
|
1月前
|
小程序 开发工具 开发者
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
22 1