0

我想将动态属性添加到我与 log4js 一起使用的模式中。我正在使用一些自定义模式,如下所示:“%d{} %-6p[%thread] %c [%x{context}]: %m%n%r”

上下文是我想要设置的动态值,其中包含为服务器端的每个用户生成的一些唯一 ID。有一种方法可以在创建 log4js 配置时使用“tokens”和“context”属性添加动态值。但在这种情况下,应该在创建日志期间设置值。

有没有办法添加一些在实际消息写入日志时而不是在配置阶段设置的动态属性?

现在我正在做这样的事情:

        log4js.configure(
        {
          appenders: { "file": { "type": "file", "filename": "service.log", "maxLogSize": 102400, "backups": 5,  "category": "com.nextinsurance",  "layout": { "type": "pattern", "pattern": "%d{} %-6p[%thread] %c [%x{context}]: %m%n%r",  "tokens" : {context: function(logEvent){ return getContextFromData(logEvent) } } } }, "console" : {"type": "console"} },
          categories: { "default": { "appenders": ["file", "console"], "level": "info" } }
        }
       );

但是想在写入日志时注入这个值,比如

logger.info(Message, {context: context_value})
4

1 回答 1

0

您可以使用 logEvent 数据属性来获取上下文。logEvent 数据属性包含在日志事件中传递的参数数组。这是示例代码:

var log4js = require("log4js");

log4js.configure({
  appenders: {
    out: {
      type: 'stdout',
      layout: {
        type: 'pattern',
        pattern: '[%d] [%p] [%c] [%x{context}] - %m%n',
        tokens: {
          context: function(logEvent) {
            let returnVal = logEvent.data[1] ? logEvent.data[1].context : undefined;
            if (returnVal) {
              logEvent.data.pop();
            } else {
              returnVal = 'null'; // set any default value if context is not passed.
            }
            return returnVal;
          }
        }
      }
    }
  },
  categories: {
    default: {
      appenders: ['out'],
      level: 'INFO'
    }
  }
});

log4js.level = 'info';
let logger = log4js.getLogger();

logger.info('Hello', { context: 'context_value'}); // prints [2019-09-13T16:50:48.818] [INFO] [default] [context_value] - Hello
logger.info('Hello'); // prints [2019-09-13T16:50:48.820] [INFO] [default] [null] - Hello

于 2019-09-13T11:39:44.650 回答