Nodejs log4js的一个问题

Nodejs log4js的一个问题

使用log4js,如何使用一个logger,同时将日志输出到console and file,并且console和file的输出level是不同的。 貌似只能按照logger object来设置level,没办法在appender里设置level。 请教一下大家

3 回复

当然可以。在Node.js中使用log4js库时,你可以配置多个追加器(appenders)以将日志输出到不同的目标(例如控制台和文件),并为每个追加器设置不同的日志级别。

以下是一个简单的示例代码,展示了如何配置log4js以实现这一需求:

const log4js = require('log4js');

// 配置log4js
log4js.configure({
    appenders: {
        consoleAppender: { type: 'console', layout: { type: 'basic' } },
        fileAppender: { type: 'file', filename: 'application.log', layout: { type: 'basic' } }
    },
    categories: {
        default: { appenders: ['consoleAppender', 'fileAppender'], level: 'all' }
    }
});

// 获取logger对象
const logger = log4js.getLogger();

// 设置不同追加器的日志级别
logger.level = 'debug'; // 这个设置会应用于所有追加器
logger.addContext('consoleLevel', 'info'); // 为控制台追加器设置日志级别
logger.addContext('fileLevel', 'warn'); // 为文件追加器设置日志级别

// 示例日志记录
logger.info('这是一个info级别的日志消息');
logger.warn('这是一个warn级别的日志消息');
logger.error('这是一个error级别的日志消息');

在这个示例中,我们首先配置了两个追加器:一个用于控制台输出,另一个用于文件输出。然后我们获取了一个logger对象,并设置了默认的日志级别为debug。为了实现不同追加器有不同的日志级别,我们可以使用addContext方法为每个追加器设置上下文级别的日志级别。然而,log4js并没有直接支持这种功能,因此我们需要通过自定义的方式来实现这一点。

如果你需要更精细地控制每个追加器的日志级别,你可能需要创建两个独立的logger对象,每个对象都指向不同的追加器。这样就可以为每个logger对象单独设置日志级别,从而达到你的需求。

const log4js = require('log4js');

log4js.configure({
    appenders: {
        consoleAppender: { type: 'console', layout: { type: 'basic' } },
        fileAppender: { type: 'file', filename: 'application.log', layout: { type: 'basic' } }
    },
    categories: {
        consoleCategory: { appenders: ['consoleAppender'], level: 'info' },
        fileCategory: { appenders: ['fileAppender'], level: 'warn' }
    }
});

const consoleLogger = log4js.getLogger('consoleCategory');
const fileLogger = log4js.getLogger('fileCategory');

consoleLogger.info('这是控制台的日志信息');
fileLogger.warn('这是文件的日志警告');

在这个版本中,我们创建了两个独立的logger对象,分别对应不同的追加器,并为每个logger对象设置了不同的日志级别。这样可以更灵活地控制日志输出。


解决了,log4js的文档弱,看了源码,它有logLevelFilter的appender

log4js.configure({
  appenders: [
    { type: 'console'},
    {type:'logLevelFilter',
        appender:{
            type:'file',
            filename: 'logs/cheese.log',
        },
	    category:'bb'
        level:'ERROR'
    }
  ],
  replaceConsole: true
});

要实现一个 logger 同时将日志输出到 consolefile,并且 consolefile 的输出级别不同,可以使用 log4js 的配置文件或直接在代码中进行配置。下面是一个示例代码,展示了如何实现这一点:

示例代码

const log4js = require('log4js');

// 配置 logger
log4js.configure({
    appenders: {
        consoleLogger: { type: 'console', layout: { type: 'basic' } },
        fileLogger: { type: 'file', filename: 'logs/app.log', layout: { type: 'basic' } }
    },
    categories: {
        default: {
            appenders: ['consoleLogger', 'fileLogger'],
            level: 'debug'
        }
    }
});

// 获取 logger 实例
const logger = log4js.getLogger();

// 设置不同级别的输出
logger.addContext('consoleLevel', 'info'); // 控制台级别为 info
logger.addContext('fileLevel', 'debug');   // 文件级别为 debug

// 使用 logger
logger.info('This is an info message');
logger.debug('This is a debug message');

解释

  1. 配置

    • appenders 中定义了两个 appender,一个用于 console,另一个用于 file
    • categories 中,设置了 default 类别的 appender,并且指定了 leveldebug
  2. 获取 Logger 实例

    • 使用 log4js.getLogger() 获取一个 logger 实例。
  3. 设置不同级别的输出

    • 使用 logger.addContext() 方法为 consolefile 分别设置不同的输出级别。
    • 注意,log4js 本身没有直接在 appender 上设置级别的方式,但可以通过上下文或其他方式来实现类似的效果。

通过这种方式,你可以分别控制 consolefile 的输出级别。上述代码中,控制台只会输出 info 及以上级别的日志,而文件会输出 debug 及以上级别的日志。

回到顶部