Winston: μ½˜μ†” λ‘œκΉ…μ€ 색상이 μ§€μ •λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 11μ›” 10일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: winstonjs/winston

μ½˜μ†” 좜λ ₯에 색상을 μ§€μ •ν•˜λ €κ³  ν•˜λŠ”λ° μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 좜λ ₯은 λͺ¨λ‘ λ™μΌν•œ(흰색) μƒ‰μƒμž…λ‹ˆλ‹€. μ €λŠ” 3.0.0-rc1에 μžˆμŠ΅λ‹ˆλ‹€.

const winston = require('winston');
const logLevels = {
  levels: {
    error: 0,
    warn: 1,
    info: 2,
    http: 3,
    sql: 4,
    debug: 5
  },
  colors: {
    error: "red",
    warn: "darkred",
    info: "black",
    http: "green",
    sql: "blue",
    debug: "gray"
  }
};
winston.addColors(logLevels);
const logger = winston.createLogger({...});
logger.add(new winston.transports.Console({colorize: true}));

λ‚˜λŠ” λ˜ν•œ μ—¬κΈ° μ—μ„œ μ œμ•ˆμ„ μ‹œλ„ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

logger.add(new winston.transports.Console({format: winston.format.combine(formatter, winston.format.colorize())}));

감사 ν•΄μš”,
μ•Œλ°”λ‘œ

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

logform μ„€λͺ…μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λΆ„μ μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf(info => `${info.timestamp} [${info.level}]: ${info.message}`),
  );

JSON 인수 덀핑을 μ²˜λ¦¬ν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈλŠ” λ‚΄κ°€ ν•΄κ²°ν•œ κ²ƒμž…λ‹ˆλ‹€.

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf((info) => {
      const {
        timestamp, level, message, ...args
      } = info;

      const ts = timestamp.slice(0, 19).replace('T', ' ');
      return `${ts} [${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
    }),
  );

screen shot 2017-11-13 at 10 55 05 am

λͺ¨λ“  22 λŒ“κΈ€

logform μ„€λͺ…μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λΆ„μ μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf(info => `${info.timestamp} [${info.level}]: ${info.message}`),
  );

JSON 인수 덀핑을 μ²˜λ¦¬ν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈλŠ” λ‚΄κ°€ ν•΄κ²°ν•œ κ²ƒμž…λ‹ˆλ‹€.

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf((info) => {
      const {
        timestamp, level, message, ...args
      } = info;

      const ts = timestamp.slice(0, 19).replace('T', ' ');
      return `${ts} [${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
    }),
  );

screen shot 2017-11-13 at 10 55 05 am

2μ‹œκ°„ 후에 색상을 μž‘λ™ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. @Xeoncross κ°μ‚¬ν•©λ‹ˆλ‹€!

winston을 μ‹œμž‘ν•˜κ³  색상이 μ—†λŠ” μ½˜μ†”λ„ μ–»μ—ˆμŠ΅λ‹ˆλ‹€...
λ‚˜λŠ” λ‹€μŒ 전솑 μ •μ˜ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

new winston.transports.Console({
  format: winston.format.simple()
})

이 μŠ€λ ˆλ“œλ₯Ό 읽은 ν›„ λ‹€μŒκ³Ό 같이 ν–ˆμŠ΅λ‹ˆλ‹€.

new winston.transports.Console({
  format: winston.format.combine(
            winston.format.simple(),
            winston.format.colorize()
          )
})

그리고 차이가 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ colorize ν˜•μ‹μ˜ μœ„μΉ˜λ₯Ό ​​1st둜 λ³€κ²½ν•˜κ³  색상이 μž‘λ™ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

new winston.transports.Console({
  format: winston.format.combine(
            winston.format.colorize(),
            winston.format.simple()
          )
})

@abrakadobr κ°μ‚¬ν•©λ‹ˆλ‹€! 그것은 νŠΈλ¦­μ„ ν–ˆλ‹€.

μ—¬κΈ°μ—λŠ” 아무 것도 νš¨κ³Όκ°€ μ—†μ—ˆκ³  μ—¬μ „νžˆ 색상이 μ—†μ—ˆμœΌλ©° colorizeλ₯Ό 맨 μœ„λ‘œ μ΄λ™ν•˜λ©΄ 정보 ν•„λ“œκ°€ μΈμ½”λ”©λœ λ¬Έμžμ—΄μ„ κΈ°λ‘ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ expressjs μ•±μ—μ„œ winston & morgan λ‘œκΉ…μ„ μ‚¬μš©ν•˜λŠ” 방법을 λ³΄μ—¬μ£ΌλŠ” μš”μ§€ λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

@Xeoncross κ°μ‚¬ν•©λ‹ˆλ‹€! λ‚΄ ν˜•μ‹μ— winston.format.colorize()λ₯Ό μΆ”κ°€ν•˜λ©΄ νš¨κ³Όκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이것이 λ¬Έμ„œμ— μ—†λ‹€λŠ” 것이 ν₯λ―Έ λ‘­μŠ΅λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ 적어도 λ¬Έμ„œμ—μ„œ 찾을 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ μœ μ—°μ„±μ΄ λ§ˆμŒμ— λ“€μ§€λ§Œ 더 λ‚˜μ€ λ¬Έμ„œλ₯Ό μ œκ³΅ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. λ‚˜λŠ” 이것을 μž‘λ™μ‹œν‚€λŠ” 데 λ„ˆλ¬΄ 였랜 μ‹œκ°„μ„ λ³΄λƒˆλ‹€. winston.cli() λ₯Ό μ‚¬μš©ν•˜λŠ” 우리λ₯Ό μœ„ν•œ ν”ŒλŸ¬κ·Έ μ•€ ν”Œλ ˆμ΄ μ˜ˆλŠ” @Xeoncross의 μ˜ˆμ™€ μœ μ‚¬ν•œ λ¨Ό 길을 갈 κ²ƒμž…λ‹ˆλ‹€.

ν˜„μž¬ 릴리슀 λ²„μ „μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 방법을 μ•„λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ? 릴리슀 후보 버전은 μ˜΅μ…˜μ΄ μ•„λ‹™λ‹ˆλ‹€.

μ½”λ“œλ₯Ό 읽을 λ•Œ 전체 둜그λ₯Ό μƒ‰μΉ ν•˜λŠ” μ˜΅μ…˜μœΌλ‘œ all λ₯Ό colorize 에 보낼 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

colorize({ all: true })

@markhealey 이미 λ‚΄ package.jsonμ—μ„œ winston 쒅속성을 μ œκ±°ν•œ λ‹€μŒ κ·€ν•˜μ˜ λ©”μ‹œμ§€λ₯Ό μ½μ—ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€ :+1:

Thx @Xeoncross. https://github.com/winstonjs/logform/blob/master/timestamp.js λ₯Ό μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€. format opt λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž„μŠ€νƒ¬ν”„ ν˜•μ‹μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ‹œκ°„λŒ€μ—μ£Όμ˜ν•˜μ‹­μ‹œμ˜€

format.combine(
    format.colorize(),
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.align(),
    format.printf(info => {
        const { timestamp, level, message, ...extra } = info;

        return `${timestamp} [${level}]: ${message} ${
            Object.keys(extra).length ? JSON.stringify(extra, null, 2) : ''
        }`;
    }),
)

format.colorize({all:true} λŠ” νƒ€μž„μŠ€νƒ¬ν”„κ°€ ν¬ν•¨λœ 경우 μ‹€μ œλ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 전체 라인에 색상을 μ§€μ •ν•˜λŠ” μž‘μ—… μ˜ˆμž…λ‹ˆλ‹€.

const colorizer = winston.format.colorize();

const logger = winston.createLogger({
  level: 'debug',
  format: combine(
    winston.format.timestamp(),
    winston.format.simple(),
    winston.format.printf(msg => 
      colorizer.colorize(msg.level, `${msg.timestamp} - ${msg.level}: ${msg.message}`)
    )
  ),
  transports: [
    new transports.Console(),
  ]

});

λ‚΄ 전체 κΈ°λŠ₯ 둜거 확인

@abrakadobr μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. κ·€ν•˜μ˜ μ†”λ£¨μ…˜μ΄ μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

@tommuhm 이제 결함이 λ³΄μž…λ‹ˆλ‹€. printf 전체에 색상을 μ§€μ •ν•˜λ €λŠ” 경우 colorize 에 λŒ€ν•œ κΈ°λ³Έ 제곡 ν˜•μ‹ μ˜΅μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€. 이것이 λ‹Ήμ‹ μ—κ²Œ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

const { createLogger, format, transports } = require('../');

const logger = createLogger({
  level: 'debug',
  format: format.combine(
    format.timestamp(),
    format.simple(),
    format.printf(info => `${info.timestamp} - ${info.level}: ${info.message}`),
    format.colorize({ all: true })
  ),
  transports: [
    new transports.Console(),
  ]
});

logger.error('wowza');

κΉŒλ‹€λ‘œμš΄ λΉ„νŠΈλŠ” colorizer info κ°€ "직렬화"λ˜μ—ˆμ„ λ•Œ(즉, info[MESSAGE] κ°€ λ¬Έμžμ—΄λ‘œ μ„€μ •λ˜μ—ˆμ„ λ•Œ) colorizerλ₯Ό μ•Œ 수 μžˆλ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 곧 logform 에 λŒ€ν•œ 후속 PR – μžμ„Ένžˆ μ‚΄νŽ΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

@Xeoncross μš°λ¦¬λŠ” 훨씬 더 κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, colorize, printf } = format;

const level = process.env.LOG_LEVEL || 'debug';

const myFormat = printf(({ level, message, label, timestamp }) => {
    return `${timestamp} ${level}: ${message}`;
});

const logger = createLogger({
    format: combine(colorize(), timestamp(), myFormat),
    transports: [new transports.Console()]
});

μ°Έμ‘°: https://www.npmjs.com/package/winston#using -custom-logging-levels

λ‚˜λŠ” cloudwatch에 λ‘œκ·ΈμΈν•˜κΈ° μœ„ν•΄ winston을 μ‚¬μš©ν•˜κ³  색상을 μΆ”κ°€ν•˜λ €κ³  ν•˜μ§€λ§Œ 색상 기호 λŒ€μ‹ μ— λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λͺ¨λ“  μ†”λ£¨μ…˜μ„ μ‹œλ„ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” λ‚΄ μ½”λ“œμž…λ‹ˆλ‹€

const winston = require('winston');
const {transports, format, createLogger  } = winston;
const { combine,errors,timestamp} = format;

const colorizer = winston.format.colorize();


const logger = createLogger({
    level:  process.env.LOG_LEVEL,
    prettyPrint : true,
    format: combine(
        winston.format.timestamp(),
        winston.format.simple(),
        winston.format.printf(msg =>
            colorizer.colorize(msg.level, `${msg.timestamp} - ${msg.level}: ${msg.message}`)
        )
    ),
    transports: [
        new transports.Console()
    ]
});

module.exports = {logger};

Cloudwatch μ½˜μ†” 좜λ ₯μ—μ„œ

[34m2019-08-22T13:00:03.325Z - debug: res by id: [
{
    "isActive": true,
    "value": "fNUMheWiwXayKsaYCbUeA7Gg7BtEPIUbakB56XH1",
    "id": "oehlwqlcve",
    "userId": "6b347b41-ddef-4842-83a0-1cd5ca358482"
}
][39m

이 [39m λŠ” 색상 λŒ€μ‹  λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ–΄λ– ν•œ μ œμ•ˆ?

-22T13:00:03.325Z - 디버그: ID별 res: [

저도 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•΄κ²°ν•˜μ…¨λ‚˜μš”?

-22T13:00:03.325Z - 디버그: ID별 res: [

저도 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•΄κ²°ν•˜μ…¨λ‚˜μš”?

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? μ–΄λ–»κ²Œλ“  ν•΄κ²°ν•˜μ…¨λ‚˜μš”?

@Xeoncross μš°λ¦¬λŠ” 훨씬 더 κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, colorize, printf } = format;

const level = process.env.LOG_LEVEL || 'debug';

const myFormat = printf(({ level, message, label, timestamp }) => {
  return `${timestamp} ${level}: ${message}`;
});

const logger = createLogger({
  format: combine(colorize(), timestamp(), myFormat),
  transports: [new transports.Console()]
});

μ°Έμ‘°: https://www.npmjs.com/package/winston#using -custom-logging-levels

그것은 MacOS의 iTermμ—μ„œ λ‚˜λ₯Ό μœ„ν•΄ μ†μž„μˆ˜λ₯Ό μΌμŠ΅λ‹ˆλ‹€.

μ•„λž˜ 링크가 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.
https://stackoverflow.com/questions/51012150/winston-3-0-colorize-whole-output-on-console

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰