当前位置: 首页 > 工具软件 > log4js > 使用案例 >

Nodejs log方案(log4js)

简宏义
2023-12-01

测试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等)
…等

1 极简使用sample

var log4js = require('log4js');
var logger = log4js.getLogger();
logger.level = 'debug';
logger.debug("Some debug messages");

2 Log4js log级别

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < MARK < OFF

3 log4js配置

var log4js = require('log4js');//加载log4js
var logger = log4js.getLogger();//获取当前log4js配置 无参数为默认
logger.debug("Some debug messages");//使用

这里我们就着重介绍log4js配置

3.1 log4js config 配置介绍

Log4js config下面有三个重要属性:
appenders:记录器对象,自定义不同的记录器(log输出位置)。
categories:log 类型,自定义log不同输出方式。
level:log输出等级,大于某等级的log才会输出。

本人使用配置方式为categories内 组合不同的记录器和输出等级 实现不同条件下的log输出。

3.2 sample介绍

下面将针对 一段配置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

  • default类型,配置了三种记录器,将会输出到data_file(日期log文件), console(控制台)
    log_file(log文件),且只会输出大于等于info的log。
  • production类型,配置了一种记录器,只会输出到data_file(日期log文件),且只会输出大于等于warn级别的log。
  • console类型,配置了一种记录器,只会输出到console(控制台),且只会输出大于等于debug级别的log。
  • debug类型,配置了两种记录器,输出到console(控制台)和 'log_file(log文件),且只会输出大于等于debug级别的log。

使用:

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

4 与express框架结合

在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
 类似资料: