【问题标题】:How do I get Winston to work with Webpack?如何让 Winston 使用 Webpack?
【发布时间】:2016-10-16 20:54:54
【问题描述】:

我有一个使用 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 有一些动态的 require 语句,webpack 遇到了问题。我还看到其他示例项目似乎已经启动并运行了winston,并且在他们的项目中没有任何问题。有谁知道如何在电子应用程序中正确包含带有 webpack 的 winston 日志记录包?

【问题讨论】:

    标签: javascript angular webpack electron winston


    【解决方案1】:

    这个问题有两个方面:

    1) winston 直接或间接依赖于 color.js,因此一旦 winston 存在,依赖项就会自动包含在内。在它的一些旧版本中,它包含一个动态的 require 语句,这导致:

    2) 一个依赖有动态的 require 语句,Webpack 无法处理;您可以配置 webpack 以便它可以忽略此特定情况,或者也可以将 winston 升级到更新版本,因此 color.js 将在没有动态要求的变体中被选择(请参阅https://github.com/winstonjs/winston/issues/984)。

    要告诉 Webpack 与动态 require 相处,你需要告诉 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': '{}'
    },
    

    要使用电子使记录器在 Angular 2 应用程序中可用,请创建一个 logger.js 文件,然后用全局日志记录服务 TypeScript 文件(即 logging.service.ts)包装它。 logger.js 文件使用所需的 Winston 配置设置创建 logger 变量。

    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);
    

    【讨论】:

    • 当我使用 angular-cli 而不是 webpack 本身并且无法访问 webpack 配置时,我无法使用这种方法。
    • @invisible 你可以通过 ng 弹出来克服 webpack,这将生成 webpack.conf.js 文件。当我使用上述配置执行此操作时,webpack 给出了编译错误,因为它无法在 logger.service.ts 文件中找到记录器。
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 2017-01-07
    • 2019-04-14
    • 2016-05-18
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多