рдУрдПрд╕: рдЙрдмрдВрдЯреВ 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
рд▓реЗрдХрд┐рди рдХреЛрдИ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИред
+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
рдЦрд┐рд▓рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрджрд┐ рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрдиреА рд░рд╣рддреА рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдирдП рдореБрджреНрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдВрд╕реНрдЯрди рдЖрдкрдХреЗ рд▓рд┐рдП рдирдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд▓реЙрдЧ/рдРрдк.рдЬреЗрдПрд╕ рдкрд░ рд╕реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ "рд▓реЙрдЧ" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)