nodejs 中如何使用log4js

因为log4js-node从log4js移植而来,两者并不属于同一个模块,也有很多区别,下面为了区分和防止误解统一使用“log4js-node”这个名称,注意nodejs代码中引入模块时还是要用“require(‘log4js’)”。

1. 快速开始

先看一下使用log4js-node 最简单的代码:

运行的结果如下:

首先log4js-node将输出的log分为六个的level,每个level的含义从字面就可以看出, 对于不同的level,log输出到终端时会使用不同的颜色(trace: 蓝色,debug: 青色, info:绿色,warn:***,error:红色, fatal:粉色)。终端是log4js-node的默认输出地点。

默认情况下,log4js-node的每条log输出格式有如下几个字段:日志产生时间,level,日志分类,日志内容。如果用户没有配置,日志分类字段为“default”。

完全使用默认设置的话功能比较简单,对于较复杂的业务是无法满足需求的,比如需要将日志存储到文件,需要将日志进行分类输出等,所以我们需要对其进行相应的设置,这个在后文中会详细探讨。

2. 基本配置和基本分类


代码,注意用户需要先在项目目录下创建名为“logs”的目录:

终端结果:

__dirname/logs/login.log文件中输出结果,其中__dirname是项目根目录:

__dirname/logs/signup.log文件中得输出结果:

代码中我们调用了log4js-node的configure函数,该函数中我们传入了一个json对象,json对象中我们为log4js-node指定了三个appender,分别是一个终端和两个文件。我们也为两个文件appender指定了存储文件路径,和分类,路径决定了每个appender输出的log所存储文件的位置和名称,分类对应于前文提到的日志输出格式的分类字段。一个appender相当于一个日志输出目标,该目标决定了对应日志的输出格式,存储位置等。

指定不同的appender后,我们在调用log4js-node的getLogger()时需要指定对应的appedner的分类名,比如“getLogger(‘login’)”, 如果不指定默认为输出到终端的appender。

我们还可以以配置文件的方式来提供配置,只需要将文件路径传给log4js-node的configure的函数即可,效果一样。上面的配置我们改为以下实现方式,首先我们在项目的根目录下新创建一个“conf”目录(这里的名称可以根据自己的情况随意取),然后将如下配置内容存到conf目录下,并命名为“log4js_conf.json”(这里的文件名称也可以随便取,但后缀名要为.json):

然后我们将之前代码中的log4js.configure()调用语句改为:log4js.configure(__dirname + ‘/conf/log4js_conf.json’)。运行后结果与前面相同。注意文件配置时, filename对应的路径默认从app的根目录开始。

到这里,我们已经能够将日志进行分类输出,并存储到不同的文件当中,这已经能够满足一般的业务需求了。但是,如果我们想定制日志的输出格式该怎么办呢?另外,目前日志虽然分到不同的文件中,但是每个文件都是无限增长的,话句话说如果日志足够多的话,我们的单个日志文件将会非常大,这为我们打开日志文件和分析日志增加了难度,如何才能解决这个问题呢?这些问题我们将在后文种做详细介绍。

3. 高级设置

3.1. 为log设置不同的level

设置log level有两种主要的方式,一种是在代码中通过调用每个logger的setLevel函数,另外一种是在配置文件中加入levels选项。首先看第一种,我们为之前的两个logger“loginLogger4js”和“signupLogger4js”分别调用setLevel函数,具体如下:

终端输出结果如下:

然后我们将第一种方式的setLevel函数调用去掉,换用第二种方式,在之前的配置文件“log4js_conf.json”中加入level配置选项如下:

终端的输出结果如下,与第一种方式相同:

当然我们还可以,直接设置全局的level,这样我们就不用为每个logger单独配置了,如果全局配置和具体logger的配置同时存在,那么log4js-node会以具体logger的配置为准。全局level也是两种方式:代码中和文件中。首先看前者,我们将之前的每个logger的level配置代码都去掉,然后再代码中加入如下一句:

运行结果如下:

第二种全局level配置方式,我们把配置文件“log4js_conf.json”内容改为如下:

运行结果如下:

3.2. 将日志文件分开存储

这个配置并不是使用所有的appender的,比如在console就是不需要的,这里只讨论appender 的type为’file’的情况。首先我们看一下log4js内置的file appender的初始化函数:

从注释中我们就可以看书第三个参数“logSize”和第四个参数“numBackups”决定了是否要分割日志文件,每个日志文件的最大容量,以及最大的文件数。这两个参数对应于配置中的“maxLogSize”和“backups”选项, 前者单位是bytes, 后者单位是个。接着前面的例子,我们在将配置文件改为如下内容(后面内容我们统一用配置文件的方式):

生成的日志备份如下:

若果超出了总大小旧的文件会被覆盖掉。

<未完待续>

时间: 2024-10-15 03:43:54

nodejs 中如何使用log4js的相关文章

Node.js(十二)——NodeJs中的Promise

爬虫基于回调和事件的方式去实现,回调也是被诟病已久的问题尤其是callback这种,无论是阅读还是调试都很费劲,甚至我们连代码的堆栈都看不到,这是一种反人类的写法,Promise来拜托这种痛苦的方式 传统方式实现动画效果: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Promise animation</title> <style&g

[转]nodejs中的process模块--child_process.exec

1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行. 在下面例子中,setTimeout里面的语句是没有办法执行到的. 1 process.on('exit', function () { 2 setTimeout(function () { 3 console.log('This will not ru

nodejs中aes-128-cbc加密和解密

和java程序进行交互的时候,java那边使用AES 128位填充模式:AES/CBC/PKCS5Padding加密方法,在nodejs中采用对应的aes-128-cbc加密方法就能对应上,因为有使用向量(iv),所以nodejs中要用createCipheriv方法,而不是createCipher. 在这类加密和解密的计算中,最最要注意的就是中文编码问题,不然铁定采坑.我踩完坑了,把能跑的代码发上来下,运行环境nodejs 4.4.6. var crypto = require('crypto

nodeJS中npm常见的命令

常用的nodeJS中npm的命令:npm主要是node包管理和发布的工具.npm常用的命令:1:npm install <name> //(下载包) 下载后的包放在当前路径下面 npm install express 下载express模块2:npm install <name> -g //-g 将包安装到全局环境中,我PC的全局环境是:C:\Users\qinbb\AppData\Roaming\npm,但是在代码中直接通过require()的方式是没有办法调用全局安装的包的3:

在NodeJS中玩转Protocol Buffer

Protocol Buffer入门教程 Protocol Buffer是个什么鬼 NodeJS开发者为何要跟Protocol Buffer打交道 在NodeJS中实践Protocol Buffer协议 选择支持protobuf的NodeJS第三方模块 一个栗子 书写proto文件 编译 proto 文件 编写 Writer 编写Reader 运行结果 再举一个栗子 编写proto 编写client 书写server 运行结果 其他高级特性 嵌套Message Import Message 总结一

通读cheerio API ——NodeJs中的jquery

通读cheerio API ——NodeJs中的jquery 所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各位不吝告诉我,然后一起把这个翻译完成. ###cheerio 为服务器特别定制的,快速.灵活.实施的jQuery核心实现. ###Introduction 将HTML告诉你的服务器 var cheerio = require('cheerio'), $ = cheerio.load('<h2 cla

【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports

nodejs中一个js文件就可以看做是一个模块 在node环境中,可以直接var a=require('模块路径以及不带扩展名的模块名') exports---module.exports 其中node准备好了module变量, var module={ id:'hello', exports:{} }; 输出模块变量,最好都用module.exports=''或者函数;当赋值不是函数或者数组时,可以对exports直接赋值,建议统一使用module.exports=进行赋值

Nodejs中的流

Nodejs中的很多地方都用到了流,流是一个很常见的概念,一个http请求,控制台输入输出的形式都是流.流可以分为三种: 可读流 可写流 既能读又能写 其中第三种流又可以分为全双工流Duplex和转换流Transform,另外,所有的流都是EventEmitter的实例,也就是有发送事件和处理事件的能力. 可读流 Readable Stream 可读流可以输出数据,常见的可读流有: http请求和响应 读文件 压缩解压 加密解密 tcp sockect 进程输入 可读流分为两种模式:流式的和非流

nodejs中exports与module.exports的实践

只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等>”怪异的串联用法,一问原因,貌似都是云里雾里,如此写法更像是保守的防止性写法. 这种问题除了看源代码外,只能写点代码进行求证. 写了两个模块文件,provider.js产生任意类型的对象, customer.js返回并输出provider对象. 第一种情况: provider.js,直接在exports上