测试API发现一些问题,为了保证不输出太多的log,server正常处理时,并没有记录相关信息。
发现需要一种支持日志级别的log系统来完成log,而不是简单的使用node自带的log函数。经过查阅资料选择了log4js这种方案。
官方文档:https://log4js-node.github.io/log4js-node
参考链接:https://www.cnblogs.com/atp-sir/p/7070050.html
Log4js 具有以下功能
1 彩色控制台记录到标准输出或标准错误
2 文件appender,可根据文件大小或日期进行可配置的日志滚动
3 多进程appender(当你有多个服务器但想要集中记录时很有用)
4 不同日志类别的不同日志级别(使您的应用程序日志的某些部分为DEBUG,其他部分仅为ERRORS等)
…等
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.level = 'debug';
logger.debug("Some debug messages");
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < MARK < OFF
var log4js = require('log4js');//加载log4js
var logger = log4js.getLogger();//获取当前log4js配置 无参数为默认
logger.debug("Some debug messages");//使用
这里我们就着重介绍log4js配置
Log4js config下面有三个重要属性:
appenders:记录器对象,自定义不同的记录器(log输出位置)。
categories:log 类型,自定义log不同输出方式。
level:log输出等级,大于某等级的log才会输出。
本人使用配置方式为categories内 组合不同的记录器和输出等级 实现不同条件下的log输出。
下面将针对 一段配置code 进行介绍:
const log4js = require('log4js');
let programName = "log4jstest";
log4js.configure({
appenders:{
console:{//记录器1:输出到控制台
type : 'console',
},
log_file:{//记录器2:输出到文件
type : 'file',
filename: __dirname + `/logs/${programName}.log`,//文件目录,当目录文件或文件夹不存在时,会自动创建
maxLogSize : 20971520,//文件最大存储空间(byte),当文件内容超过文件存储空间会自动生成一个文件test.log.1的序列自增长的文件
backups : 3,//default value = 5.当文件内容超过文件存储空间时,备份文件的数量
//compress : true,//default false.是否以压缩的形式保存新文件,默认false。如果true,则新增的日志文件会保存在gz的压缩文件内,并且生成后将不被替换,false会被替换掉
encoding : 'utf-8',//default "utf-8",文件的编码
},
data_file:{//:记录器3:输出到日期文件
type: "dateFile",
filename: __dirname + `/logs/${programName}`,//您要写入日志文件的路径
alwaysIncludePattern: true,//(默认为false) - 将模式包含在当前日志文件的名称以及备份中
daysToKeep:10,//时间文件 保存多少天,距离当前天daysToKeep以前的log将被删除
//compress : true,//(默认为false) - 在滚动期间压缩备份文件(备份文件将具有.gz扩展名)
pattern: "-yyyy-MM-dd-hh.log",//(可选,默认为.yyyy-MM-dd) - 用于确定何时滚动日志的模式。格式:.yyyy-MM-dd-hh:mm:ss.log
encoding : 'utf-8',//default "utf-8",文件的编码
},
error_file:{//:记录器4:输出到error log
type: "dateFile",
filename: __dirname + `/../logs/${programName}_error`,//您要写入日志文件的路径
alwaysIncludePattern: true,//(默认为false) - 将模式包含在当前日志文件的名称以及备份中
daysToKeep:10,//时间文件 保存多少天,距离当前天daysToKeep以前的log将被删除
//compress : true,//(默认为false) - 在滚动期间压缩备份文件(备份文件将具有.gz扩展名)
pattern: "_yyyy-MM-dd.log",//(可选,默认为.yyyy-MM-dd) - 用于确定何时滚动日志的模式。格式:.yyyy-MM-dd-hh:mm:ss.log
encoding : 'utf-8',//default "utf-8",文件的编码
// compress: true, //是否压缩
}
},
categories: {
default:{appenders:['data_file', 'console', 'log_file'], level:'info' },//默认log类型,输出到控制台 log文件 log日期文件 且登记大于info即可
production:{appenders:['data_file'], level:'warn'}, //生产环境 log类型 只输出到按日期命名的文件,且只输出警告以上的log
console:{appenders:['console'], level:'debug'}, //开发环境 输出到控制台
debug:{appenders:['console', 'log_file'], level:'debug'}, //调试环境 输出到log文件和控制台
error_log:{appenders:['error_file'], level:'error'}//error 等级log 单独输出到error文件中 任何环境的errorlog 将都以日期文件单独记录
},
});
module.exports = log4js.getLogger('console');
module.exports.error = log4js.getLogger('error_log');//error单独输出到一个文件中
1 该config定义了 三个记录器console(输出到控制台), log_file(输出到文件), data_file(输出到日期文件)
2 该config定义了4中log输出类型default,production, console, debug
var logger = log4js.getLogger();
logger.info("hello world categories-default test, this is info");
logger.debug("hello world categories-default test, this is debug");
logger.warn("hello world categories-default test, this is warn");
logger.error("hello world categories-default test, this is error");
logger = log4js.getLogger('production');
logger.info("hello world categories-production test, this is info");
logger.debug("hello world categories-production test, this is debug");
logger.warn("hello world categories-production test, this is warn");
logger.error("hello world categories-production test, this is error");
logger = log4js.getLogger('console'); //引用的categories 类型中的console 即输出到console控制台 输出日志级别info(大于info输出)
logger.info("hello world categories-console test");
logger = log4js.getLogger('debug');
logger.info("hello world categories-debug test, this is info");
logger.debug("hello world categories-debug test, this is debug");
控制台输出内容
[2018-05-15T10:08:51.014] [INFO] default - hello world categories-default test, this is info
[2018-05-15T10:08:51.021] [WARN] default - hello world categories-default test, this is warn
[2018-05-15T10:08:51.022] [ERROR] default - hello world categories-default test, this is error
[2018-05-15T10:08:51.022] [INFO] console - hello world categories-console test
[2018-05-15T10:08:51.022] [INFO] debug - hello world categories-debug test, this is info
[2018-05-15T10:08:51.022] [DEBUG] debug - hello world categories-debug test, this is debug
普通log文件:
[2018-05-15T10:08:51.014] [INFO] default - hello world categories-default test, this is info
[2018-05-15T10:08:51.021] [WARN] default - hello world categories-default test, this is warn
[2018-05-15T10:08:51.022] [ERROR] default - hello world categories-default test, this is error
[2018-05-15T10:08:51.022] [INFO] debug - hello world categories-debug test, this is info
[2018-05-15T10:08:51.022] [DEBUG] debug - hello world categories-debug test, this is debug
时间log文件:
[2018-05-15T10:08:51.014] [INFO] default - hello world categories-default test, this is info
[2018-05-15T10:08:51.021] [WARN] default - hello world categories-default test, this is warn
[2018-05-15T10:08:51.022] [ERROR] default - hello world categories-default test, this is error
[2018-05-15T10:08:51.022] [WARN] production - hello world categories-production test, this is warn
[2018-05-15T10:08:51.022] [ERROR] production - hello world categories-production test, this is error
在app.js 使用以下语句即可替换express默认输出
const log4js = require('log4js');
var logger = require('./config/log4js');
var app = express();
app.use(log4js.connectLogger(logger, {level:'auto', format:':method :url :status :response-time ms'}));
format 为express 输出格式
先输出请求方法 在输出url 最后输出http状态码 和响应事件
结果如下:
GET /v1/users/messages?msgid=5afbfbc065e7640936380c1e&status=1 200 8 ms
自定义 express 默认输出
app.use(log4js.connectLogger(logger, {level:'auto', format: (req, res, format) =>format(`:method :url :status :response-time ms ${res.reqUserId}`)}));
输出
GET /v1/test 200 446 ms 5aa0d55246c14813a2313c18