ThinkJS implements powerful logging capabilities via the think-logger3 module and provides adapter extensions that easily extend the built-in logging module. By default, the log4js module is used as the underlying logging module. It has many features such as log classification, log splitting and multi-process.
System has been globally injected the logger object think.logger
, it provides debug
, info
, warn
and error
four methods to output log, the default behaviour is to output to console.
think.logger.debug('debug message');
think.logger.info('info message');
think.logger.warn('warning');
think.logger.error(new Error('error'));
The system coms with Console
, File
, DateFile
three adapter. The default is to use Controle
to output logs to console.
If you want to output log to file, add the following configurations into src/config/adapter.js
file:
const path = require('path');
const {File} = require('think-logger3');
exports.logger = {
type: 'file',
file: {
handle: File,
backups: 10,
absolute: true,
maxLogSize: 50 * 1024, //50M
filename: path.join(think.ROOT_PATH, 'logs/xx.log')
}
}
Then initial log would create a file called debug.log
. After this file reached maxLogSize
, a new file named debug.log.1
will be created. After log file number reached backups
, old log chunk file will be removed.
filename
: log filenamemaxLogSize
: The maximum size (in bytes) for a log file, if not provided then logs won't be rotated.backups
: The number of log files to keep after logSize has been reached (default 5)absolute
: If filename
is a absolute path, the absolute
value should be true
.layout
: Layout defines the way how a log record is rendered. More layouts can see here.This adapter will log to a file, moving old log messages to timestamped files according to a specified pattern. For example:
const path = require('path');
const {DateFile} = require('think-logger3');
exports.logger = {
type: 'dateFile',
dateFile: {
handle: DateFile,
level: 'ALL',
absolute: true,
pattern: '-yyyy-MM-dd',
alwaysIncludePattern: false,
filename: path.join(think.ROOT_PATH, 'logs/xx.log')
}
}
Then initial log would create a file called debug.log
. At midnight, the current debug.log
file would be rename to debug.log-2017-03-12
(for example), and a new debug.log
file created.
level
: log levelfilename
: log base filenamepattern
: date filename would append to filename. A new file is started whenever the pattern for the current log entry differs from that of the previous log entry. The following strings are recognised in the pattern:alwaysIncludePattern
: If alwaysIncludePattern
is true, then the initial file will be filename.2017-03-12
and no renaming will occur at midnight, but a new file will be written to with the name filename.2017-03-13
.absolute
: If filename
is a absolute path, the absolute
value should be true
.layout
: Layout defines the way how a log record is rendered. More layouts can see here.If those adapter configuration can't satisfy your need, you can use this adapter and set config like log4js. For example:
const path = require('path');
const {Basic} = require('think-logger3');
exports.logger = {
type: 'advanced',
advanced: {
handle: Basic,
appenders: {
everything: {
type: 'file',
filename: path.join(think.ROOT_PATH, 'logs/all-the-logs.log')
},
emergencies: {
type: 'file',
filename: path.join(think.ROOT_PATH, 'logs/oh-no-not-again.log')
},
'just-errors': {
type: 'logLevelFilter',
appender: 'emergencies',
level: 'error'
}
},
categories: {
default: {
appenders: ['just-errors', 'everything'],
level: 'debug'
}
}
}
};
This configuration means that logs level above error
will be output tooh-no-not-again.log
and all logs will be output to all-the-logs.log
. All properties are as same as log4js except handle
property. You can see more configure properties on log4js documentation.
We support the following log level:
Console
, File
and DateFile
type supports layout
paramter,to decide the output log format, of which value is and object, bellowing is an example:
const path = require('path');
const {File} = require('think-logger3');
module.exports = {
type: 'file',
file: {
handle: File,
backups: 10,
absolute: true,
maxLogSize: 50 * 1024, //50M
filename: path.join(think.ROOT_PATH, 'logs/xx.log'),
layout: {
type: 'pattern',
pattern: '%[[%d] [%p]%] - %m',
}
}
}
Default Console
output format is %[[%d] [%z] [%p]%] - %m
, which is [time] [pid] [log level] - log content
:
type
:It supports the fellowing types:pattern
:output format string, supports the following format parameters%r
- .toLocaleTimeString()
which look like 下午5:13:04
。%p
- log level%h
- host name%m
- log mesage%d
- time,default use ISO8601 format,available formats including ISO8601
, ISO8601_WITH_TZ_OFFSET
, ABSOUTE
, DATE
or other supported format string, such as %d{DATE}
or %d{yyyy/MM/dd-hh.mm.ss}
。%%
- output %
string%n
- new line%z
- get process ID from process.pid
%[
- begin color block%]
- end color blockIf you feel that the type of log output provided does not meet your needs, you can implement handle yourself. Custom handle need to achieve the following methods:
module.exports = class {
/**
* @param {Object} config {} configurations passed in
*/
constructor(config) {
}
debug() {
}
info() {
}
warn() {
}
error() {
}
}