Winston: рдХреЛрдИ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛ рд░рд╣реА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдордИ 2016  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: winstonjs/winston

рдУрдПрд╕: рдЙрдмрдВрдЯреВ 14.04
рдиреЛрдбрдЬреЗрдПрд╕: 6.2.0
рд╡рд┐рдВрд╕реНрдЯрди: 2.2.0

рдирд┐рдореНрди рдХреЛрдб рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ:

const logger = new Winston.Logger({
    level: 'verbose',
    transports: [
      new Winston.transports.Console({
        timestamp: true
      }),
      new Winston.transports.File({
        filename: 'app.log',
        timestamp: true
      })
    ]
  });

logger.info('Holla');

рдпрд╣ рдЯрд░реНрдорд┐рдирд▓ рдлрд╛рдЗрди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ:

2016-05-26T13:11:49.927Z - info: Holla

рд▓реЗрдХрд┐рди рдХреЛрдИ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдВрд╕реНрдЯрди рдЖрдкрдХреЗ рд▓рд┐рдП рдирдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд▓реЙрдЧ/рдРрдк.рдЬреЗрдПрд╕ рдкрд░ рд╕реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ "рд▓реЙрдЧ" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

рд╕рднреА 27 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

+1

+1

+1

+1

рдпрд╣ рдиреЛрдб 6 рдореЗрдВ fs.stat рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ ()
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХреЙрд▓рдмреИрдХ fs.stat() рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛

    fs.stat(fullname, function (err, stats) {
      if (err) {
        if (err.code !== 'ENOENT') {
          return self.emit('error', err);
        }
        return createAndFlush(0);
      }

      if (!stats || (self.maxsize && stats.size >= self.maxsize)) {
        //
        // If `stats.size` is greater than the `maxsize` for
        // this instance then try again
        //
        return self._incFile(function() {
          checkFile(self._getFile());
        });
      }

      createAndFlush(stats.size);
    });
  })(this._getFile()); 

рдХреНрдпрд╛ рдпрд╣ рддрдп рд╣реИ?

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреВрд░реНрдг рдкрде рджреЗрдХрд░ рдареАрдХ рдХрд┐рдпрд╛:
winston.add(winston.transports.File, { filename: ${__dirname}/logs/appError.log })

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд┐рдВрд╕реНрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдереА , рдЬрд╣рд╛рдВ рдЯреНрд░реА-рд╡реНрдпреВ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдЕрджреНрдпрддрди рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдПрдЯрдо рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ .gitignore рдлрд╝рд╛рдЗрд▓реЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рдереАрдВ ... (рд╡рд┐рдХрд▓реНрдк: рдЫреБрдкрд╛рдПрдВ рд╡реАрд╕реАрдПрд╕ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛) рдлрд╝рд╛рдЗрд▓реЗрдВ)

_рдиреЛрдб 6.2.2 рдФрд░ рд╡рд┐рдВрд╕реНрдЯрди 2.2.0._ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХреЛрдб:

'use strict';

let Winston = require('winston');


const logger = new Winston.Logger({
    level: 'verbose',
    transports: [
      new Winston.transports.Console({
        timestamp: true
      }),
      new Winston.transports.File({
        filename: 'app.log',
        timestamp: true
      })
    ]
  });

logger.info('Holla');

рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдПрдХ app.log рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ: {"level":"info","message":"Holla","timestamp":"2016-07-01T19:29:14.035Z"} рдФрд░ 2016-07-01T19:29:14.034Z - info: Holla рд╕рд╛рде рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдВрд╕реНрдЯрди рдЖрдкрдХреЗ рд▓рд┐рдП рдирдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд▓реЙрдЧ/рдРрдк.рдЬреЗрдПрд╕ рдкрд░ рд╕реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ "рд▓реЙрдЧ" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

рдХрд╛рд╢ рд╡рд┐рдВрд╕реНрдЯрди рдиреЗ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреНрдпрд╛ рд▓реЙрдЧ рдлрд╝реЛрд▓реНрдбрд░/рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдПрдХ рд▓реЙрдЧ рдлрд╝реЛрд▓реНрдбрд░/рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдирд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fs рдпрд╣ рд╕рд╣реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

+1

+1

+1

if (!fs.existsSync('path') {
    fs.mkdirSync('path');
}

http://thisdavej.com/using-winston-a-versatile-logging-library-for-node-js/

рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рдЗрд╕реЗ рдбрдмрд▓ рд╕реНрд▓реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░реЗрдВ:

        Logger.loggerInfo = new Winston.Logger({
            level: 'info',
            transports: [
                new Winston.transports.File({
                    filename: process.cwd() + '\\logs\\info.log',
                    timestamp: true
                })
            ]
        });

рдореИрдВрдиреЗ рдХрдИ рдЙрдиреНрдирдд рд▓реЙрдЧрд┐рдВрдЧ рддрдВрддреНрд░реЛрдВ (рд╡рд┐рдВрд╕реНрдЯрди рд╕рд╣рд┐рдд) рдХреЗ рд╕рд╛рде рдХрдИ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдФрд░ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдирд┐рдХрд╛рд╕ (рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ (0)) рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд▓реЙрдЧрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВред
рд╕реНрд╡рдЪреНрдЫ рдирд┐рдХрд╛рд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрддрд╛ рд╣реИред

@fvuilleumier рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдзрдиреНрдпрд╡рд╛рдж, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реАрдПрд▓рдЖрдИ рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди process.exitCode = 0 (рдпрд╛ рдХреЛрдИ рднреА рдХреЛрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реВрдк рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ

const filename = path.join(__dirname, 'created-logfile.log');

const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename })
  ]
});

рдлрд╝рд╛рдЗрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ

@fvuilleumier @nicosommi рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЖрдк рдШреВрдордиреЗ-рдлрд┐рд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ?

@danbrownbox рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЬреЗрдПрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рд░реНрдл рдПрдХ рдлрд╛рдЗрд▓ рд╣реИ рдЬреЛ рдЕрдВрдд рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЙрдЪрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдореЗрд░реЗ рдореИрдХ рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдкреВрд░реНрдг рдкрде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред

рдЪрд╛рд╣реЗ рдореИрдВ рдирд┐рд░рдкреЗрдХреНрд╖ рдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдкрд░рд┐рд╡рд╣рди рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

function createLogFile(appName) {
  pathUtils.ensureDirectoryExists('logs');
  pathUtils.ensureDirectoryExists(`logs/${appName}`);
  winston.add(winston.transports.File, {
    level: 'debug',
    //filename: `logs/${appName}/export-${Date.now()}.log`,
    //filename: `${__dirname}/logs/${appName}/export-${Date.now()}.log`,
    filename: `${process.cwd()}/logs/${appName}/export-${Date.now()}.log`,
    json: false,
    formatter: _formatLog()
  });
}

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдкрд░рд┐рд╡рд╣рди рдХреЛ createLogger() рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЙрддреНрддрд░ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:
````
рдХреЙрдиреНрд╕реНрдЯ рд╡рд┐рдВрд╕реНрдЯрди = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рд╡рд┐рдВрд╕реНрдЯрди');
рдХреЙрдиреНрд╕реНрдЯ рд▓реЙрдЧрдбрд┐рд░ = 'рд▓реЙрдЧ';
рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдПрдлрдПрд╕');

рдЕрдЧрд░ (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}

рдХреЙрдиреНрд╕реНрдЯ рд▓реЙрдЧрд░ = рд╡рд┐рдВрд╕реНрдЯрдиред рдХреНрд░рд┐рдПрдЯрд▓реЙрдЧрд░ ({
рд╕реНрддрд░: 'рдЬрд╛рдирдХрд╛рд░реА',
рдкреНрд░рд╛рд░реВрдк: рд╡рд┐рдВрд╕реНрдЯрди.рдлреЙрд░реНрдореИрдЯ.рдЬреЗрд╕рди (),
рдПрдЧреНрдЬрд┐рдЯрдСрди рдПрд░рд░: рдЭреВрдард╛,
рдкрд░рд┐рд╡рд╣рди: [
рдирдпрд╛ (рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рд╡рд┐рдВрд╕реНрдЯрди-рджреИрдирд┐рдХ-рд░реЛрдЯреЗрдЯ-рдлрд╝рд╛рдЗрд▓')) ({
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо: ${logDir}/logs.log ,
рджрд┐рдирд╛рдВрдХ рдкреИрдЯрд░реНрди: 'YYYY-MM-DD-HH',
рдЬрд╝рд┐рдкреНрдб рдЖрд░реНрдХрд╛рдЗрд╡: рд╕рдЪ,
рд╕реНрддрд░: 'рдореВрд░реНрдЦ'
}),
рдирдпрд╛ (рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рд╡рд┐рдВрд╕реНрдЯрди-рджреИрдирд┐рдХ-рд░реЛрдЯреЗрдЯ-рдлрд╝рд╛рдЗрд▓')) ({
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо: ${logDir}/errors.log ,
рджрд┐рдирд╛рдВрдХ рдкреИрдЯрд░реНрди: 'YYYY-MM-DD-HH',
рдЬрд╝рд┐рдкреНрдб рдЖрд░реНрдХрд╛рдЗрд╡: рд╕рдЪ,
рд╕реНрддрд░: 'рддреНрд░реБрдЯрд┐'
})
],
});

рдирд┐рд░реНрдпрд╛рдд {рд▓рдХрдбрд╝рд╣рд╛рд░рд╛};

logger.silly ('рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг');
logger.info ('рдЬрд╛рдирдХрд╛рд░реА рдкрд░реАрдХреНрд╖рдг');
logger.warn ('рдЪреЗрддрд╛рд╡рдиреА рдкрд░реАрдХреНрд╖рдг');
рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ред рддреНрд░реБрдЯрд┐ ('рддреНрд░реБрдЯрд┐ рдкрд░реАрдХреНрд╖рдг');
````

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдореВрд▓ рд▓реЗрдЦрдХ рд╣реВрдВ (рдЕрд▓рдЧ рдЦрд╛рддрд╛)ред рдореИрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВ ... рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛

рдХреНрдпрд╛ рдЖрдк рдирд╡реАрдирддрдо [email protected] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореМрдЬреВрдж рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ( winston рдЖрдкрдХреЗ рд▓рд┐рдП рдбреАрдЖрдИрдЖрд░ рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдПрдХ рдкреАрдЖрд░ рдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ)ред рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╣рдо рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВ :)

рдореИрдВ рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рдЫреЛрдбрд╝ рджреЛ

рдардВрдбрд╛! рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо #1465 рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрджреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг master рдЦрд┐рд▓рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрджрд┐ рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрдиреА рд░рд╣рддреА рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдирдП рдореБрджреНрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Buzut picture Buzut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amiram picture amiram  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mrgoos picture mrgoos  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xungwoo picture xungwoo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

KingRial picture KingRial  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ