거의 모든 것에 대한 로거입니다.
자세한 내용은 업그레이드 가이드를 참조하세요. 버그 신고 및 PR을 환영합니다!
[email protected]
문서를 찾고 계십니까? 아래 문서는 winston@3
에 대한 것입니다. [email protected]
문서를 읽어보세요.
winston
다중 전송을 지원하는 간단하고 보편적인 로깅 라이브러리로 설계되었습니다. 전송은 기본적으로 로그를 위한 저장 장치입니다. 각 winston
로거에는 다양한 수준(참조: 로깅 수준)으로 구성된 여러 전송(참조: 전송)이 있을 수 있습니다. 예를 들어, 오류 로그는 지속적인 원격 위치(예: 데이터베이스)에 저장하고 싶지만 모든 로그는 콘솔이나 로컬 파일로 출력되기를 원할 수 있습니다.
winston
로깅 프로세스의 일부를 분리하여 보다 유연하고 확장 가능하게 만드는 것을 목표로 합니다. 로그 형식화(형식 참조) 및 수준(참조: 사용자 정의 로깅 수준 사용)의 유연성을 지원하고 해당 API가 전송 로깅 구현에서 분리되도록 보장하는 데 주의를 기울입니다(예: 로그 저장/인덱싱 방법, 사용자 정의 추가 참조). 전송)을 프로그래머에게 공개한 API로 전송합니다.
TL, DR? ./examples/
에서 빠른 시작 예시를 확인하세요. ./examples/*.js
에는 다른 많은 예제가 있습니다. 거기에 있어야 한다고 생각하는 예가 없나요? 추가하려면 끌어오기 요청을 제출하세요!
winston
사용하는 데 권장되는 방법은 자신만의 로거를 만드는 것입니다. 이를 수행하는 가장 간단한 방법은 winston.createLogger
사용하는 것입니다.
const winston = require('winston');const logger = winston.createLogger({ level: 'info', format: winston.format.json(), defaultMeta: { service: 'user-service' }, 전송: [ / / // - 중요도 수준이 `error` 이상인 모든 로그를 `error.log`에 기록합니다. // (예: 오류, 치명적이지만 다른 수준은 아님) // new winston.transports.File({ filename: 'error .통나무', level: 'error' }), // // - 중요도가 `info` 이상인 모든 로그를 `combined.log`에 기록 // (즉, fatal, error, warning 및 info, 그러나 추적은 아님) / / new winston.transports.File({ filename: 'combined.log' }), ],});//// 프로덕션 단계가 아닌 경우 // `$ 형식으로 `콘솔`에 로그인합니다. {정보.수준}: ${info.message} JSON.stringify({ ...rest }) `//if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ 형식: 윈스턴 .format.simple(), }));}
require('winston')
에 의해 노출된 기본 로거를 통해 직접 로깅할 수도 있지만 이는 단지 원하는 경우 애플리케이션 전체에서 사용할 수 있는 편리한 공유 로거일 뿐입니다. 기본 로거에는 기본적으로 전송이 없습니다. 전송을 직접 추가해야 하며 전송 없이 기본 로거를 그대로 두면 높은 메모리 사용량 문제가 발생할 수 있습니다.
동기 부여
빠른 시작
용법
목차
벌채 반출
로거 생성
스트림, objectMode
및 info
객체
형식
형식 결합
문자열 보간
info
개체 필터링
사용자 정의 형식 만들기
로깅 수준
로깅 수준 사용
사용자 정의 로깅 수준 사용
교통수단
동일한 유형의 여러 운송
사용자 정의 전송 추가
일반적인 교통수단
예외
Winston을 사용하여 포착되지 않은 예외 처리
종료하거나 종료하지 않으려면
거부
Winston을 사용하여 포착되지 않은 약속 거부 처리
프로파일링
스트리밍 로그
로그 쿼리
추가 자료
기본 로거 사용
winston
에서 로그가 작성되기를 기다리는 중
winston
에서 여러 로거로 작업하기
stdout 및 stderr 대신 콘솔 전송 메시지를 콘솔로 라우팅
설치
테스트 실행
winston
의 로깅 수준은 RFC5424에 지정된 심각도 순서를 따릅니다. 모든 수준의 심각도는 숫자상 가장 중요한 것부터 가장 덜 중요한 것까지 오름차순 으로 가정됩니다.
const level = { 오류: 0, 경고: 1, 정보: 2, http: 3, 자세한 정보: 4, 디버그: 5, 어리석은: 6};
winston.createLogger
사용하여 로거를 생성하는 것으로 시작합니다.
const logger = winston.createLogger({ 전송: [ new winston.transports.Console(), new winston.transports.File({ 파일 이름: 'combined.log' }) ]});
로거는 다음 매개변수를 허용합니다.
이름 | 기본 | 설명 |
---|---|---|
level | 'info' | info.level 이 수준보다 작거나 같은 경우에만 기록합니다. |
levels | winston.config.npm.levels | 로그 우선순위를 나타내는 수준(및 색상) |
format | winston.format.json | info 메시지 형식 지정(형식 참조) |
transports | [] (교통편 없음) | info 메시지에 대한 로깅 대상 세트 |
exitOnError | true | false인 경우 처리된 예외로 인해 process.exit 발생하지 않습니다. |
silent | false | true인 경우 모든 로그가 표시되지 않습니다. |
createLogger
에 제공된 레벨은 반환된 logger
에 대한 편의 메서드로 정의됩니다.
//// 로깅//logger.log({ level: 'info', message: '안녕하세요 분산 로그 파일!'});logger.info('안녕하세요 분산 로그');
winston.createLogger
에서 전송이 제공되면 logger
에서 전송을 추가하거나 제거할 수 있습니다.
const files = new winston.transports.File({ filename: 'combined.log' });const console = new winston.transports.Console();logger .clear() // 모든 전송 제거 .add(console) // 콘솔 전송 추가 .add(files) // 파일 전송 추가 .remove(console); // 콘솔 전송 제거
configure
메소드를 사용하여 winston.Logger
인스턴스를 전체적으로 재구성할 수도 있습니다.
const logger = winston.createLogger({ level: 'info', 전송: [ new winston.transports.Console(), new winston.transports.File({ 파일 이름: 'combined.log' }) ]});/// / 이전 전송을 // 새로운 구성의 전송으로 대체합니다.//const DailyRotateFile = require('winston-daily-rotate-file');logger.configure({ level: 'verbose', 전송: [ new DailyRotateFile(opts) ]});
메타데이터 재정의를 전달하기 위해 기존 로거에서 하위 로거를 생성할 수 있습니다.
const logger = winston.createLogger({ 전송: [ new winston.transports.Console(), ]});const childLogger = logger.child({ requestId: '451' });
.child
this
키워드가 예상치 못한 것을 가리키게 만드는 일부 구현 세부 사항으로 인해Logger
클래스도 확장하는 경우 버그가 발생할 가능성이 높습니다. 주의해서 사용하세요.
objectMode
및 info
객체 winston
에서는 Logger
및 Transport
인스턴스 모두 info
개체를 허용하는 objectMode
스트림으로 처리됩니다.
특정 형식에 제공된 info
매개변수는 단일 로그 메시지를 나타냅니다. 객체 자체는 변경 가능합니다. 모든 info
최소한 level
및 message
속성이 있어야 합니다.
const info = { level: 'info', // 로깅 메시지 수준 message: 'Hey! 뭔가를 기록하시겠습니까?' // 설명 메시지가 기록됩니다.};
레벨과 메시지 이외의 속성은 " meta
"로 간주됩니다. 즉:
const { 레벨, 메시지, ...메타 } = 정보;
logform
자체의 여러 형식에는 추가 속성이 추가됩니다.
재산 | 형식을 추가한 사람 | 설명 |
---|---|---|
splat | splat() | %d %s 스타일 메시지에 대한 문자열 보간 표시입니다. |
timestamp | timestamp() | 메시지가 수신된 타임스탬프입니다. |
label | label() | 각 메시지와 관련된 맞춤 라벨입니다. |
ms | ms() | 이전 로그 메시지 이후 경과된 시간(밀리초)입니다. |
소비자로서 원하는 속성을 무엇이든 추가할 수 있습니다. 내부 상태는 Symbol
속성에 의해 유지됩니다.
Symbol.for('level')
(읽기 전용) : level
속성과 동일합니다. 모든 코드에서 불변으로 처리됩니다.
Symbol.for('message'):
"형식 마무리"에 의해 설정된 완전한 문자열 메시지:
json
logstash
printf
prettyPrint
simple
Symbol.for('splat')
: 추가 문자열 보간 인수. splat()
형식에서만 사용됩니다.
이러한 기호는 다른 패키지인 triple-beam
에 저장되어 모든 logform
소비자가 동일한 기호 참조를 가질 수 있습니다. 즉:
const { LEVEL, MESSAGE, SPLAT } = require('triple-beam');console.log(LEVEL === Symbol.for('level'));// trueconsole.log(MESSAGE === Symbol.for( 'message'));// trueconsole.log(SPLAT === Symbol.for('splat'));// true
참고: 제공된
meta
개체의 모든{ message }
속성은 이미 제공된 모든msg
에 자동으로 연결됩니다. 예를 들어 아래에서는 'world'를 'hello'에 연결합니다.logger.log('error', 'hello', { 메시지: 'world' });logger.info('hello', { 메시지: 'world' });
winston
의 형식은 winston.format
에서 액세스할 수 있습니다. 이는 winston
과 별도의 모듈인 logform
으로 구현됩니다. 이는 전송에 기본 형식을 포함하려는 경우 자체 전송을 작성할 때 유연성을 허용합니다.
최신 버전의 node
템플릿 문자열은 성능이 매우 뛰어나며 대부분의 최종 사용자 형식 지정에 권장되는 방법입니다. 로그 형식을 맞춤화하려면 winston.format.printf
적합합니다.
const { createLogger, 형식, 전송 } = require('winston');const { 결합, 타임스탬프, 라벨, printf } = 형식;const myFormat = printf(({ 레벨, 메시지, 라벨, 타임스탬프 }) => { return ` ${timestamp} [${label}] ${level}: ${message}`;});const logger = createLogger({ 형식: 결합( label({ 레이블: 'right 야옹!' }), timestamp(), myFormat ), 전송: [new Transports.Console()]});
어떤 내장 형식을 사용할 수 있는지 확인하고 사용자 정의 로깅 형식을 만드는 방법에 대해 자세히 알아보려면 logform
참조하세요.
format.combine
사용하면 다양한 형식을 단일 형식으로 결합할 수 있습니다. format.combine
opts
사용하지 않으므로 편의상 결합된 형식의 미리 생성된 인스턴스를 반환합니다.
const { createLogger, 형식, 전송 } = require('winston');const { 결합, 타임스탬프, 라벨, PrettyPrint } = 형식;const logger = createLogger({ 형식: 결합( label({ label: '오른쪽 야옹!' } ), timestamp(), PrettyPrint() ), Transports: [new Transports.Console()]})logger.log({ level: 'info', message: '테스트 시간은 언제입니까? at?'});// 출력:// { 레벨: '정보',// 메시지: '테스트 시간은 몇 시입니까?',// 라벨: '맞아 야옹!',// 타임스탬프: '2017- 09-30T03:57:26.875Z' }
log
메소드는 util.format을 사용하여 문자열 보간을 제공합니다. format.splat()
사용하여 활성화해야 합니다.
다음은 format.splat
사용하여 메시지의 문자열 보간으로 형식을 정의한 다음 format.simple
사용하여 전체 info
메시지를 직렬화하는 예입니다.
const { createLogger, 형식, 전송 } = require('winston');const logger = createLogger({ 형식: format.combine( format.splat(), format.simple() ), 전송: [new Transports.Console() ]});// 정보: 테스트 메시지 내 문자열 {}logger.log('info', '테스트 메시지 %s', 'my string');// 정보: 테스트 메시지 123 {}logger.log('info', '테스트 메시지 %d', 123);// info: 테스트 메시지 첫 번째 두 번째 {번호: 123}logger.log('info', '테스트 메시지 %s, %s' , '첫 번째', '두 번째', { 번호: 123 });
info
개체 필터링 로깅할 때 주어진 info
객체를 완전히 필터링하려면 거짓 값을 반환하면 됩니다.
const { createLogger, format, Transports } = require('winston');// 로그 메시지에 { private: true }가 있는 경우 무시합니다. constignorePrivate = format((info, opts) => { if (info.private) { return false; } 정보 반환;});const logger = createLogger({ 형식: format.combine(ignorePrivate(), format.json() ), 전송: [new Transports.Console()]});// 출력: {"level":"error","message":"공유할 공개 오류"}logger.log({ level: 'error', message: '공개 오류 share'});// { private: true }가 포함된 메시지는 기록될 때 기록되지 않습니다.logger.log({ private: true, level: 'error', message: '이것은 극비입니다 - 숨깁니다.'}) ;
format.combine
을 사용하면 잘못된 값 반환을 존중하고 시리즈의 이후 형식에 대한 평가를 중지합니다. 예를 들어:
const { format } = require('winston');const { Combine, timestamp, label } = format;const willNeverThrow = format.combine( format(info => { return false })(), // 모든 것을 무시합니다 format(info => { throw new Error('도달하지 못했습니다') })());
형식은 단일 메소드 transform(info, opts)
를 정의하고 변경된 info
반환하는 프로토타입 객체(예: 클래스 인스턴스)입니다.
info
: 로그 메시지를 나타내는 객체입니다.
opts
: 형식의 현재 인스턴스에 특정한 설정입니다.
다음 두 가지 중 하나를 반환할 것으로 예상됩니다.
수정된 info
인수를 나타내는 info
개체입니다 . 불변성을 선호하는 경우 객체 참조를 보존할 필요가 없습니다. 현재 내장된 모든 형식은 info
변경 가능으로 간주되지만 [immutablejs]는 향후 릴리스에서 고려되고 있습니다.
호출자가 info
인수를 무시해야 함을 나타내는 잘못된 값입니다 . (참조: info
개체 필터링).
winston.format
은 가능한 한 간단하게 설계되었습니다. 새로운 형식을 정의하려면 간단히 transform(info, opts)
함수를 전달하여 새 Format
얻으세요.
반환된 명명된 Format
원하는 만큼 지정된 Format
의 복사본을 만드는 데 사용할 수 있습니다.
const { 형식 } = require('winston');const 볼륨 = 형식((info, opts) => { if (opts.yell) { info.message = info.message.toUpperCase(); } else if (opts. 속삭임) { info.message = info.message.toLowerCase(); } return info;});// 'volume'은 이제 format.const 비명 = 볼륨({ 외침: true });console.dir(scream.transform({ level: 'info', message: `너를 머릿속에서 소리나게 만들어서 미안해!`}, 비명.옵션)); // {// 레벨: '정보'// 메시지: '혼자서 소리를 지르게 해서 죄송합니다!'// }// `volume`을 여러 번 사용하여 다양한 형식을 만들 수 있습니다.const 속삭임 = 볼륨({ 속삭임: true });console.dir(whisper.transform({ level: 'info', message: `왜 그들이 우리에게 그렇게 많은 소리를 지르게 만드는가!`}, 속삭임.options));// {// level: ' info'// 메시지: '그들은 왜 우리를 그렇게 소리치게 만드는가!'// }
winston
의 로깅 수준은 RFC5424에 지정된 심각도 순서를 따릅니다. 모든 수준의 심각도는 숫자상 가장 중요한 것부터 가장 덜 중요한 것까지 오름차순 으로 가정됩니다.
각 level
특정 정수 우선순위가 부여됩니다. 우선순위가 높을수록 메시지가 더 중요하다고 간주되며 해당 정수 우선순위는 낮아집니다. 예를 들어 RFC5424에 정확히 지정된 대로 syslog
수준의 우선순위는 0에서 7(가장 높은 것부터 가장 낮은 것까지)입니다.
{ 출현: 0, 경고: 1, 치명적: 2, 오류: 3, 경고: 4, 알림: 5, 정보: 6, 디버그: 7}
마찬가지로 npm
로깅 수준의 우선순위는 0에서 6까지입니다(가장 높은 것부터 가장 낮은 것까지).
{ 오류: 0, 경고: 1, 정보: 2, http: 3, 자세한 정보: 4, 디버그: 5, 어리석은: 6}
winston
사용해야 하는 수준을 명시적으로 정의하지 않으면 위의 npm
수준이 사용됩니다.
로깅 메시지의 수준 설정은 두 가지 방법 중 하나로 수행할 수 있습니다. 로깅 수준을 나타내는 문자열을 log() 메서드에 전달하거나 모든 Winston Logger에 정의된 수준 지정 메서드를 사용할 수 있습니다.
//// 모든 로거 인스턴스//logger.log('silly', "127.0.0.1 - 집보다 좋은 곳은 없습니다");logger.log('debug', "127.0.0.1 - 집보다 좋은 곳은 없습니다") ;logger.log('verbose', "127.0.0.1 - 집만한 곳은 없습니다.");logger.log('info', "127.0.0.1 - 집만한 곳은 없습니다");logger.log('warn', "127.0.0.1 - 집 같은 곳은 없습니다");logger.log('error', "127.0.0.1 - 집 같은 곳은 없습니다") ;logger.info("127.0.0.1 - 집보다 좋은 곳은 없습니다");logger.warn("127.0.0.1 - 집보다 좋은 곳은 없습니다" home");logger.error("127.0.0.1 - 집보다 좋은 곳은 없습니다");//// 기본 로거//winston.log('info', "127.0.0.1 - 집보다 좋은 곳은 없습니다"); winston.info("127.0.0.1 - 집만한 곳은 없습니다");
winston
사용하면 전송이 기록해야 하는 메시지의 최대 수준을 지정하는 각 전송의 level
속성을 정의할 수 있습니다. 예를 들어, syslog
수준을 사용하면 error
메시지만 콘솔에 기록하고 그 아래의 모든 info
파일( error
메시지 포함)에 기록할 수 있습니다.
const logger = winston.createLogger({ 레벨: winston.config.syslog.levels, 전송: [ new winston.transports.Console({ 레벨: 'error' }), new winston.transports.File({ 파일 이름: 'combined. 로그', 수준: '정보' }) ]});
전송의 로그 수준을 동적으로 변경할 수도 있습니다.
const 전송 = { 콘솔: 새로운 Winston.transports.Console({ 레벨: '경고' }), 파일: 새로운 Winston.transports.File({ 파일 이름: 'combined.log', 레벨: '오류' })};const logger = winston.createLogger({ Transports: [ Transports.console, Transports.file ]});logger.info('둘 중 하나에도 로그인되지 않습니다. Transport!');transports.console.level = 'info';transports.file.level = 'info';logger.info('두 전송 모두에 기록됩니다!');
winston
npm 스타일 로깅 수준을 기본으로 하는 사용자 정의 가능한 로깅 수준을 지원합니다. 로거를 생성할 때 레벨을 지정해야 합니다.
winston
에서 사용할 수 있는 사전 정의된 npm
, syslog
및 cli
수준 외에도 다음과 같이 직접 정의하도록 선택할 수도 있습니다.
const myCustomLevels = { 레벨: { foo: 0, bar: 1, baz: 2, foobar: 3 }, colors: { foo: '파란색', bar: '녹색', baz: '노란색', foobar: '빨간색' }};const customLevelLogger = winston.createLogger({ level: myCustomLevels.levels});customLevelLogger.foobar('some foobar 수준 메시지');
이 데이터 구조에는 약간의 반복이 있지만 색상을 원하지 않는 경우 간단한 캡슐화가 가능합니다. 색상을 원할 경우 레벨을 Logger 자체에 전달하는 것 외에도 Winston이 색상을 인식하도록 해야 합니다.
winston.addColors(myCustomLevels.colors);
이를 통해 colorize
포맷터를 사용하는 로거는 사용자 정의 레벨의 출력에 적절한 색상과 스타일을 지정할 수 있습니다.
또한 배경색과 글꼴 스타일을 변경할 수도 있습니다. 예를 들어,
baz: '기울임꼴 노란색',foobar: '굵은 빨간색 청록색BG'
가능한 옵션은 다음과 같습니다.
글꼴 스타일: bold
, dim
, italic
, underline
, inverse
, hidden
, strikethrough
.
글꼴 전경 색상: black
, red
, green
, yellow
, blue
, magenta
, cyan
, white
, gray
, grey
.
배경 색상: blackBG
, redBG
, greenBG
, yellowBG
, blueBG
magentaBG
, cyanBG
, whiteBG
표준 로깅 수준을 색상화하려면 다음을 추가하세요.
winston.format.combine(winston.format.colorize(), winston.format.simple());
여기서 winston.format.simple()
사용하려는 다른 포맷터입니다. colorize
포맷터는 색상을 지정하려는 텍스트를 추가하는 포맷터보다 먼저 와야 합니다.
json 포맷터를 사용하여 전체 로그 줄을 색상화하려면 다음을 적용할 수 있습니다.
winston.format.combine(winston.format.json(), winston.format.colorize({ all: true }));
winston
에는 Node.js 코어에서 제공하는 내장 네트워킹 및 파일 I/O를 활용하는 여러 가지 핵심 전송이 포함되어 있습니다. 또한, 커뮤니티 구성원이 작성한 추가 이동 수단도 있습니다.
전송을 구성할 때 winston.transports.File
과 같은 동일한 유형의 여러 전송을 사용할 수 있습니다.
const logger = winston.createLogger({ 전송: [ new winston.transports.File({ 파일 이름: 'combined.log', 레벨: 'info' }), new winston.transports.File({ 파일 이름: 'errors.log' , 수준: '오류' }) ]});
나중에 이러한 전송 중 하나를 제거하려면 전송 자체를 사용하여 제거할 수 있습니다. 예:
const CombinedLogs = logger.transports.find(transport => { return Transport.filename === 'combined.log'});logger.remove(combinedLogs);
사용자 정의 전송을 추가하는 것은 쉽습니다. 당신이 해야 할 일은 필요한 옵션을 수락하고, log() 메서드를 구현하고, 이를 winston
으로 사용하는 것뿐입니다.
const Transport = require('winston-transport');const util = require('util');//// `winston-transport`에서 상속되므로 // 기본 기능과 `.Exceptions.handle을 활용할 수 있습니다. ()`.//module.exports = 클래스 YourCustomTransport 확장 Transport { 생성자(opts) { super(opts); // // 여기에서 사용자 정의 옵션을 사용합니다. 예: // - 데이터베이스에 대한 연결 정보 // - API에 대한 인증 정보(예: loggly, papertrail, // logentries 등). // } log(info, callback) { setImmediate(() => { this.emit('logged', info); }); // 원격 서비스에 쓰기를 수행합니다. callback(); }};
모든 전송은 winston-transport에서 상속되므로 각 전송에 대해 개별적으로 사용자 정의 형식과 사용자 정의 로그 수준을 설정할 수 있습니다.
const logger = winston.createLogger({ 전송: [ new winston.transports.File({ 파일 이름: 'error.log', 레벨: 'error', 형식: winston.format.json() }), new winston.transports. Http({ 레벨: '경고', 형식: winston.format.json() }), 새로운 winston.transports.Console({ 레벨: '정보', 형식: winston.format.combine( winston.format.colorize(), winston.format.simple() ) }) ]});
winston
사용하면 프로세스에서 uncaughtException
이벤트를 포착하고 기록할 수 있습니다. 자체 로거 인스턴스를 사용하면 생성 시 또는 나중에 애플리케이션 수명 주기에서 이 동작을 활성화할 수 있습니다.
const { createLogger, Transports } = require('winston');// logger를 생성할 때 예외 처리를 활성화합니다.const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] , 예외 처리기: [ new Transports.File({ filename: 'Exceptions.log' }) ]});// 또는 나중에 전송을 추가하거나 다음을 사용하여 활성화합니다. `.Exceptions.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// 예외 처리를 위해 전송을 사용하여 예외 로거.Exceptions.handle을 호출합니다. ( new Transports.File({ 파일 이름: 'Exceptions.log' }));
기본 로거와 함께 이 기능을 사용하려면 전송 인스턴스와 함께 .exceptions.handle()
호출하면 됩니다.
//// 별도의 예외 로거를 `.Exceptions.handle`//winston.Exceptions.handle( new winston.transports.File({ filename: 'path/to/Exceptions.log' }) 에 전달하여 추가할 수 있습니다. );//// 또는 winston.//winston.add(new winston.transports.File({ 파일 이름: 'path/to/combined.log', handlerExceptions: true}));
기본적으로 Winston은 uncaughtException을 기록한 후 종료됩니다. 이것이 원하는 동작이 아닌 경우 exitOnError = false
로 설정하십시오.
const logger = winston.createLogger({exitOnError: false });//// 또는 다음과 같이://logger.exitOnError = false;
사용자 정의 로거 인스턴스로 작업할 때 별도의 전송을 exceptionHandlers
속성에 전달하거나 모든 전송에서 handleExceptions
설정할 수 있습니다.
const logger = winston.createLogger({ 전송: [ new winston.transports.File({ 파일 이름: 'path/to/combined.log' }) ], 예외 처리기: [ new winston.transports.File({ 파일 이름: 'path/ to/Exceptions.log' }) ]});
const logger = winston.createLogger({ 전송: [ new winston.transports.Console({ handlerExceptions: true }) ],exitOnError: false});
exitOnError
옵션은 특정 유형의 오류에서만 종료되는 것을 방지하는 함수일 수도 있습니다:
functionignoreEpipe(err) { return err.code !== 'EPIPE';}const logger = winston.createLogger({exitOnError:ignoreEpipe });//// 또는 다음과 같이://logger.exitOnError =ignoreEpipe;
winston
사용하면 프로세스에서 unhandledRejection
이벤트를 포착하고 기록할 수 있습니다. 자체 로거 인스턴스를 사용하면 생성 시 또는 나중에 애플리케이션 수명 주기에서 이 동작을 활성화할 수 있습니다.
const { createLogger, Transports } = require('winston');// logger를 생성할 때 거부 처리 활성화.const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] , RejectionsHandlers: [ new Transports.File({ filename: 'rejections.log' }) ]});// 또는 나중에 전송을 추가하거나 다음을 사용하여 활성화합니다. `.rejections.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// Rejectionslogger.rejections.handle을 처리하기 위한 전송을 통해 Rejections.handle을 호출합니다. ( new Transports.File({ 파일 이름: 'rejections.log' }));
기본 로거와 함께 이 기능을 사용하려면 전송 인스턴스와 함께 .rejections.handle()
호출하면 됩니다.
//// `.rejections.handle`//winston.rejections.handle( new winston.transports.File({ filename: 'path/to/rejections.log' }) 에 전달하여 별도의 거부 로거를 추가할 수 있습니다. );//// 또는 winston.//winston.add(new winston.transports.File({ 파일 이름: 'path/to/combined.log', handlerRejections: true}));
메시지 및 메타데이터 로깅 외에도 winston
모든 로거에 대해 구현된 간단한 프로파일링 메커니즘이 있습니다.
//// 'test' 프로필 시작//logger.profile('test');setTimeout(function () { // // 'test' 프로필 중지. 이제 로깅이 발생합니다: // '17 Jan 21 :00:00 - 정보: 테스트 기간=1000ms' // logger.profile('test');}, 1000);
또한 타이머를 시작하고 .done()
호출할 수 있는 참조를 유지할 수 있습니다.
// 특정 타이밍에 해당하는 객체를 반환합니다. 완료 // 호출되면 타이머가 종료되고 지속 시간이 기록됩니다. 예: // const profiler = logger.startTimer(); setTimeout(function () { profiler.done({ 메시지: '로깅 메시지' }); }, 1000);
모든 프로필 메시지는 기본적으로 '정보' 수준으로 설정되며 메시지와 메타데이터는 모두 선택 사항입니다. 개별 프로필 메시지의 경우 level
속성이 포함된 메타데이터 개체를 제공하여 기본 로그 수준을 재정의할 수 있습니다.
logger.profile('테스트', { 레벨: '디버그' });
winston
Loggly와 유사한 옵션을 사용하여 로그 쿼리를 지원합니다. Loggly 검색 API를 참조하세요. 구체적으로는 File
, Couchdb
, Redis
, Loggly
, Nssocket
및 Http
입니다.
const options = { from: new Date() - (24 * 60 * 60 * 1000), Until: new Date(), 제한: 10, 시작: 0, 순서: 'desc', 필드: ['message']} ;//// 오늘부터 어제 사이에 기록된 항목을 찾습니다.//logger.query(options, function (err, results) { if (err) { /* TODO: 처리하세요 */ throw err; } console.log(결과);});
스트리밍을 사용하면 선택한 전송에서 로그를 다시 스트리밍할 수 있습니다.
//// 끝에서 시작합니다.//winston.stream({ start: -1 }).on('log', function(log) { console.log(log);});
기본 로거는 winston
모듈을 통해 직접 액세스할 수 있습니다. 로거 인스턴스에서 호출할 수 있는 모든 메서드는 기본 로거에서 사용할 수 있습니다.
const winston = require('winston');winston.log('info', '안녕하세요 분산 로그 파일!');winston.info('안녕하세요 다시 분산 로그');winston.level = 'debug';winston.log ('디버그', '이제 내 디버그 메시지가 콘솔에 기록되었습니다!');
기본적으로 기본 로거에는 전송이 설정되지 않습니다. add()
및 remove()
메서드를 통해 전송을 추가하거나 제거해야 합니다.
const 파일 = 새로운 winston.transports.File({ 파일 이름: 'combined.log' });const 콘솔 = 새로운 winston.transports.Console();winston.add(console);winston.add(files);winston.remove (콘솔);
또는 한 번의 구성() 호출로 수행할 수 있습니다.
winston.configure({ 전송: [ new winston.transports.File({ 파일 이름: 'somefile.log' }) ]});
winston
에서 지원하는 각 개별 전송 작업에 대한 자세한 문서는 winston
Transports 문서를 참조하세요.
winston
에서 로그가 작성되기를 기다리는 중 프로세스를 종료하기 전에 로그가 기록될 때까지 기다리는 것이 유용한 경우가 많습니다. winston.Logger
의 각 인스턴스는 [Node.js 스트림]이기도 합니다. 스트림이 종료된 후 모든 로그가 모든 전송으로 플러시되면 finish
이벤트가 발생합니다.
const Transport = new winston.transports.Console();const logger = winston.createLogger({ Transports: [transport]});logger.on('finish', function (info) { // 모든 `info` 로그 메시지에는 이제 기록되었습니다});logger.info('CHILL WINSTON!', { 심각하게: true });logger.end();
처리되지 않은 예외를 원하지 않는 경우 처리하거나 억제해야 하는 로거 자체 내에서 오류가 발생하는 경우 로거가 '오류' 이벤트를 발생시킨다는 점도 언급할 가치가 있습니다.
//// 로거 자체에서 발생한 오류를 처리합니다.//logger.on('error', function (err) { /* Do Something */ });
더 크고 복잡한 애플리케이션에서는 설정이 다른 여러 로거 인스턴스가 필요한 경우가 많습니다. 각 로거는 서로 다른 기능 영역(또는 카테고리)을 담당합니다. 이는 winston.loggers
및 winston.Container
인스턴스를 통해 두 가지 방법으로 winston
에 노출됩니다. 실제로 winston.loggers
는 winston.Container
의 사전 정의된 인스턴스일 뿐입니다.
const winston = require('winston');const { format } = winston;const { Combine, label, json } = format;//// `category1`에 대한 로거 구성//winston.loggers.add('category1' , { 형식: 결합( label({ label: 'category one' }), json() ), 전송: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});//// `category2`에 대한 로거 구성//winston.loggers.add('category2', { 형식: Combine( label({ label: 'category two' }), json() ), 전송: [ new winston.transports.Http({ 호스트: 'localhost', 포트:8080 }) ]});
이제 로거가 설정되었으므로 애플리케이션의 모든 파일에서 Winston을 요구하고 사전 구성된 다음 로거에 액세스할 수 있습니다.
const winston = require('winston');//// 사전 구성된 로거 가져오기//const Category1 = winston.loggers.get('category1');const Category2 = winston.loggers.get('category2');category1. info('파일 및 콘솔 전송에 로깅');category2.info('http 전송에 로깅');
Container
직접 관리하고 싶다면 간단히 인스턴스화하면 됩니다.
const winston = require('winston');const { 형식 } = winston;const { 결합, 레이블, json } = 형식;const 컨테이너 = 새로운 winston.Container();container.add('category1', { 형식: 결합 ( label({ label: 'category one' }), json() ), 전송: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});const Category1 = Container.get('category1');category1.info('파일 및 콘솔 전송에 로깅');
기본적으로 winston.transports.Console
전송은 메시지를 stdout
및 stderr
로 보냅니다. 대부분의 상황에서는 괜찮습니다. 그러나 다음과 같이 이것이 바람직하지 않은 경우도 있습니다.
VSCode를 사용하여 디버깅하고 Node.js 프로세스를 실행하는 대신 연결
AWS Lambda에서 JSON 형식 메시지 작성
--silent
옵션을 사용하여 Jest 테스트 중 로깅
전송 로그에서 console.log()
, console.warn()
및 console.error()
를 대신 사용하려면 forceConsole
옵션을 true
로 설정하세요.
const logger = winston.createLogger({ level: 'info', Transports: [new winston.transports.Console({ forceConsole: true })]});
npm 설치 윈스턴
원사 추가 윈스턴
모든 Winston 테스트는 mocha
, nyc
및 assume
으로 작성되었습니다. npm
으로 실행할 수 있습니다.
npm 테스트