我有一个使用node.js的电子应用程序。我想使用Winston登录应用程序。我已经将winston添加到我的package.json文件中,但是当我运行webpack的build命令时,我从winston中的colors.js依赖项中获得了一些警告。
'...the request of a dependency is an expression...'
然后引用winston和colors.js。忽略警告不起作用,因为电子应用程序尝试从winston加载一些文件时出现异常。
我在SO和github网站上做了一些挖掘,他们说colors.js有一些webpack遇到问题的动态需求语句。我还看到其他样本项目似乎在他们的项目中没有任何问题的情况下启动并运行。有谁知道如何在电子应用程序中正确包含带有webpack的winston日志包?
答案 0 :(得分:12)
这个问题有两个方面:
1)winston直接或间接依赖于color.js,因此一旦winston存在,依赖关系就会自动包含在内。在它的一些旧版本中,它包含一个动态需求语句,这导致了这一点:2)依赖项具有Webpack无法处理的动态require语句;您可以配置webpack以便它可以忽略此特定情况,或者也可以将winston升级到更新版本,因此将在没有动态要求的变体中选择color.js(请参阅https://github.com/winstonjs/winston/issues/984)。
要告诉Webpack与动态需求相处,你需要告诉Webpack Winston是一个外部库。
以下是我的webpack.config.js中的一个示例:
externals: {
'electron': 'require("electron")',
'net': 'require("net")',
'remote': 'require("remote")',
'shell': 'require("shell")',
'app': 'require("app")',
'ipc': 'require("ipc")',
'fs': 'require("fs")',
'buffer': 'require("buffer")',
'winston': 'require("winston")',
'system': '{}',
'file': '{}'
},
要使用电子在角度2应用程序中使用记录器,请创建一个logger.js文件,然后使用全局日志记录服务TypeScript文件(即logging.service.ts)将其包装。 logger.js文件使用所需的Winston配置设置创建记录器变量。
logger.js:
var winston = require( 'winston' ),
fs = require( 'fs' ),
logDir = 'log', // Or read from a configuration
env = process.env.NODE_ENV || 'development',
logger;
winston.setLevels( winston.config.npm.levels );
winston.addColors( winston.config.npm.colors );
if ( !fs.existsSync( logDir ) ) {
// Create the directory if it does not exist
fs.mkdirSync( logDir );
}
logger = new( winston.Logger )( {
transports: [
new winston.transports.Console( {
level: 'warn', // Only write logs of warn level or higher
colorize: true
} ),
new winston.transports.File( {
level: env === 'development' ? 'debug' : 'info',
filename: logDir + '/logs.log',
maxsize: 1024 * 1024 * 10 // 10MB
} )
],
exceptionHandlers: [
new winston.transports.File( {
filename: 'log/exceptions.log'
} )
]
} );
module.exports = logger;
logging.service.ts:
export var LoggerService = require('./logger.js');
现在,日志服务可在整个应用程序中使用。
示例:
import {LoggerService} from '<path>';
...
LoggerService.log('info', 'Login successful for user ' + this.user.email);