Node.js - Winston 라이브러리를 사용하여 로그에 타임스탬프를 추가하는 방법은 무엇입니까?
로그에 타임스탬프를 추가하고 싶습니다.
이를 달성하는 가장 좋은 방법은 무엇입니까?
감사해요.
위의 답변은 저에게 효과가 없었습니다.Winston - 3.0.0-rc1의 최신 버전을 사용하여 로그에 타임스탬프를 추가하려는 경우, 이 작업은 매우 효과적이었습니다.
const {transports, createLogger, format} = require('winston');
const logger = createLogger({
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new transports.Console(),
new transports.File({filename: 'logs/error/error.log', level: 'error'}),
new transports.File({filename: 'logs/activity/activity.log', level:'info'})
]
});
저는 'format.combine()'을 사용했습니다.모든 전송에 타임스탬프가 필요했기 때문에 각 전송 내부가 아닌 createLogger 내에 포맷 옵션을 추가했습니다.콘솔 및 파일(activity.log)에 대한 내 출력은 다음과 같습니다.
{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}
{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}
다음을 사용하여 평소와 같이 'format.combine()' 형식으로 이 타임스탬프에 형식을 추가할 수 있습니다.
format.timestamp({format:'MM-YY-DD'})
저도 같은 문제를 다루고 있었습니다.제가 이 일을 할 수 있었던 방법은 두 가지가 있습니다.
Winston을 포함하면 일반적으로 콘솔 전송을 추가하는 것으로 기본 설정됩니다.이 기본 사례에서 타임스탬프가 작동하도록 하려면 다음 중 하나를 수행해야 했습니다.
- 콘솔 전송을 제거하고 타임스탬프 옵션을 사용하여 다시 추가합니다.
- 타임스탬프 옵션이 true로 설정된 자체 Logger 개체를 만듭니다.
첫 번째:
var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'timestamp':true});
두 번째, 그리고 더 깨끗한 옵션:
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({'timestamp':true})
]
});
콘솔 전송의 다른 옵션 중 일부는 다음에서 확인할 수 있습니다.
- level: 이 전송이 기록해야 하는 메시지의 수준(기본값은 '디버깅')입니다.
- silent: 출력을 억제할지 여부를 나타내는 부울 플래그입니다(기본값은 false).
- 색상 지정:출력을 색상화할지 여부를 나타내는 부울 플래그(기본값은 거짓)입니다.
- timestamp: 출력에 타임스탬프를 추가해야 하는지 여부를 나타내는 부울 플래그입니다(기본값은 false).함수를 지정하면 반환 값이 타임스탬프 대신 사용됩니다.
우리도 이렇게 할 수 있습니다.
var winston = require('winston');
const { createLogger, format, transports } = require('winston');
var config = require('../configurations/envconfig.js');
var loggerLevel = process.env.LOGGERLEVEL || config.get('LOGGERLEVEL');
var logger = winston.createLogger({
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`+(info.splat!==undefined?`${info.splat}`:" "))
),
transports: [
new (winston.transports.Console)({ level: loggerLevel }),
]
});
module.exports = logger;
기본 제공 util 및 forever를 사용하여 nodejs 서버에 대한 타임스탭으로 로깅을 수행할 수 있습니다.서버를 시작할 때 매개 변수의 일부로 로그 출력을 추가합니다.
forever start -ao log/out.log server.js
그런 다음 서버에 util을 쓸 수 있습니다.js
server.js
var util = require('util');
util.log("something with timestamp");
out.log 파일의 출력은 다음과 같습니다.
로그아웃
15 Mar 15:09:28 - something with timestamp
비스와데프의 답변을 받아 문자열화된 JSON 객체를 만들었습니다.이렇게 하면 나중에 로그를 처리해야 하는 경우 잘 구성된 형식이 됩니다.
const winston = require('winston');
const { createLogger, format, transports } = require('winston');
const dotenv = require('dotenv');
dotenv.config();
var logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
format.printf((info) =>
JSON.stringify({
t: info.timestamp,
l: info.level,
m: info.message,
s: info.splat !== undefined ? `${info.splat}` : '',
}) + ','
)
),
});
if (process.env.NODE_ENV !== 'PRODUCTION') {
logger.add(new transports.Console({ format: winston.format.cli() }));
// Turn these on to create logs as if it were production
// logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
// logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
// logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
} else {
logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
}
module.exports = {
logger,
};
용도:
app.listen(port, () => logger.info(`app is running on port ${port}`));
출력:
info.log 파일:
{"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},
콘솔:
info: app is running on port 3001
윈스턴에 대해서는 모르지만, 이건 제안입니다.나는 log4js를 로그에 사용하고 내 로그는 기본적으로 다음과 같습니다.
[2012-04-23 16:36:02.965] [INFO] Development - Node Application is running on port 8090
[2012-04-23 16:36:02.966] [FATAL] Development - Connection Terminated to '127.0.0.1' '6379'
개발은 내 노드 프로세스의 환경이며 [INFO|FATAL]은 로그 수준입니다.
log4js에서는 로깅을 위해 서로 다른 프로필을 유지 관리할 수 있습니다.개발 및 생산 프로필을 가지고 있습니다.또한 롤링 파일 appender, 콘솔 appender 등의 로거 유형이 있습니다.로그 파일은 로그 수준 [추적, 정보, 디버그, 오류, 치명적]에 따라 색상이 달라집니다.
log4js가 console.log를 재정의합니다. 이제 0.5+에서 구성 가능한 매개 변수입니다.
을 사용하여 레벨을 할 수 .require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')
자세한 내용은 https://github.com/starak/node-console-stamp 를 참조하십시오.
경우에 따라 기본 타임스탬프 형식이 사용자에게 적합하지 않을 수 있습니다.구현을 통해 이를 재정의할 수 있습니다.
대신에
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({'timestamp':true})
]
});
당신은 쓸 수 있습니다.
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
'timestamp': function() {
return <write your custom formatted date here>;
}
})
]
});
자세한 내용은 https://github.com/winstonjs/winston#custom-log-format 를 참조하십시오.
또 다른 해결책은 로거를 logger.info syslogger.errors 등과 같은 일부 기능을 내보내는 파일로 래핑한 다음 모든 메시지 로그에 전송할 추가 키를 전달하는 것입니다.
loggerService.js
const logger = winston.createLogger({ ... })
function handleLog(message, level) {
const logData = {
timestamp: Date.now(),
message,
}
return logger[level](logData)
}
function info(message) {
handleLog(message, 'info')
}
function error(message) {
handleLog(message, 'error')
}
function warn(message) {
handleLog(message, 'warn')
}
module.exports = {
info,
error,
warn
}
임의 파일.js
const logger = require('./services/loggerService')
logger.info('Hello World!')
your-log.log
{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}
언급URL : https://stackoverflow.com/questions/10271373/node-js-how-to-add-timestamp-to-logs-using-winston-library
'programing' 카테고리의 다른 글
sql에서 보기와 표의 차이 (0) | 2023.07.27 |
---|---|
MySQL에서 병합 사용 방법 (0) | 2023.07.27 |
UIImageView의 터치 이벤트를 감지하려면 어떻게 해야 합니까? (0) | 2023.07.27 |
'0+ptr'(0 + 포인터)은 무엇을 의미합니까? (0) | 2023.07.27 |
스프링 데이터 받침대 및 Cors (0) | 2023.07.27 |