node.js - Nodejs Winston 在“createLogger”中使用异步函数
问题描述
我正在尝试将服务器的 IP 地址放在日志的开头。我正在使用public-ip
图书馆。问题是,我不允许await getIp()
在 winston 选项中使用。
我的 logger.js 看起来像这样
const winston = require( 'winston' );
const publicIp = require( 'public-ip' );
let ip;
async function getIp() {
if ( !ip ) {
ip = await publicIp.v4();
}
return ip;
}
const logger = winston.createLogger( {
level: process.env.NODE_ENV !== global.PRODUCTION ? 'debug' : 'info',
defaultMeta: { service: 'user-service' },
format: winston.format.combine(
winston.format.timestamp( {
format: 'YYYY-MM-DD HH:mm:ss'
} ),
winston.format.printf( ( info ) => `[${await getIp()}] ${info.message}` )
),
transports: [
new winston.transports.File( { filename: 'logs/error.log', level: 'error', maxsize: '20MB' } ),
new winston.transports.File( { filename: 'logs/combined.log', maxsize: '20MB' } ),
new winston.transports.Console( {
format: winston.format.combine(
winston.format.colorize()
)
} )
]
} );
module.exports = logger;
解决方案
您的日志配置是同步的,因此您需要在完成某些操作后提供您的日志配置,即获取您的public-ip
.
// log.config.js
const winston = require('winston');
const publicIp = require('public-ip');
module.exports = {
// Logger initialized async-hronously
logger: async () => {
let ip = await publicIp.v4();
return winston.createLogger({
level: process.env.NODE_ENV !== global.PRODUCTION ? 'debug' : 'info',
defaultMeta: {service: 'user-service'},
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.printf((info) => `[${ip}] ${info.message}`)
),
transports: [
new winston.transports.File({filename: 'logs/error.log', level: 'error', maxsize: '20MB'}),
new winston.transports.File({filename: 'logs/combined.log', maxsize: '20MB'}),
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize()
)
})
]
})
}
};
由于您的记录器ip
在消息中异步获取地址,因此format
您的应用程序需要在正确初始化后获取实例,就像这样。
// main.js
const myLogger = require('./log.config');
async function start() {
let logger = await myLogger.logger();
logger.debug('Hello from my log');
// Application can proceed with rest of the logic ...
}
// Run my app
start();
希望这可以帮助。
推荐阅读
- c# - 多个列表绑定到单个组合框(下拉按钮)
- java - 如何在二维数组中显示唯一编号并对唯一编号求和
- typescript - 用玩笑模拟在打字稿测试中从另一个文件调用的函数
- node-modules - 如何使用 mix 设置 Alpine.js 3
- microsoft-graph-api - msgraph 团队 api,仅筛选包含团队的组
- wpf - ListBox ItemsSource 绑定路径错误。我错过了什么?
- flutter - 是否有正确的方法在抽屉中导航?
- python - 想在linux中使用特定版本的python
- sql - 如何从 PostgreSQL 中的单个 JSON 列中获取多个值?
- php - 是否可以通过循环为电子邮件模板创建 html 元素?