Programing

여러 모듈에서 winston 사용

lottogame 2020. 12. 4. 07:42
반응형

여러 모듈에서 winston 사용


여러 모듈이 있습니다. server.js, module1.js, ..., moduleN.js라고 가정 해 보겠습니다.

내 server.js에 로그 파일을 정의하고 싶습니다.

winston.add(winston.transports.File, { filename: 'mylogfile.log' });

내 모든 모듈에서 사용합니다.

그렇게하는 가장 좋은 방법은 무엇입니까? 내가 할 수 exports.winston=winston;다음 server.js에서 설정 각 모듈과, 그러나 어떤 더 나은 솔루션이있다?

미리 감사드립니다!


기본 로거 개념이이를 잘 처리합니다.

Winston은 winston이 검색하는 데 필요한 기본 로거를 정의합니다. 따라서이 기본 로거를 한 번만 구성하면 멋진 조정 된 다중 전송 모드에서 vanilla require ( 'winston')를 통해 후속 모듈 사용에 사용할 수 있습니다.

예를 들어 여기에 3 개의 전송을 정의하는 완전한 로깅 설정이 있습니다. 때때로 Loggly를 MongoDB로 바꿉니다.

server.js

var logger=require('./log.js'); 
// requires winston and configures transports for winstons default logger- see code below.

다른 모든 .js 파일

var logger=require('winston'); // this retrieves default logger which was configured in log.js
logger.info("the default logger with my tricked out transports is rockin this module");

log.js-이것은 DEFAULT 로거의 일회성 구성입니다.

var logger = require('winston');
var Loggly = require('winston-loggly').Loggly;
var loggly_options={ subdomain: "mysubdomain", inputToken: "efake000-000d-000e-a000-xfakee000a00" }
logger.add(Loggly, loggly_options);
logger.add(winston.transports.File, { filename: "../logs/production.log" });
logger.info('Chill Winston, the logs are being captured 3 ways- console, file, and Loggly');
module.exports=logger;

또는 더 복잡한 시나리오의 경우 winston 컨테이너를 사용하고 다른 모듈의 명명 된 컨테이너에서 로거를 검색 할 수 있습니다. 나는 이것을 사용하지 않았습니다.

이것에 대한 유일한 문제는 쉽게 고쳐진 배포 호스트에서 누락 된 로그 디렉토리였습니다.

도움이 되었기를 바랍니다.


내가하는 일은 (최선의 방법이 아닐 수도 있음) 애플리케이션을 통해 사용하는 모든 것을 내보내는 '글로벌'모듈을 사용하는 것입니다. 예를 들면 :

//Define your winston instance
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
exports.logger = winston;

exports.otherGlobals = ....

이제 다른 모듈에서 전 세계적으로 사용되는 모듈 만 필요합니다.

var Global = require(/path/to/global.js);

파일은 처음로드 된 후에 캐시되기 때문에 (전역에 로그 문을 포함하여 확인할 수 있으며 한 번만 기록됨) 다시 포함하는 데 드는 오버 헤드가 거의 없습니다. 모든 것을 하나의 파일에 넣는 것은 모든 페이지에서 전 세계적으로 사용되는 모든 모듈을 요구하는 것보다 쉽습니다.


커스텀 컬러와 레벨을 사용하고 싶었습니다.

그래서 기본 콘솔 전송을 제거하고 색상 화 된 것을 설정했습니다.

여기 내 logger.js입니다

var logger = require('winston');

logger.setLevels({
    debug:0,
    info: 1,
    silly:2,
    warn: 3,
    error:4,
});
logger.addColors({
    debug: 'green',
    info:  'cyan',
    silly: 'magenta',
    warn:  'yellow',
    error: 'red'
});

logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { level: 'debug', colorize:true });

module.exports = logger;



app.js에서로드 :

var logger = require('./lib/log.js');  



다른 모듈에서로드 :

 var logger = require('winston');        

(OP가 Winston에 대해 묻는 것처럼) 주제에서 약간 벗어 났지만 Bunyan의 'child-logger'접근 방식을 좋아합니다.

var bunyan = require('bunyan');
var log = bunyan.createLogger({name: 'myapp'});

app.use(function(req, res, next) {
  req.log = log.child({reqId: uuid()});
  next();
});

app.get('/', function(req, res) {
  req.log.info({user: ...});
});

It solves the OP's problem as the logger is available through the req object (hence no need for 'require(log)' in each module). Additionally, all log entries belonging to a particular request will have a unique ID that connects them together.

{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"...@gmail.com","time":"2014-05-26T18:27:43.530Z","v":0}

I'm not sure if Winston supports this as well.


I'm creating a new Winston logger.

log.js

'use strict';

const winston = require('winston');

module.exports = new(winston.Logger)({
    transports: [
        new(winston.transports.Console)({
            level: 'info'
        })
    ]
});

a.js

const log = require('./log');

log.info("from a.js");

b.js

const log = require('./log');

log.info("from b.js");

I am working on Winston 3.0.0 right now. And it seems the way to configure the default logger has changed a little bit. The way that works for me is folloing:

log.js// the setting for global logger

const winston= require('winston');

winston.configure({
  level:"debug",
  format: winston.format.combine(
    winston.format.colorize(),
    winston.format.simple()
  ),
  transports: [
    new winston.transports.Console()
  ]
});

The other part is the same. In the beginning of you application, require('log.js'), and also require ('winston'), While in all other files, simply require('winston')

.


if you want to make the logger a global variable- you have to do specifically by assign it to the global variable like so

logger.js

var winston = require('winston')

var winston = winston.createLogger({
transports: [
  new (winston.transports.Console)(),
  new (winston.transports.File)({
    filename: './logs/logger.log'
  })
]
});
module.exports=winston;

app.js

let logger  = require('./logger')
global.__logger = logger

someController.js

__logger.info('created log successfully')

Note: it's good practice to assign a prefix for every global variable so you will know that is a global one. i'm using __ as prefix (double low dash)

참고URL : https://stackoverflow.com/questions/14531232/using-winston-in-several-modules

반응형