Json 使用 Winston 3.0 和 Nodejs 格式化日志未显示在 Kibana 中

Json format logs using Winston 3.0 and Nodejs not showing in Kibana

我正在创建一个 nodejs 应用程序并使用 Winston 3.0 进行日志记录。要求是日志在 Kibana 中应该是 json 格式,就像这样 {"message":"the_log_message","level":"info","log_timestamp":"2019-12-14T21:28:44+05:30","service_name":"foo","service_id":"1.0.0"}

以下是我能够实现的事情

  1. 日志在本地计算机上正确打印。
    2. 当不使用上述 Json 格式时,Kibana 正在显示日志。
    3。我不认为 Kibana 配置有问题,因为正在打印非 Json 日志。

    需要帮助以上述格式在 kibana 中打印日志。感谢任何帮助
    以下是我的记录器文件,它在本地完美打印。JSON.stringify 也没有帮助
'use strict';
const {createLogger, format, transports} = require('winston');
const moment = require('moment-timezone');
const env = process.env.NODE_ENV || 'development';
const serviceId = process.env.npm_package_name;
const serviceVersion = process.env.npm_package_version;

const appendTimestamp = format((info, opts) => {
    if (opts.tz)
        info.log_timestamp = moment().tz(opts.tz).format();
    return info;
});

const addAppNameFormat = format(info => {
    info.service_name = serviceId;
    return info;
});

const addAppVersionFormat = format(info => {
    info.service_id = serviceVersion;
    return info;
});

const logger = createLogger({
    // change level if in dev environment versus production
    level: env === 'prd' ? 'info' : 'debug',
    format: format.combine(
        appendTimestamp({tz: Intl.DateTimeFormat().resolvedOptions().timeZone}),
        addAppNameFormat(),
        addAppVersionFormat(),
        format.json()
    ),
    transports: [
        new transports.Console()
    ]
});

module.exports = logger;


另外添加工作正常但不打印 Json 格式日志的记录器文件


const { createLogger, format, transports } = require('winston');
const moment = require('moment-timezone');
const appendTimestamp = format((info, opts) => {
    if(opts.tz)
        info.timestamp = moment().tz(opts.tz).format();
    return info;
});

const logger = createLogger({
    // change level if in dev environment versus production
    level: env === 'prd' ? 'info' : 'debug',
    format: format.combine(
        appendTimestamp({ tz: Intl.DateTimeFormat().resolvedOptions().timeZone }),
        format.json()
    ),
    transports: [
        new transports.Console({
            format: format.combine(
                format.colorize(),
                format.printf(
                    info =>
                        `${info.timestamp}  ${process.env.npm_package_name} [${process.env.npm_package_version}] ${info.level} [${info.label}]: ${JSON.stringify(info.message)}`
                )
            )
        })
    ]
});

module.exports = logger;

EDIT1:
对代码进行了以下更改。在我的日志之前添加 space 在 Kibana 中生成日志,但我们无法解析它。如果我们没有在 return 语句中使用 space,日志不会生成
return ` ${value}`;
我怀疑我的 Winston 配置不支持 JSON 格式。重申在本地机器上日志生成正常。

const logger = createLogger({
// change level if in dev environment versus production
level: env === 'prd' ? 'info' : 'debug',
format: format.combine(
    appendTimestamp({tz: Intl.DateTimeFormat().resolvedOptions().timeZone}),
    format.json()
),
transports: [
    new transports.Console({
        format: format.combine(
            format.printf(
                (info) => {
                    const value = JSON.stringify({
                        'log-timestamp': info.timestamp,
                        'service-id': process.env.NOMAD_TASK_NAME,
                        'service-version': process.env.npm_package_version,
                        'level': info.level.toUpperCase(),
                        'env': process.env.ENV,
                        'message': info.message,
                        'logger': process.env.npm_package_name,
                        'thread': 'main'
                    });


                    return ` ${value}`;
                }
            )
        )
    })
]

});

原来配置 Kibana 的方式不正确。代码本身运行良好