여러 모듈에서 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
'Programing' 카테고리의 다른 글
factory_girl 연관을 통해 레코드 찾기 또는 생성 (0) | 2020.12.04 |
---|---|
자식 흐름 분기가 갈라졌습니다. (0) | 2020.12.04 |
UICollectionView 레이아웃 문제 (0) | 2020.12.04 |
div를 숨기고 빈 공간은 유지 (0) | 2020.12.04 |
C #에서 폐기 된 폐쇄에 대한 액세스? (0) | 2020.12.04 |