λ‘κΉ μ μν΄ νλ‘ νΈμλμμ winstonμ μ¬μ©ν μ μμ΅λκΉ? λ λμ νλ°νΈ μλ λ‘κΉ κΈ°λ₯μ μν΄ Winstonμ μ¬μ©νκ³ μΆμ΅λλ€. μ΄κ²μ΄ κ°λ₯ν©λκΉ?
λλ κ·Έκ²μ μλνμ§ μμμ§λ§ μ΄κ²μ΄ λμμ΄ λ μ μμ΅λλ€ https://github.com/farpoint/meteor-winston-client
μ΄κ²μ λ€μκ³Ό κ΄λ ¨μ΄ μμ΅λλ€: https://github.com/flatiron/winston/issues/180
@joshacheson λ§ν¬μ 404κ° μμ΅λλ€!!
μ΄ λ¬Έμ μ μ§μ μ΄ μμ΅λκΉ?
#582μ νΌλλ°±μ λ°λ₯΄λ©΄ ν₯ν PRμ brfs
μ κ°μ shimμ μ¬μ©νλ κ²λ³΄λ€ ν΅μ¬ λ‘μ§κ³Ό μ μ‘μ λΆλ¦¬νλ λ° μ§μ€ν΄μΌ ν κ² κ°μ΅λλ€. μ΄κ²μ ν° κ΅¬μ‘°μ λ³νκ° λ κ²μ΄λ©° μ€νμΌκ³Ό μ κ·Ό λ°©μμ λν ν΅μ¬ κ°λ°μμ μ§μΉ¨μ΄ κ±°μ νμ€νκ² νμν κ²μ
λλ€. κΆκ·Ήμ μΌλ‘ μ΄λ₯Ό μ μ§ κ΄λ¦¬νκ² λ κ²μ΄κΈ° λλ¬Έμ
λλ€.
μ’μ μμμ μ½λκ° λλΆλΆ κΉ¨λνκ³ μ ꡬμ±λμ΄ μμ§λ§ μ€νμΌκ³Ό μ κ·Ό λ°©μμ λν ν΅μ¬ κ°λ°μμ μ§μΉ¨μ΄ νμνλ€λ κ²μ λλ€. @indexzero / @pose κ° λΉμ μ μκ°μ 곡μ ν μ μμ΅λκΉ?
μ΄ λ¬Έμ μ μ§μ μ΄ μμ΅λκΉ?
μ΄λ΄, λ΄κ° ν¨ν€μ§λ₯Όλ³΄κ³ λΈλΌμ°μ μ§μμ΄ μλ€λ κ²μ μμμ λ λ΄ ν¬λ§μ μ λ§ λμμ΅λλ€.
μ΄κ²μ λΈλΌμ°μ μμ μ§μμ μ¬λ°°ν κ²λ€μ λ체νκΈ° μν΄ μ λ§ κ΅μ₯ν κ²μ
λλ€.
+1
κ°κ±°λ λ. μλ©΄κ³Ό λ·λ©΄μ λν΄ λμΌν λ‘κΉ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²λ λμμ΄ λ©λλ€.
λλ μ΄κ²μ λΈλΌμ°μ§νκ³ μμκ³ http μ μ‘μ΄ μμμλ λΆκ΅¬νκ³ λΈλΌμ°μ /κΈ°νμ λν νμ€ ν΄λΌμ΄μΈνΈλ‘ 보μ΄μ§ μλ κ²μ΄ λΆλλ¬μ΄ κ² κ°μ΅λλ€.
bunyanμ μ¬μ©ν΄μΌνλ€λ κ²μ΄ μ¬νλ€.
μ΄κ²μ λν μμμ΄ μμ΅λκΉ?
μ λ§λ‘ μ¬μ©νκ³ μΆλ€λ©΄ λ€μκ³Ό κ°μ΄ μ¬μ©μ μ§μ μ μ‘μ μμ±ν μ μμ΅λλ€.
const Transport = require('winston-transport');
export default class BrowserConsole extends Transport {
constructor(opts) {
super(opts);
this.name = 'BrowserConsole';
this.levels = {
error: 0,
warn: 1,
info: 2,
debug: 4,
};
this.methods = {
error: 'error',
warn: 'warn',
info: 'info',
debug: 'log',
};
this.level = opts.level && this.levels.hasOwnProperty(opts.level)
? opts.level : 'info';
}
log(method, message) {
setImmediate(() => {
this.emit('logged', method);
});
const val = this.levels[method];
const mappedMethod = this.methods[method];
if (val <= this.levels[this.level]) {
// eslint-disable-next-line
console[mappedMethod](message);
}
}
}
κ·Έλ° λ€μ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
import BrowserConsole from './BrowserConsole';
const { createLogger, transports } = require('winston');
const log = createLogger({
level: 'info',
});
if (process.env.NODE_ENV !== 'production') {
log.add(new BrowserConsole({
level: 'info',
}));
}
μ΄ μ μ‘μ μ¬μ©νλ©΄ λ κ±°μ μ½λλ‘ κ°μ£ΌλκΈ° λλ¬Έμ μΈλͺ¨μλ κ²½κ³ κ° νμλ©λλ€. λ€λ₯Έ μ½μ λ°©λ²( table
, dir
, trace
, ...)μ μ¬μ©ν μ μλ κ°λ₯μ±μ μΆκ°νλ κ²λ μλ¦λ΅μ§λ§ κ°λ¨νκ² νκΈ° μν΄ κ·Έλλ‘μ
λλ€.
@chrisvoo κ°μ¬ν©λλ€. μ΄ μ루μ μ μλνμ§λ§ μ€λ₯κ° λ°μνμ΅λλ€.
ReferenceError: Buffer is not defined
replacer
json.js/module.exports<
_transform
_stream_transform.js/Transform.prototype._read
_stream_transform.js/Transform.prototype._write
doWrite
writeOrBuffer
_stream_writable.js/Writable.prototype.write
log
@dmitry-salnikov μ λͺ¨λ₯΄κ² μ΅λλ€. μ΄ μ½λκ° μ€νΈλ¦Όμ μ¬μ©νλ μ΄μ λ₯Ό μ΄ν΄ν μ μμ΅λλ€. λ΄ μ¬μ© μ¬λ‘κ° λ무 λ¨μνμ μλ μμ΅λλ€. μ΄λ»κ² μ¬μ©νκ³ μλμ§ κ³΅μ ν΄ λ³΄μΈμ.
@chrisvoo BrowserConsole
ꡬνμ λ³λμ νμΌμ 볡μ¬νμ¬ λΆμ¬λ£μ λ€μ λ€λ₯Έ νμΌμ μ½λμ λ λ²μ§Έ λΆλΆμ λΆμ¬λ£κ³ BrowserConsole
μ μ‘ μ½λ(μ€λν«μ λ§μ§λ§ μ€)λ₯Ό μΆκ°ν ν λ¨μν μλνμ΅λλ€:
log.info('hello world');
κ·Έλ° λ€μ μ€λ₯κ° λ°μνμ¬ λ€μμ μλνμ΅λλ€.
log.log('info, 'hello world');
λ νΈμΆ λͺ¨λ λμΌν μ€λ₯λ₯Ό λ°νν©λλ€.
λΈλΌμ°μ μμ Nodeλ₯Ό μ¬μ©ν μ μλ νκ²½μ Meteor.js v1.6(Node 8.8.1)μ λλ€. λν μ½λ μ€λν«μ ν μ€λ μμ νμ§ μμμ΅λλ€.
BTW: μΌλ§ μ μ winstonμ μ¬μ©νκΈ° μμνκΈ° λλ¬Έμ μλͺ»λ μΌμ νκ³ μμ μ μμ΅λλ€.
@dmitry-salnikov μ΄λ€ μ’ λ₯μ μ€λ₯κ° λ°μν©λκΉ? "μ 보λ κΈ°λ₯μ΄ μλλλ€"μ κ°μ΄? μ΄λ€ μ΄μ μμμΈμ§ μμ μ΄ μ’μ§ μμ΅λλ€.
@chrisvoo λ΄μ£ΌμΈμ:
BrowserConsole.js
μ λ΄μ©(νμΌ νΈλ¦¬μμ λ³Ό μ μμ)μ μ€λν«μμμ λμΌν©λλ€.
κ·Έλ¦¬κ³ λλ λΉμ μ μ견μ λμν©λλ€. κ°μ Έμ€κΈ°μ λ¬Έμ κ° μλ κ² κ°μ§λ§ μ΄μ λ₯Ό μ μ μμ΅λλ€.
λΉμ μ μμ€ν΄ λ²μ μ 무μμ λκΉ? λ΄ κ²μ:
"winston": "^3.0.0-rc1",
"winston-transport": "^3.0.1"
μ¬μ€ κ°μ
$ npm ls | grep winston
βββ¬ [email protected]
β βββ [email protected]
βββ [email protected]
$ cat package.json | grep winston
"winston": "^3.0.0-rc1",
"winston-transport": "^3.0.1"
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ€λ₯Έ ν μ€νΈλ₯Ό νμ΅λλ€.
import winston from 'winston';
import BrowserConsole from '/imports/BrowserConsole.js';
const format = winston.format;
// next line throws exception, see below
const { combine, timestamp, label, printf, colorize, prettyPrint } = format;
const logger = winston.createLogger({
...
λ€μ μ€λ₯κ° λ°μνμ΅λλ€: Cannot find module './combine'
λ€μμ μ€ν μΆμ λ° κ΄λ ¨ μ½λ(λΈλΌμ°μ μ€ν¬λ¦°μ·)μ
λλ€.
λκ° μμ μ΄ μ μ’μ κ² κ°μ΅λλ€. @chrisvoo μ’ λ΄μ£Όμκ² μ΄μ ?
Winston 3.0.0μμ μ μ‘μ μ€νΈλ¦Όμ
λλ€. κ·Έλ¬λ browserify-streamμμ readableStream instanceof Stream
λ μ¬μ€μ΄ μλλλ€. μ΄λ‘ μΈν΄ Winstonμ μ μ‘μ λ κ±°μ λνΌλ‘ λννκ³ κ²½κ³ λ₯Ό λ΄λ³΄λ
λλ€. μ€νΈλ¦¬λ° κ°μ§μ λ€λ₯Έ λ°©λ²μ μ¬μ©νκΈ° μν΄ PRμ λ§λ€μμ΅λλ€. #1145
@Jasu μ¬μ€ λλ μ΄κ²μ μμμ°¨λ Έκ³ , μ΄μ κ΄ν΄ μ΄μ μ winston-transport μ λ¬Έμ λ₯Ό μ μΆνμ΅λλ€. λν μ½μ μ μ‘μ΄ λνμ΄ λλλ‘ κ³§ pull μμ²μ μ μΆν κ²μ λλ€.
무μ: [νΌμ ꡬλ νλ©΄ ν μ μκΈ° λλ¬Έμ](https://github.com/isaacs/github/issues/283) λμ€μ μ΄ λ¬Έμ λ₯Ό μ½κ² μ°Ύμ μ μλλ‘ μ¬κΈ°μ λκΈμ λ¨κΉλλ€.
Error: Cannot find module './combine'
κ°μ λ¬Έμ λ₯Ό λ§λ¬μ΅λλ€.
+1
@chrisvoo : μλλ κ·νμ μ€λν«μ μ€ννλ €κ³ ν λ λ°μνλ μ€λ₯μ
λλ€(winston λ° winston-transportλ 3+ λ²μ μ μμ).
winston-transport/index.jsμ μ€λ₯
λͺ¨λμ μ°Ύμ μ μμ: μ€λ₯: node_modules/winston-transportμ 'μ€νΈλ¦Ό'μ νμΈν μ μμ΅λλ€.
PR #1145(2017λ 11μ μ€ν)κ° μ¬ν΄ ν©λ³λ κ°λ₯μ±μ΄ μμ΅λκΉ? :λμ§:
@dmitry-salnikov #1145κ° λ§μ€ν°μ λ³ν©λμμ΅λλ€. μμ§ λ¦΄λ¦¬μ€μλ μμ΅λλ€.
λ«κΈ° λ«κΈ° λ«κΈ° λ«κΈ°
μ§μ μ£Όμ μ κ°μ¬ν©λλ€ λμ€μ κ°μ
μ μ΄λ 5λ μ κ²°μ€μ λ§Ίλλ€. Winstonμ μ¬μ ν ββJavaScript IMOλ₯Ό μν μ΅κ³ μ λ‘κΉ μμ€ν μ λλ€.
κ°μ¬ ν΄μ!
μ΄κ²μ λΈλΌμ°μ μ§μμ νμΈνλ ν μ€νΈκ° ν μ€νΈ μ€μνΈμ μμ λκΉμ§ μ΄λ € μμ΅λλ€. κ·Έλ¬λ babel λ° webpack μ£Όλ³μ λλΆλΆμ λͺ¨μ리 λ° λͺ¨μ리 μΌμ΄μ€κ° ν΄κ²°λ κ² κ°μ΅λλ€.
μ¬κΈ°μμ μ°λ¦¬λ winstonμ μ¬λ νκ³ ν΄λΌμ΄μΈνΈ μΈ‘ λ‘κΉ λ―Έλ€μ¨μ΄κ° νμν©λλ€.
λΈλΌμ°μ κ° κ΅¬νλ μ§ μκ°μ΄ μ‘°κΈ μ§λ¬λλ° μ§κΈλΆν° μ¬μ©νκ³ μΆμ΅λλ€.
λ¨μ ν μ€νΈ λ° μ 체 λΈλΌμ°μ μ μ© λ²μλ₯Ό κΈ°λ€λ¦¬κΈ° μ μ λΈλΌμ°μ μ§μμ λν λλ΅μ μΈ μμ΄λμ΄κ° μμ΅λκΉ?
λ΄ νλ‘μ νΈμ winstonμ κ°μ Έμ€λ €κ³ μλνμ§λ§ λ€μ λ©μμ§μ ν¨κ» μ€ν¨νμ΅λλ€.
./\~/winston/lib/winston/tail-file.jsμ μ€λ₯
λͺ¨λμ μ°Ύμ μ μμ: μ€λ₯: '/Users/me/workspaces/app/node_modules/winston/lib/winston'μμ 'fs'λ₯Ό νμΈν μ μμ΅λλ€.
@ ./\~/winston/lib/winston/tail-file.js 10:11-24
@ ./\~/winston/lib/winston/transports/file.js
@ ./\~/winston/lib/winston/transports/index.js
@ ./\~/winston/lib/winston.js
@ ./src/app/app.module.ts
@ ./src/main.ts
winstonμ index.js import 'fs'κ° νμν '.file'μ κ°μ Έμ€λ Transports.
μ΄ μ μ ν μ§μ₯μμ μ΄λ»κ² ꡬλ μ μ·¨μν©λκΉ
2018λ 8μ 7μΌ νμμΌ μ€ν 2μ 19λΆμ Kfir Erez [email protected] μμ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
λ΄ νλ‘μ νΈμ winstonμ κ°μ Έμ€λ €κ³ μλνμ§λ§ λ€μμΌλ‘ μ€ν¨νμ΅λλ€.
λ©μΈμ§:
.//winston/lib/winston/tail-file.jsμ μ€λ₯
λͺ¨λμ μ°Ύμ μ μμ: μ€λ₯: 'fs'λ₯Ό νμΈν μ μμ΅λλ€.
'/Users/me/workspaces/app/node_modules/winston/lib/winston'
@ .//winston/lib/winston/tail-file.js 10:11-24
@ .//winston/lib/winston/transports/file.js
@ .//winston/lib/winston/transports/index.js
@ ./~/winston/lib/winston.js
@ ./src/app/app.module.ts
@ ./src/main.tswinstonμ index.js import '.file'μ κ°μ Έμ€λ Transportsλ λ€μμ΄ νμν©λλ€.
'FS'.β
λΉμ μ΄ λκΈμ λ¬μκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/winstonjs/winston/issues/287#issuecomment-410946148 ,
λλ μ€λ λ μμκ±°
https://github.com/notifications/unsubscribe-auth/AE3lcdZ3aQKEVYvYB2TXjh0dnQ1FaBS2ks5uOTFhgaJpZM4A2vjK
.
@mjcd λΉμ μ μ¬κΈ°μ μμν κ°ν μμ΅λλ€ π (j/k, μ΄λ©μΌμ λ§ν¬λ₯Ό μ¬μ©νκ±°λ ghλ₯Ό ν΅ν΄ ꡬλ μ μ·¨μν μ μμ΅λλ€)
@KErezκ° webpack μ μ¬μ©νλ κ²κ³Ό λμΌν μ€λ₯κ° λ°μνμ΅λλ€.
μ΄λ₯Ό ν΄κ²°νλ μΌλ°μ μΈ λ°©λ²μ μΉν© ꡬμ±μ node: { fs: 'empty' }
λ₯Ό λ£λ κ²μ
λλ€. κ·Έλ¦¬κ³ λΆλͺ
ν λΈλΌμ°μ μμ File
μ μ‘μ μ¬μ©νλ €κ³ νλ©΄ μλνμ§ μμ΅λλ€. μΆκ° κ΅¬μ± μ€μ μμ΄ webpackμμ winston λ²λ€μ λ§λ€ μ μλ€λ©΄ μ’κ² μ§λ§ κ°λ₯νλ€λ©΄ idkμ
λλ€. λ€λ₯Έ μΈκΈ° μλ ν¨ν€μ§λ κ°μ κ²μ κΆμ₯νμ§λ§ https://github.com/pugjs/pug-loader/issues/8#issuecomment -328331541μμλ winstonμ package.jsonμμ μ΄ λ¬Έμ λ₯Ό μμ ν μ μλ€κ³ μ μν©λλ€. λκ΅°κ° κ·Έκ²μ μλνκ³ ν΄λΉ μ€λ₯κ° ν΄κ²°λλ©΄ PRμ μ΄κ³ μΆμ΅λκΉ(μ: μ±μ webpack ꡬμ±μ λ³κ²½νμ§ μκ³ winstonμ package.jsonλ§ λ³κ²½)?
λ setImmediateλ‘ μΈν΄ μ€λ₯κ° λ°μνμ΅λλ€... @chrisvoo κ° μ±κ³΅νλ κ²μ²λΌ 보μ΄λ μ΄μ λ₯Ό μ΄ν΄ν μ μμ΅λλ€. μλ§λ κ·Έκ° ν΄λ¦¬νμ μ¬μ©νκΈ° λλ¬ΈμΌκΉμ?
λ΄ κ΄λ ¨ λ¬Έμ : https://github.com/winstonjs/winston/issues/1489
@chrisvoo μ½λ(thx so much)λ₯Ό κΈ°λ°μΌλ‘ ν¨ν€μ§λ₯Ό λ§λ€μμ΅λλ€.
https://www.npmjs.com/package/winston-transport-browserconsole.
λν κΈ°λ³Έ winston μ½μ μΆλ ₯κ³Ό λΉκ΅ν μ μλλ‘ μ½κ°μ μνμ΄ μμ΅λλ€.
μ΄λ₯Ό ν΄κ²°νλ μΌλ°μ μΈ λ°©λ²μ webpack ꡬμ±μ node: { fs: 'empty' }λ₯Ό λ£λ κ²μ λλ€.
μΉν© ꡬμ±μ λ³κ²½ν νμ μμ΄ μΉν© λΈλΌμ°μ λ²λ€μ μ§μν κ³νμ΄ μμ΅λκΉ?
μΆκ° κ΅¬μ± μ€μ μμ΄ webpackμμ winston λ²λ€μ λ§λ€ μ μλ€λ©΄ μ’κ² μ§λ§ κ°λ₯νλ€λ©΄ idkμ λλ€. λ€λ₯Έ μΈκΈ° μλ ν¨ν€μ§λ κ°μ κ²μ κΆμ₯νμ§λ§ pugjs/pug-loader#8(μ£Όμ) μ winstonμ package.jsonμμ μ΄ λ¬Έμ λ₯Ό μμ ν μ μλ€κ³ μ μν©λλ€. λκ΅°κ° κ·Έκ²μ μλνκ³ ν΄λΉ μ€λ₯κ° ν΄κ²°λλ©΄ PRμ μ΄κ³ μΆμ΅λκΉ(μ: μ±μ webpack ꡬμ±μ λ³κ²½νμ§ μκ³ winstonμ package.jsonλ§ λ³κ²½)?
@DABH λΆννλ, λλ κ·Έκ²μ΄ κ·Έλ κ² κ°λ¨νλ€κ³ μκ°νμ§ μμ΅λλ€. λΈλΌμ°μ νλλ₯Ό μ¬μ©νμ¬ λ€λ₯Έ μ§μ μ μ μ μν©λλ€. λ€λ₯Έ μ§μ μ μ μ μνκ±°λ ν΄λΉ ν°μΌμ μ€λͺ λ λλ‘ νΉμ λͺ¨λμ κ΅μ²΄νλ λ° μ¬μ©ν μ μλ€κ³ μκ°ν©λλ€. λ λ€ μλλλ€. κ·Έλ¬λ μ΄λ―Έ μμ μ λΈλΌμ°μ λ²μ μ ꡬμΆνκ³ μκΈ° λλ¬Έμ ν΄λΉ λ²μ μμ μ κ±°ν μ μμ΅λλ€. μ΄λ² μ£Όλ§μ κΈ°νκ° λλ€λ©΄ κΌ κ°λ΄μΌκ² μ΅λλ€.
μ΄μ λν μ§μ μ΄ μμ΅λκΉ? 6λ μ΄ μ§λ¬κ³ λ΄μΌμ΄λ©΄ 2020λ μ΄ λ©λλ€ :-)
μλ§λ ν΄κ²°μ± μ winstonμ λ€μ ν¨ν€μ§νμ¬ μ΄μ‘μ μκ° μμ μ λͺ¨λμ΄ λλλ‘ νλ κ²μ λλ€. λ λμ μ루μ μ²λΌ λ€λ¦½λλ€.
κ°λμμ Winstonμ μ¬μ©ν μ μμ΅λκΉ? μ΄λ»κ² ?
@ArpithaGMGowda λ νμ€ κ°λ CLIκ° μλλλ€.
κ·Έλ λ€λ©΄ μ°λ¦¬λ Angular 7μ 무μμ μ¬μ©ν μ μμ΅λκΉ ??
μ΄λ€ μμ΄λμ΄λΌλ
μ§λ νλ‘μ νΈμμ js-loggerλ₯Ό μ¬μ©νλλ° λ§€μ° μ μλνμΌλ©° μλ
μ νλμ΄ λ§μ§ μμ κ²μ²λΌ 보μ΄μ§λ§ μν¬μκ² λ‘κ·Έλ₯Ό λ³΄λΌ μ μμ΅λλ€. https://github.com/jonnyreeves/js-logger
track.jsμ κ°μ΄ λΉμ μ μν΄ μλν μλ μλ μ’μ λ‘κΉ
μλΉμ€κ° μμ΅λλ€.
μ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ Έλμ λν μ’ μμ±μ μ κ±°νλ μ κ΅¬μ‘°λ‘ λ€μ μμ±νκ³ μμ΅λλ€. λ€μμ£Όμ λλ΄μΌμ§
μ½λ κΈ°λ° Winstonμ λ¬Έμ λ ν΅μ¬ κΈ°λ₯μ μμμν€μ§ μκ³ νλνν΄μΌ ν©λλ€.
μ μ‘ κ³μΈ΅μ μ체 νμ λͺ°λλ‘ λΆν ν΄μΌ νλ©°, κ·Έ λκ°λ‘ νμμ μνμ§ μλ λ³κ²½ μ¬νμ΄ λ°μν κ²μ λλ€. νμ΄ μλ‘μ΄ μνκ³λ₯Ό κΈ°κΊΌμ΄ μ±ννμ§ μλ ν. μ리 μ€μΈ PRμ΄ μΉμΈλ μ§ νμ μ΄ μμ§ μμ΅λλ€.
NGX-Logger " https://www.npmjs.com/package/ngx-logger "λ₯Ό μ¬μ©ν΄ λ³΄μ ¨μ΅λκΉ?
@ArpithaGMGowda λ΄ μκ°μ λλ λΉμ μ μΈνΈ νλ μμν¬μ λ¬Άλ μ½λ λ² μ΄μ€λ₯Ό μμ±νλ κ²μ μ’μνμ§ μμ΅λλ€. μ½λλ UIμμ μλΉμ€ νΈμΆκΉμ§ κ°λ₯ν ν λΆκ°μ§λ‘ μ μ΄μ΄μΌ ν©λλ€. λλ λν ν΅μΌλ λ©μ»€λμ¦μ μμ΄λμ΄λ₯Ό μ’μν©λλ€. λ°±μλλ₯Ό μν ν κ°μ§ λ°©λ²κ³Ό νλ‘ νΈμλλ₯Ό μν λ€λ₯Έ λ°©λ²μ΄ μλ μ΄μ
μ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ Έλμ λν μ’ μμ±μ μ κ±°νλ μ κ΅¬μ‘°λ‘ λ€μ μμ±νκ³ μμ΅λλ€. λ€μμ£Όμ λλ΄μΌμ§
@Jordan-Hall μ‘°λ§κ° rc λ₯Ό κ°κ² λ μ§ κΆκΈν©λλ€(κ°μ¬ν©λλ€).
winstonμ μ¬μ©νλ νλ‘μ νΈ/libλ₯Ό μ¬μ©ν λ μ€λ¨λμ§ μλλ‘ νμ¬ μΉν©μ μμ ν΄μΌ νλ κ²μ μ΄λ €μμ κ²ͺκ³ μμ΅λλ€.
@MarcoMedrano μ΄λ‘ μ μΌλ‘ μλ‘μ΄ λΌμ΄λΈλ¬λ¦¬κ° μμ±λλ κ·Όλ³Έμ μΈ λ³νμ λλ€.
@pose μ½μ΄ ν¨ν€μ§μμ μ μ‘ κ³μΈ΅μ λΆλ¦¬νλ κ²μ λν κ·νμ 견ν΄λ 무μμ λκΉ? λλ Winstonμ μ’μνμ§λ§ μνκ³λ λ³νκ° νμν©λλ€
μ΄ κΈμ μμ±νλ λ° μκ°μ΄ κ±Έλ Έμ§λ§ μ΄μ λν λ€μ ν©λ¦¬μ μΈ ν΄κ²°μ±
μ μκ°ν΄ λμ΅λλ€.
λ€μμ μ¬μ©νλ©΄ λΈλΌμ°μ μμ μ€λ₯, κ²½κ³ λ° μ 보 μμ€( μ¬μ©μ μ μ μ λμ¬ ν¬ν¨)μ μ¬μ©ν μ μμΌλ©° λ€μκ³Ό κ°μ΄ νμλ©λλ€.
μ΄κ²μ΄ μλνλ €λ©΄ winston
, logform
λ° winston-transport
λ₯Ό μ’
μμ±μΌλ‘ μ€μΉν΄μΌ ν©λλ€.
μ΄κ²μ ꡬννλ λ° νμν μ½λλ λ€μκ³Ό κ°μ΅λλ€.
μ΄κ²μ typescript λ‘ μμ±λμμΌλ©° μλ° μ€ν¬λ¦½νΈ μμ λ μλμ κ°μ΅λλ€.
import * as winston from 'winston';
import {TransformableInfo} from 'logform';
import TransportStream = require('winston-transport');
// enumeration to assign color values to
enum LevelColors {
INFO = 'darkturquoise',
WARN = 'khaki',
ERROR = 'tomato',
}
// type levels used for setting color and shutting typescript up
type Levels = 'INFO' | 'WARN' | 'ERROR';
const defaultColor = 'color: inherit';
//! Overriding winston console transporter
class Console extends TransportStream {
constructor(options = {}) {
super(options);
this.setMaxListeners(30);
}
log(info: TransformableInfo, next: () => void) {
// styles a console log statement accordingly to the log level
// log level colors are taken from levelcolors enum
console.log(
`%c[%c${info.level.toUpperCase()}%c]:`,
defaultColor,
`color: ${LevelColors[info.level.toUpperCase() as Levels]};`,
defaultColor,
// message will be included after stylings
// through this objects and arrays will be expandable
info.message
);
// must call the next function here
// or otherwise you'll only be able to send one message
next();
}
}
// creating silent loggers with according levels
// silent by default to be automatically deactivated
// in production mode
export const logger = winston.createLogger({
transports: [
new Console({
silent: true,
level: 'info',
}),
],
});
// don't log anything in production mode
// probably should go further and return non
// working logger function to reduce
// execution time and improve speed results
// on application
if (process.env.NODE_ENV !== 'production') {
logger.transports.forEach(transport => (transport.silent = false));
}
κ·Έλ¦¬κ³ μ¬κΈ°μ μλ° μ€ν¬λ¦½νΈ μμ κ° μμ΅λλ€
import * as winston from 'winston';
import {TransformableInfo} from 'logform';
import TransportStream = require('winston-transport');
// enumeration to assign color values to
const LevelColors = {
INFO: 'darkturquoise',
WARN: 'khaki',
ERROR: 'tomato',
}
const defaultColor = 'color: inherit';
//! Overriding winston console transporter
class Console extends TransportStream {
constructor(options = {}) {
super(options);
this.setMaxListeners(30);
}
log(info, next) {
// styles a console log statement accordingly to the log level
// log level colors are taken from levelcolors enum
console.log(
`%c[%c${info.level.toUpperCase()}%c]:`,
defaultColor,
`color: ${LevelColors[info.level.toUpperCase()]};`,
defaultColor,
// message will be included after stylings
// through this objects and arrays will be expandable
info.message
);
// must call the next function here
// or otherwise you'll only be able to send one message
next();
}
}
// creating silent loggers with according levels
// silent by default to be automatically deactivated
// in production mode
export const logger = winston.createLogger({
transports: [
new Console({
silent: true,
level: 'info',
}),
],
});
// don't log anything in production mode
// probably should go further and return non
// working logger function to reduce
// execution time and improve speed results
// on application
if (process.env.NODE_ENV !== 'production') {
logger.transports.forEach(transport => (transport.silent = false));
}
LevelColors μ΄κ±°νμμ μμμ λ³κ²½ν μ μμ΅λλ€. μμμ λ³κ²½νλ €λ©΄ 29νμ μ΄ν΄λ³΄μΈμ.
λλ²κ·Έ μμ€μ λν μ§μμ μΆκ°ν©λλ€. μ½μ μ΅μ
μμ level
λ₯Ό 'debug'
μ€μ ν©λλ€.
λν λͺ¨λ νμ€ winston μμ€μ λν μ§μμ μΆκ°ν μ μμ΅λλ€. μ¦, λΉμ, κ²½κ³ , μΉλͺ
ν, μ€λ₯, κ²½κ³ , μ 보 λ° λλ²κ·Έλ₯Ό μλ―Έν©λλ€. μ΄κ²λ€λ μ¬μ©νλ €λ©΄ μ΄ κ°μ²΄λ₯Ό createLogger 루νΈμ levels
ꡬμ±μ μΆκ°ν΄μΌ ν©λλ€.
{
emerg: 0,
alert: 1,
crit: 2,
error: 3,
warn: 4,
info: 5,
debug: 6,
}
κ·Έλ° λ€μ LevelColors μ΄κ±°νμ μμ κ°μ μΆκ°ν©λλ€.
μ΄ λ¬Έμ μ μνλ₯Ό λͺ ννκ² νμ νκΈ° μν΄ μ μ°κ³ μμ΅λλ€. λ΄ React μ±μμ Winstonμ μ¬μ©ν μ μμ΅λκΉ?
μ λ μ€μ λ‘ λΈλΌμ°μ μ½μμ λ‘κ·ΈμΈνλ λ° κ·Έλ€μ§ κ΄μ¬μ΄ μμ΅λλ€. κ·Έλ¦¬κ³ μμ§ν λ§ν΄μ λ΄μ₯ console
κ° κ°μ λͺ©μ μ μ 곡ν λ winston console transporter
λ₯Ό μ¬μ μνλ μμ μ μ΄ν΄νμ§ λͺ»ν©λλ€. ; λκ΅°κ°κ° μΉμ νκ² λλ₯Ό κΉ¨μ°μ³ μ€ μ μμ΅λλ€.
λ΄ μν©μ λ΄ React μ±μ΄ nginx / Let's Encrypt νλ‘μ λ€μ Docker 컨ν μ΄λμμ μ€νλλ―λ‘ JavaScript μ½μ μΆλ ₯μ μ‘μΈμ€ν μ μλ€λ κ²μ λλ€. λ°λΌμ λͺ¨λ λ‘κ·Έ μΆλ ₯μ syslog μλ²λ‘ μ λ¬νκ³ μΆμ΅λλ€.
λ°μ΄ν°λ² μ΄μ€, λ°±μλ λ° λ΄ νλ‘μ νΈκ° ꡬμ±λ λ€λ₯Έ 컨ν
μ΄λμ λ‘κ·Έ μΆλ ₯μ ν΅ν©νλ syslog-ng
Docker 컨ν
μ΄λλ₯Ό μ±κ³΅μ μΌλ‘ μ€μ νμ§λ§ sysloggingμ λν κ°λ¨νκ³ μ μμ μΈ μ κ·Ό λ°©μμ μ°Ύμ§ λͺ»νλ κ² κ°μ΅λλ€. React νλ‘ νΈμλμ μΆλ ₯.
λ΄κ° μ§μμ λ§λ λ©μ²ν μ루μ
μ ν΄νΉνκΈ° μ μ λμκ² λ λμ μ‘°μΈμ μ€ μ¬λμ΄ μμ΅λκΉ?
μμ μ½λλ₯Ό μ¬μ©νμ¬ console.log
λ₯Ό λ€νΈμν¬λ₯Ό ν΅ν΄ syslog μλ²λ‘ λ©μμ§λ₯Ό 보λ΄λ μΌλΆ μ½λλ‘ λ체νμκ² μ΅λκΉ?
@z00m1n μ£Όλ‘ μ¬μ© μ¬λ‘μ λ°λΌ λ€λ¦ λλ€. λΈλΌμ°μ μμ winstonμ μ¬μ©νμ¬ λ΄κ° λ§λλ λͺ¨λ μμ²κ³Ό ν¨μ νΈμΆμ κΈ°λ‘ν©λλ€. κ·Έλ¦¬κ³ νλ‘λμ νκ²½μ μλ κ²½μ° μΆλ ₯μ μΈμ μ€λ₯λ‘λ§ μ νν©λλ€.
λ΄ μ½λλ₯Ό μ¬μ©νκ³ console.log λ¬Έμ λ€λ₯Έ κ²μΌλ‘ κ΅ννλ©΄ μλν©λλ€.
κ·Έλ¬λ μ΄ μμ μ μννκΈ° μν ν΄ν€ μ루μ μ μμ±νκΈ° μ μ μΌνΈλ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
λν μΉν©μ μ μ΄ν μ μλμ§ μ¬λΆμ λ°λΌ λ€λ¦ λλ€. μ¬νκ²λ μ΄ λλΌμ΄ ν¨ν€μ§λ ꡬ쑰μ μΌλ‘ ꡬμμ΄μ΄μ μ§μ μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
@Keimeno μ΄μν νλμ΄λ μ±λ₯ λ¬Έμ λ₯Ό λ°κ²¬νμ ¨μ΅λκΉ? μ λ§ μ¬μ©νκ³ μΆμ§λ§ λ΄ μ¬μ© μ¬λ‘μ λν νλ‘λμ νκ²½μμ μΌλΆ λ‘κΉ μ΄ λ°μνλ―λ‘ λ§€μ° μμ μ μ΄μ΄μΌ ν©λλ€...
@gcperrin μ±λ₯ λ¬Έμ λΌκ³ ν μ μλμ§ νμ€νμ§ μμ§λ§ λͺ κ°μ§ λ²€μΉλ§ν¬λ₯Ό μ€ννκ³ λ€μ κ²°κ³Όλ₯Ό μ»μμ΅λλ€.
dev νκ²½: μ½μμ 무μΈκ°λ₯Ό κΈ°λ‘ν©λλ€.
prod νκ²½: 무μΈκ°λ₯Ό κΈ°λ‘νμ§ μμ§λ§ log ν¨μλ₯Ό νΈμΆν©λλ€.
_console.info(κ°λ° νκ²½)_; 10,000κ° λ‘κ·Έμ κ²½μ° 1.863μ΄μ
λλ€. (κ° 0,1893ms)
_logger.info(κ°λ° νκ²½)_: 10.000κ° λ‘κ·Έμ κ²½μ° 7.980μ΄. (κ° 0.7980ms)
_logger.info(νλ‘λνΈ νκ²½)_; 10,000κ° λ‘κ·Έμ κ²½μ° 3.731μ΄μ λλ€. (κ° 0.3731ms)
μ¦, νλ‘λμ μμ λ‘κ±°λ₯Ό 침묡μν€κΈ° μν΄ λ΄ κΈ°λ₯μ μ¬μ©νλ©΄ λκΈ° μ½λκ° μ¬μ ν 0.3731ms(μ μ¬μ μΌλ‘ λ λμ μ μμ) λμ μ€νλ©λλ€. μ±λ₯ λ¬Έμ κ° μλ μλ μμ§λ§ νλ‘λμ μμ μλμΌλ‘ μ€νλλ μλ°± κ°μ λ‘κ·Έκ° μλ κ²½μ° μΉ μ±μ΄ μ§μ°λ μ μμ΅λλ€.
λΈλΌμ°μ μΈ‘μμ νμΌ μμ€ν μ λ‘κ·ΈμΈμ μ μ§νκΈ° μν΄ winstonμ μ¬μ©νλ λ°©λ²μ΄ μμ΅λκΉ?
React μ ν리μΌμ΄μ μ΄ μκ³ ν΄λΌμ΄μΈνΈ μΈ‘ λ‘κ·Έλ₯Ό νμΌ μμ€ν μ μ μ₯νκ³ μΆμ΅λλ€. μ λ° λͺ κ°μ§ μκ°μ μ μνμμμ€.
미리 κ°μ¬λ립λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄λ΄, λ΄κ° ν¨ν€μ§λ₯Όλ³΄κ³ λΈλΌμ°μ μ§μμ΄ μλ€λ κ²μ μμμ λ λ΄ ν¬λ§μ μ λ§ λμμ΅λλ€.
μ΄κ²μ λΈλΌμ°μ μμ μ§μμ μ¬λ°°ν κ²λ€μ λ체νκΈ° μν΄ μ λ§ κ΅μ₯ν κ²μ λλ€.