繁体   English   中英

使用 Winston 3.0 和 Nodejs 的 Json 格式日志未在 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;

编辑1:
在代码中进行了以下更改。 在我的日志在 Kibana 中生成日志之前添加一个空格,但我们无法解析它。 如果我们不使用 return 语句中的空间,则不会生成日志
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 的配置方式不正确。 代码本身运行良好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM