Home
log4js-node是对log4js做了一些更改,从而可以更好的运行在node环境中。
尽管名称和Java框架log4j很像,但它们的表现并不相同。
Features
- 记录彩色日志到stdout和stderr。
- 记录日志到文件,并且可以根据文件大小和日期动态的创建新的日志,并压缩保存旧的日志。
- SMTP appender
- GELF appender
- Loggly appender
- Logstash UDP appender
- logFaces (UDP and HTTP) appender
- multiprocess appender (当存在多个服务或进程,但是希望对日志进行集中管理的时候贼拉有用)
- a logger for connect/express servers
- configurable log message layout/patterns
- different log levels for different log categories (make some parts of your app log as DEBUG, others only ERRORS, etc.)
- built-in support for logging with node core’s cluster module
Installation
npm install log4js
Usage
一个最简单的示例:
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.level = 'debug'; // default level is OFF - which means no logs at all.
logger.debug("Some debug messages");
License
Apache 2.0 License
API
configuration
log4js.configure(object || string)
如果参数为string类型,则被当做为配置文件路径,则该配置文件必须为JSON文件。
如果参数一个配置对象,则至少要定义一个appender和默认的category。具体参数如下:
Configuration Object
levels(optional,object)
自定义日志的level,或重新定义已存在level。
该值是一个键值对,key为string类型作为level名称;value为object,需要具备2个属性:value(integer)和colour。
level代表一条日志消息的重要性,通过integer的value属性对所有level进行排序。有以下默认的level:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < MARK < OFF (其中OFF被用来关闭日志,并不作为真正的日志分级,例如调用logger.off('some log message')毫无意义)。
通过该配置参数可以额外定义level,如果定义的level名称和默认的level名称一致,则覆盖掉默认的value值。
level名称必须以字母开头,且只能包含字母、数字、下划线。appenders(object)
{ appender名称(string) : appender定义(object) }的形式。
其中appender的定义对象,必须包含type
属性(string),其他属性依赖type
属性。categories(object)
{ category名称(string) : category定义(object) }的形式。
必须定义default
category,在所有日志事件没有匹配到指定的category时使用该默认值。
category定义对象包含2个属性值:- appenders (array of strings)
使用该category的appender。每个category必须指定至少一个appender。 - level (string, case insensitive)
指定发送到appender的最小level。
例如,如果设置为'error',则appender只能接收到‘error’, ‘fatal’, ‘mark’级别的消息,‘info’, ‘warn’, ‘debug’, or ‘trace’ 会被忽略掉。
- appenders (array of strings)
pm2 (boolean) (optional)
当使用pm2时候,需要设置该值为true,否则无法正常运行日志。(you’ll also need to install pm2-intercom as pm2 module: pm2 install pm2-intercom)pm2InstanceVar (string) (optional, defaults to ‘NODE_APP_INSTANCE’)
当使用pm2且更改了NODE_APP_INSTANCE默认值时,需要对应设置该属性。disableClustering (boolean) (optional)
set this to true if you liked the way log4js used to just ignore clustered environments, or you’re having trouble with PM2 logging. Each worker process will do its own logging. Be careful with this if you’re logging to files, weirdness can occur.
Loggers
log4js.getLogger([category])
返回一个Logger
对象,该对象使用指定的category
,如果未指定category
参数,则使用默认的category
。Logger
对象实现了以下方法:
<level>(args…)
可以使任何小写的level名称(包含自定义的level)。例如: logger.info('some info')
会发送一个info级别的log event。is<level>Enabled()
返回布尔值,检测是否会发送指定的level的日志事件。
例如,当前category
指定的level为INFO或者更低,则logger.isInfoEnabled()
返回true。addContext(<key>,<value>)
key为string类型,value可以为任何类型。
该键值对会被添加到所有日志事件中,例如可以添加相关id,用来追踪应用中一个用户的所有日志。
目前只在logFace
appender中使用了context值。removeContext(<key>)
删除指定的context。clearContext()
清除所有context键值对。level
当前level值,可以通过更改该值从而重写原本的level值。
Shutdown
log4js.shutdown(cb)
当log4js关闭所有appender以及所有日志事件都完成写入时,会调用传入的回调函数。
在程序退出时使用该方法,可以保证所有文件写入,socket都已关闭,等等。
Custom Layouts
log4js.addLayout(type, fn)
添加自定义的layout函数。详细查看:layouts。
Appenders
appender用来指定日志的输出,例如写入文件,发送邮件,发送网络数据等。配置项中appenders
必须包含type
属性,用于确定使用哪一种appender。
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout' },
app: { type: 'file', filename: 'application.log' }
},
categories: {
default: { appenders: [ 'out', 'app' ], level: 'debug' }
}
});
该实例定义了两个appender,其中out使用了stdout,用于写入到标准输出中。app使用了file,用于写入到'application.log'文件中。
Core Appenders
一下为log4js内置的appender。其中有的appender需要一些额外依赖但并不内置在Log4js中(例如smtp需要nodemailer),具体可以查看对应的说明文档。
如果你不需要使用这些appender,则不需要下载额外的依赖。
- categoryFilter
- console
- dateFile
- file
- fileSync
- hipchat
- logFaces-HTTP
- logFaces-UDP
- logLevelFilter
- logstashHTTP
- logstashUDP
- mailgun
- multiFile
- multiprocess
- recording
- redis
- slack
- smtp
- stderr
- stdout
- rabbitmq
Optional Appenders
log4js还内置有以下appender,但是在3.x版本之后会移除,如果使用了这些appender,需要显示的声明依赖。
Other Appenders
log4js支持加载外部的appender。在内置appender中没有匹配时,会type
作为require的加载路径。例如:
log4js.configure({
appenders: { gouda: { type: 'cheese/appender', flavour: 'tasty' } },
categories: { default: { appenders: ['gouda'], level: 'debug' }}
});
以上示例会加载cheese/appender
模块,并传递剩余的配置参数。
log4js通过type
属性,按照以下的顺序尝试加载appender:
- 内置appender,: require('./appenders/' + type)
- node_modules: require(type)
- 相对于主文件的路径: require(path.dirname(require.main.filename) + '/' + type)
- 相对于cwd路径: require(process.cwd() + '/' + type)
如果打算实现一个外部appender,可查看该文档: Writing Appenders。
Console Appender
使用node的console对象输出日志,也可以使用在浏览器环境中。
需要注意的是,当向console写入大量日志(output)时会使应用占用大量内存,建议使用[stdout](#Standard Output Appender)避免该问题。
Configuration
- type - console
- layout - object (optional, defaults to colouredLayout) - see layouts。
注意,所有日志事件都会使用console.log事件(所以 ERROR events 同样使用console.log,而不是console.error)。
Example
log4js.configure({
appenders: { console: { type: 'console' } },
categories: { default: { appenders: [ 'console' ], level: 'info' } }
});
Standard Output Appender
将所有日志事件写入到标准输出流(standard output stream)中。log4js默认使用该appender。
Configuration
- type - stdout
- layout - object (optional, defaults to colouredLayout) - see layouts。
Example
log4js.configure({
appenders: { 'out': { type: 'stdout' } },
categories: { default: { appenders: ['out'], level: 'info' } }
});
Standard Error Appender
所有日志事件写入到标准错误流(standard error stream)中。
Configuration
- type - stderr
- layout - object (optional, defaults to colouredLayout) - see layouts。
Example
log4js.configure({
appenders: { err: { type: 'stderr' } },
categories: { default: { appenders: ['err'], level: 'ERROR' } }
});
File Appender
将日志事件写入到文件。当使用文件appender时,需要在应用终止时,调用log4js.shutdown
以保证完成剩余的异步操作。
尽管文件appender使用了streamroller库,但是包含在log4js的依赖中,所以不需要在额外加载。
Configuration
- type - "file"
- filename - string - 文件路径。
- maxLogSize - integer (optional) - 限制文件的大小,单位为byte。如果超出该值则会备份原文件创建新文件。
- backups - integer (optional, default value = 5) - 备份文件的最大数量。
- layout - (optional, defaults to basic layout) - see layouts
剩余其他额外的参数,会被传递给底层的streamroller(参数含义也可查看node.js core file streams):
- encoding - string (default “utf-8”)
- mode- integer (default 0644)
- flags - string (default ‘a’)
- compress - boolean (default false) - compress the backup files during rolling (backup files will have .gz extension)
- keepFileExt - boolean (default false) - preserve the file extension when rotating log files (file.log becomes file.1.log instead of file.log.1)
Example
log4js.configure({
appenders: {
everything: { type: 'file', filename: 'all-the-logs.log' }
},
categories: {
default: { appenders: [ 'everything' ], level: 'debug' }
}
});
const logger = log4js.getLogger();
logger.debug('I will be logged in all-the-logs.log');
Example with log rolling (and compressed backups)
log4js.configure({
appenders: {
everything: { type: 'file', filename: 'all-the-logs.log', maxLogSize: 10485760, backups: 3, compress: true }
},
categories: {
default: { appenders: [ 'everything' ], level: 'debug'}
}
});
该示例会产生一个当前的日志文件(all-the-logs.log)。当该文件达到10Mb时,会压缩并命名为:all-the-logs.log.1.gz ,并创建一个新文件命名为all-the-logs.log 。
当all-the-logs.log再次达到10Mb时,原all-the-logs.log.1.gz会被改名为all-the-logs.log.2.gz,以此类推。
Synchronous File Appender
同步文件appender,和标准文件appender相比,区别在于所以写入都是同步的。而且不像异步版本,不支持对备份文件进行压缩。
Configuration
-type - "fileSync"
-filename - string - 文件路径
-maxLogSize - integer (optional) - 限制文件大小。
-backups - integer (optional, default value = 5) - 备份文件数量
-layout - (optional, defaults to basic layout) - see layouts
Example
log4js.configure({
appenders: {
everything: { type: 'fileSync', filename: 'all-the-logs.log' }
},
categories: {
default: { appenders: [ 'everything' ], level: 'debug' }
}
});
const logger = log4js.getLogger();
logger.debug('I will be logged in all-the-logs.log');