3.0.0-rc1μ μ¬μ©νκ³ μμΌλ©° λ¬Έμμμ νμμ€ν¬ν νμμ μ¬μ©μ μ§μ νλ λ°©λ²μ λν΄ λͺ ννμ§ μμ΅λλ€. λμμ£ΌμΈμ.
κ°μ¬ ν΄μ,
μλ°λ‘
μμ€ μ½λλ₯Ό μ½κ³ νμμ μ¬μ©μ μ μνλ λ° λμμ΄ λ μ μμ΅λλ€. λλ λΉμ μκ² λμ μλ₯Ό μ€ μ μμ΅λλ€.
const winston = require('winston');
const moment = require('moment');
const util = require('util');
const MESSAGE = Symbol.for('message');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format(function(info, opts) {
prefix = util.format('[%s] [%s]', moment().format('YYYY-MM-DD hh:mm:ss').trim(), info.level.toUpperCase());
if (info.splat) {
info.message = util.format('%s %s', prefix, util.format(info.message, ...info.splat));
} else {
info.message = util.format('%s %s', prefix, info.message);
}
return info;
})(),
winston.format(function(info) {
info[MESSAGE] = info.message + ' ' + JSON.stringify(
Object.assign({}, info, {
level: undefined,
message: undefined,
splat: undefined
})
);
return info;
})()
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: './logs/bitcoin.log' })
]
});
μ΄κ²μ νμμ€ν¬ν(μ΄μ¨λ κΈ°λ³Έκ°μ΄μ΄μΌ ν¨)λ₯Ό μΈμνλ κ°μ₯ κ°λ¨ν μꡬ μ¬νμ λν΄ λ§€μ° λ³΅μ‘ν©λλ€.
μ¬κΈ° λ΄κ° νλ μΌμ΄...
//λ‘κ±°.js
const winston = require('winston');
const moment = require('moment');
// create formatter for dates used as timestamps
//const tsFormat = () => (new Date()).toLocaleTimeString();
const tsFormat = () => moment().format('YYYY-MM-DD hh:mm:ss').trim();
// define a logger with 2 transports - console and a file
const logger = new (winston.Logger)({
transports: [
// colorize the output to the console
new (winston.transports.Console)({
timestamp: tsFormat,
colorize: true
}),
new winston.transports.File({
filename: './logs/ttracker.log',
timestamp: tsFormat, // makes timestamp 'pretty'
json: false // makes log format just like console output
})
]
});
// set logging level one of { error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5 }
logger.level = 'debug';
module.exports = logger;
μΆμ : λλ timestamp: true, μ¦ 2017-12-05T08:22:09.179Zλ₯Ό μ€μ νμ¬ μ»λ κΈ°λ³Έ νμμ΄ λ§μμ λ€μ§ μκΈ° λλ¬Έμ timestamp: λ§ ν¨μλ‘ μ€μ νμ΅λλ€.
@jimwhurr - λλ₯Ό μν΄ μ½λ(λ Έλ v6.11.0)λ λ€μμ μμ±ν©λλ€.
Error: winston.Logger was moved in [email protected].
Use a winston.createLogger instead.
at new <anonymous> (/Users/adrian/Documents/winston_test/node_modules/winston/lib/winston/common.js:162:15)
at Object.<anonymous> (/Users/adrian/Documents/winston_test/index.js:7:16)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:389:7)
at startup (bootstrap_node.js:149:9)
μ¬κΈ°μ μμ λ₯Ό μ¬μ©νμ¬ λ κ°λ¨ν λ 립 μ€νν μμ λ₯Ό λ§λ€μμ΅λλ€.
https://gist.github.com/ah/d02bd4ff238e5923fcf5369233e51401
const winston = require('winston');
const MESSAGE = Symbol.for('message');
const jsonFormatter = (logEntry) => {
const base = { timestamp: new Date() };
const json = Object.assign(base, logEntry)
logEntry[MESSAGE] = JSON.stringify(json);
return logEntry;
}
const logger = winston.createLogger({
level: 'info',
format: winston.format(jsonFormatter)(),
transports: new winston.transports.Console(),
});
logger.info('message content', { "context": "index.js", "metric": 1 })
logger.info('message content 2')
μ°μΆ:
{"timestamp":"2017-12-07T16:07:10.518Z","context":"index.js","metric":1,"level":"info","message":"message content"}
{"timestamp":"2017-12-07T16:07:10.520Z","message":"message content 2","level":"info"}
μλ νμΈμ, νμμ€ν¬νλ‘ λ‘κΉ νλ λ λ€λ₯Έ μ΅μ μ΄ μμ΅λλ€(3.0.0-rc0μμ ν μ€νΈ):
const μμ€ν΄ = μꡬ('μμ€ν΄');
var μ¬μ©μ μ μ νμ = winston.format.combine(
winston.format(
κΈ°λ₯ dynamicContent(μ 보, μ΅μ ) {
info.level = 'μ 보';
if(info.time) {
var dt = μλ‘μ΄ λ μ§(),
date_now = dt.getDate() < 10 ? '0'+ dt.getDate() : dt.getDate(),
month_now = (dt.getMonth() + 1) < 10 ? '0'+ (dt.getMonth() + 1) : (dt.getMonth() + 1),
year_now = dt.getFullYear(),
hrs_now = dt.getHours(),
mins_now = dt.getMinutes(),
secs_now = dt.getSeconds(),
millisec_now = dt.getMilliseconds();
info.time = ' '+date_now+'-'+month_now+'-'+year_now+' '+hrs_now+':'+mins_now+':'+secs_now+':'+millisec_now+' ';
}
μ 보 λ°ν;
}
)(),
winston.format.simple() //μΆλ ₯ νμ, μ¬μ© κ°λ₯: .json()(.simple λμ )
);
const λ‘κ±° = winston.createLogger({
λ 벨: 'μ 보',
νμ: μ¬μ©μ μ§μ νμ,
μμ‘: [
μλ‘μ΄ winston.transports.File({ νμΌ μ΄λ¦: 'logs.log' })
]
});
module.exports = λ‘κ±°;`
κ·Έλ¦¬κ³ λ‘κ·Έμ κ²½μ°:
logger.log({
time: true,
level: 'info',
message: 'message for logging'
});
λμμ΄ λ μλ μμ΅λλ€.
νμ λ¬Έμμ΄λ‘ νμμ€ν¬νλ₯Ό μ¬μ©μ μ§μ ν μ μμ΅λλ€.
winston.createLogger({
level: ...
format: winston.format.combine(
winston.format.label({ label: '[my-label]' }),
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.simple()
),
transports: ...
});
winston.createLogger({
level: ...
format: winston.format.combine(
winston.format.label({ label: '[my-label]' }),
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.simple()
),
transports: ...
});
μ΄κ²μ λ¬Έμμ μμ΄μΌ ν©λλ€. @felipemullen κ°μ¬ν©λλ€!
@felipemullen μνμ μ κ³΅ν΄ μ£Όμ μ κ°μ¬ν©λλ€. @ricardoaat μ λμν©λλ€. μ΄κ²μ λ¬Έμμ μμ΄μΌ νλ―λ‘ ... μ΄μ examples/custom-timestamp.js μ λλ€.
@youngkylejan oh oh..... λμμ΄ λλ€...
νμ§λ§ λ¬Έμ κ° μμ΅λλ€...λ‘κ·Έ λμ μλ {} λ 무μμΈκ°μ?
[2018-05-14 04:39:52] [μ 보] localhost:3000 {}μμ μ€νλλ API
μ λ Winstonμ΄ μ²μμ΄κ³ λ¬Έμλ₯Ό λ°λΌνκΈ°κ° λλΌμΈ μ λλ‘ μ΄λ ΅μ΅λλ€.
μ΄λ»κ² λ λ€μκ³Ό κ°μ΄ λ κ°λ¨ν μ루μ μΌλ‘ λλ¬μ΅λλ€.
winston.createLogger({
level: ...
format: winston.format.printf(info => `${new Date().toISOString()} ${info.message}`),
transports: ...
});
@hosseinGanjyar
λ³ν
info[MESSAGE] = info.message + ' ' + JSON.stringify(...);
κ·Έλ₯
info[MESSAGE] = info.message;
μ΄κ²μ λλ₯Ό μν΄ μΌνμ΅λλ€.
μ€μ :
import winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import fs from 'fs';
import path from 'path';
const LOG_DIR = path.normalize(`${process.cwd()}/logs`);
if (!fs.existsSync(LOG_DIR)) {
fs.mkdirSync(LOG_DIR);
}
const logger = winston.createLogger({
exitOnError: false,
silent: process.env.SUPPRESS_LOGS,
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
winston.format.json(),
),
transports: [
new winston.transports.Console(),
new DailyRotateFile({
dirname: LOG_DIR,
filename: '%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: false,
maxSize: '1m',
maxFiles: '14d',
}),
],
});
export default logger;
μ΄κ²μ λͺ¨λ winston 3.0.0 λ° @types/winston 2.3.9μ©μ λλ€.
const consoleFormat = winston.format.printf(info => {
const d = new Date();
const timestamp = d.toLocaleTimeString();
return `${timestamp} ${info.level}: ${info.message}`;
μ΄κ²μ νμ¬ μκ°λμ μκ°μΈ νμμ€ν¬νλ₯Ό λ°νν©λλ€.
λ΄κ° μ¬μ©νλ fileFormatμ κ²½μ°
const timestamp = `${d.toISOString()} (${d.toLocalTimeString()})`;
κ·Έ λ€μμ
const logger = winston.createLogger({
level: "debug",
format: fileFormat,
transports: [ new winston.transports.File({ filename: "yourname.log", level: "debug"}) ]
});
μλ§ λ λ²¨μ΄ λ λ² νμνμ§ μμ κ²μ λλ€. κ·Έλ¬λ κ·Έκ²μ΄ λ΄κ° νμ¬ μ¬μ©νκ³ μλ κ²μ λλ€.
νμ λ¬Έμμ΄λ‘ νμμ€ν¬νλ₯Ό μ¬μ©μ μ§μ ν μ μμ΅λλ€.
winston.createLogger({ level: ... format: winston.format.combine( winston.format.label({ label: '[my-label]' }), winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.simple() ), transports: ... });
μλͺ μ μμΈ. λ§μ κ°μ¬ν©λλ€!!!
YYYY-MM-DD HH:mm:ss
μ΄μΈμ νμ λ¬Έμμ΄μ μ¬μ©μ μ μνλ λ°©λ²μ μ°ΎκΈ° μν΄ μ¬κΈ°μ μλ μ¬λλ€μ μν΄: winston μ νλ μλμμ fechaλ₯Ό μ¬μ©νλ―λ‘ fecha λ¬Έμ λ₯Ό μ°Έμ‘°ν μ μμ΅λλ€.
μ΄λ¬ν λͺ¨λ μλ λ‘κ·Έμμ λλ¨Έμ§ λ§€κ°λ³μλ₯Ό μ κ±°ν©λλ€. format.simple()μ μ¬μ©νκ³ μμ λΆλΆμλ§ νμμ€ν¬νλ₯Ό μΆκ°νκ³ λλ¨Έμ§μμ μ κ±°νλ €λ κ²½μ° λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
const simpleFormat = format.simple()
const MESSAGE = Symbol.for('message')
const simpleTimestamp = format(info => {
const { timestamp, ...rest } = info
const simpled = simpleFormat.transform(rest)
if (typeof simpled !== 'boolean') {
// @ts-ignore
simpled[MESSAGE] = `${timestamp} ${simpled[MESSAGE]}`
}
return simpled
})
logger.add(new transports.Console({
format: format.combine(
format.timestamp(),
format.colorize(),
simpleTimestamp(),
),
}))
κ°μ₯ μ μ©ν λκΈ
μ΄κ²μ νμμ€ν¬ν(μ΄μ¨λ κΈ°λ³Έκ°μ΄μ΄μΌ ν¨)λ₯Ό μΈμνλ κ°μ₯ κ°λ¨ν μꡬ μ¬νμ λν΄ λ§€μ° λ³΅μ‘ν©λλ€.