【问题标题】:Separate log levels单独的日志级别
【发布时间】:2019-06-20 09:34:47
【问题描述】:

我正在寻找如何仅将“INFO”级别(针对用户)发布到控制台,并将“DEBUG”级别发布到文件的方式。目前我发现只有一个工作解决方案 - 使用几个“getLogger()”函数。例如:

  • log4js.getLogger('debug');
  • log4js.getLogger('info');

其中函数的每个参数将配置类别与 configure() 函数分开。 但我不喜欢它,并假设一个 getLogger() 函数有更好的选择。 我最后一次尝试的是:

    log4js.configure({
    appenders: {
        everything:{ type: 'stdout' },
        file_log: { type: 'file' ,filename: 'all-the-logs.log' },
        logLevelFilter: {  type:'logLevelFilter',level: 'debug', appender: 'file_log' }
    },
    categories: {
       default: {
           appenders: [ 'logLevelFilter','everything'], level: 'info'},
    }
});

我在控制台中看到 - 只有“INFO”级别,但在文件中我也只能看到“INFO”级别。如果我添加到附加程序 - 级别“ALL” - 我将在控制台中看到所有级别,并且在文件中也是如此

【问题讨论】:

    标签: javascript node.js log4js-node


    【解决方案1】:

    log4js 提供了特殊的附加类型categoryFilterlogLevelFilter,参见Log4js - Appenders,步骤如下

    1. 根据每个日志级别添加附加程序和类别;
    2. 添加额外的附加程序,键入logLevelFilter,指向相关的附加程序;
    3. 在步骤 2 中使用附加程序更改 config.categories.default.appenders
    4. 最终使用log4js.getLogger()创建logger并处处记录日志,日志文件以love level分隔

    用打字稿写的

    import {Appender, Configuration, LogLevelFilterAppender} from "log4js";
    
    const fs = require('fs');
    const path = require('path');
    
    let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
    let conf: Configuration = {
        appenders : {
            default: {
                type  : "console",
                layout: {
                    type   : "colored",
                    pattern: "%m"
                },
            }
        },
        categories: {
            default: {
                appenders: levels,
                level    : 'all'
            }
        },
    };
    
    let logs = path.join(__dirname, 'logs');
    if (!fs.existsSync(logs)) {
        fs.mkdirSync(logs);
    }
    
    for (let level of levels) {
        let appender: Appender = {
            type      : "file",
            filename  : path.join(logs, level + '.log'),
            maxLogSize: 65536,
            backups   : 10,
            layout    : {
                type   : "pattern",
                pattern: "%d{dd/MM hh:mm} %-5p %m"
            }
        };
        conf.appenders[level] = appender;
        conf.categories[level] = {
            appenders: [level],
            level    : level.toUpperCase(),
        }
    }
    
    let prefix = 'only-';
    for (let level of levels) {
        let appender: LogLevelFilterAppender = {
            type    : "logLevelFilter",
            appender: level,
            level   : level,
            maxLevel: level,
        };
        let name = prefix + level;
        conf.appenders[name] = appender;
        conf.categories[name] = {
            appenders: [level],
            level    : level.toUpperCase(),
        }
    }
    conf.categories.default.appenders = levels.map(x => prefix + x);
    //console.log(JSON.stringify(conf, null, 2));
    export default conf;
    

    示例用法

    // const log4js = require('log4js');
    import * as log4js from 'log4js';
    import log4jsConfig from './log4js.config';
    
    log4js.configure(log4jsConfig );
    
    (function () {
        const logger = log4js.getLogger();
        logger.trace('Entering cheese testing');
        logger.debug('Got cheese.');
        logger.info('Cheese is Gouda.');
        logger.warn('Cheese is quite smelly.');
        logger.error('Cheese is too ripe!');
        logger.fatal('Cheese was breeding ground for listeria.');
    
        log4js.shutdown(console.log);
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 2015-06-23
      • 2022-11-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2016-05-07
      相关资源
      最近更新 更多