2016-06-15 3 views
8

node.js를 사용하는 전자 응용 프로그램이 있습니다. Winston을 사용하여 응용 프로그램에 로그인하고 싶습니다. 내 package.json 파일에 winston을 추가했지만 webpack에 대한 빌드 명령을 실행할 때 Winston의 colors.js 종속성에 대한 경고가 표시됩니다.Winston에서 Webpack을 사용하려면 어떻게해야합니까?

'...the request of a dependency is an expression...' 

그러면 winston과 colors.js를 참조합니다. 전자 응용 프로그램이 winston에서 일부 파일을로드하려고 할 때 예외가 발생하므로 경고를 무시하면 작동하지 않습니다.

저는 SO와 github 사이트에서 파기를했는데 colors.js에 webpack에서 문제가있는 동적 요구 문이 있다고 말합니다. 또한 다른 샘플 프로젝트가 프로젝트에서 문제없이 winston을 실행하는 것으로 나타났습니다. 누구든지 정확하게 전자 애플 리케이션에서 webpack과 함께 Winston 로깅 패키지를 포함하는 방법을 알고 있습니까?

답변

12

Webpack이 colors.js의 dynamic require 문을 처리 할 수 ​​없다는 것이 문제입니다. 따라서 Winston이 외부 라이브러리임을 Webpack에 알려야합니다.

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 파일을 만든 다음 글로벌 로깅 서비스를 포장 : 여기

내 webpack.config.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); 
+0

내가 웹팩 자체를 대신 각-CLI를 사용하고있는 동안이 방법을 사용할 수없고 웹팩 설정에 액세스하지 않았습니다. – invisible

+1

@invisible webpack.conf.js 파일을 생성하는 ng eject를 수행하여 webpack을 극복 할 수 있습니다. 위의 구성으로이 작업을 수행하면 logger.service.ts 파일에서 로거를 찾을 수 없어 webpack에서 컴파일 오류가 발생합니다. – patz