{"id":367086,"date":"2024-05-21T03:13:41","date_gmt":"2024-05-21T03:13:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=367086"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=367086","title":{"rendered":"<span>Logstash, Manticore, Nginx \u0438 Symfony: \u0441\u0431\u043e\u0440, \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043b\u043e\u0433\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u044b\u0441\u043b\u044c \u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u043b\u043e\u0433\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u0432 \u043c\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u044f \u0441\u043c\u043e\u0433 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e. \u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u044f\u0445 \u0441\u0432\u044f\u0437\u043a\u0438 Logstash + Manticore + Nginx + Symfony.<\/p>\n<p>\u0412 \u0441\u0435\u0442\u0438 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u043a\u0438 Logstash +\u00a0Elasticsearch, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e Manticore. \u0414\u0430, \u0443 \u0441\u0430\u043c\u043e\u0439 \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u044b \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0446\u0435\u043b\u044b\u0439\u00a0<a href=\"https:\/\/play.manticoresearch.com\/logstash\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e Logstash\/Beats<\/a>, \u043d\u043e \u043a\u0430\u043a \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0434\u0435\u043c\u043a\u0435 \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 &#8212; \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0443\u0442\u0438. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u043d\u0430\u043f\u0438\u0448\u0443.<\/p>\n<p><em>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440: \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u041e\u0421 Linux \u0438 \u0438\u043c\u0435\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Ubuntu 22. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u0432\u044b\u043b\u0438\u0437\u0430\u043d\u043d\u044b\u043c&#187;, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u0430 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043b\u044e\u0431\u043e\u0439 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/em><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Manticore<\/h3>\n<p>\u0412 \u0441\u0430\u043c\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Manticore \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0438 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e\u00a0<a href=\"https:\/\/manticoresearch.com\/install\/\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430<\/a>, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442:<\/p>\n<pre><code>wget https:\/\/repo.manticoresearch.com\/manticore-repo.noarch.deb dpkg -i manticore-repo.noarch.deb apt update apt install manticore manticore-extra<\/code><\/pre>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u044d\u043f, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code>nano \/etc\/manticoresearch\/manticore.conf<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<pre><code>searchd {   listen = 127.0.0.1:9312   listen = 127.0.0.1:9306:mysql   listen = 127.0.0.1:9308:http   log = \/var\/log\/manticore\/searchd.log   query_log = \/var\/log\/manticore\/query.log   pid_file = \/var\/run\/manticore\/searchd.pid   data_dir = \/var\/lib\/manticore }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u0435\u0449\u044c: \u0441\u0430\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d, \u0431\u0430\u0437\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u043b\u043e\u0433\u0438, \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435 \u043e\u0434\u043d\u0430, \u043d\u043e \u0445\u043e\u0441\u0442\u043e\u0432\/\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432\/VPS \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f Logstash, \u0441\u043e\u0431\u0438\u0440\u0430\u044f \u043b\u043e\u0433\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0438\u0445 \u0432 \u043e\u0434\u043d\u0443 \u0431\u0430\u0437\u0443 Manticore (\u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0435 \u0432 \u043e\u0434\u043d\u0443, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f).<\/p>\n<p>\u0427\u0430\u0441\u0442\u043e (\u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430) \u0440\u0430\u0437\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 127.0.0.1 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0445\u043e\u0441\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a010.16.0.1. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0445\u043e\u0441\u0442\u043e\u0432 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438:<\/p>\n<pre><code>searchd {   listen = 10.16.0.1:9312   listen = 10.16.0.1:9306:mysql   listen = 10.16.0.1:9308:http   log = \/var\/log\/manticore\/searchd.log   query_log = \/var\/log\/manticore\/query.log   pid_file = \/var\/run\/manticore\/searchd.pid   data_dir = \/var\/lib\/manticore }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0445\u043e\u0441\u0442\u0435\u00a010.16.0.1 \u0438 \u043f\u043e\u0440\u0442\u0443\u00a09308 \u0443 \u043d\u0430\u0441 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0430 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a \u0441\u0435\u0431\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0445\u043e\u0441\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a010.16.0.2,\u00a010.16.0.3 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 IP \u0430\u0434\u0440\u0435\u0441, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440 \u043f\u043e\u0440\u0442\u0430.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0443:<\/p>\n<pre><code>systemctl start manticore<\/code><\/pre>\n<p>\u041f\u043e\u0442\u044b\u043a\u0430\u0439\u0442\u0435 \u0432 \u043d\u0435\u0435 \u0447\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code>curl 10.16.0.1:9308<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<pre><code>{\"cluster_name\":\"docker-cluster\",\"cluster_uuid\":\"Z7igA6xDRDKCVwnMuyXCOQ\",\"name\":\"4e9d933ebde2\",\"tagline\":\"You Know, for Search\",\"version\":{\"build_date\":\"2019-10-22T17:16:35.176724Z\",\"build_flavor\":\"default\",\"build_hash\":\"fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e\",\"build_snapshot\":false,\"build_type\":\"docker\",\"lucene_version\":\"8.2.0\",\"minimum_index_compatibility_version\":\"6.0.0-beta1\",\"minimum_wire_compatibility_version\":\"6.8.0\",\"number\":\"7.4.1\"}}<\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u0441 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Manticore \u0432\u0441\u0435, \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435, \u0441 \u0441\u0430\u043c\u0438\u043c Logstash-\u0435\u043c.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 Nginx<\/h3>\n<p>\u041e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f Nginx \u043b\u043e\u0433\u043e\u0432 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043b\u043e\u0433\u043e\u0432 &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 JSON. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437\u00a0<a href=\"https:\/\/grokdebugger.com\/\" rel=\"noopener noreferrer nofollow\">Grok<\/a>\u00a0(\u043a \u043d\u0435\u043c\u0443 \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f), \u043d\u043e \u0437\u0430\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 JSON?<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432\u0430\u0448\u0435\u0433\u043e Nginx \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\u00a0\/etc\/nginx\/nginx.conf &#8212; \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u0432\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c JSON-\u0444\u043e\u0440\u043c\u0430\u0442:<\/p>\n<pre><code>nano \/etc\/nginx\/nginx.conf <\/code><\/pre>\n<p>&#8212; \u0432 \u0431\u043b\u043e\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430 http \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code>log_format main_json escape=json '{' \u00a0 \u00a0\u00a0'\"datetime_local\": \"http_host\", ' \u00a0 \u00a0\u00a0'\"ip\": \"request_method\", ' \u00a0 \u00a0\u00a0'\"uri\": \"args\", ' \u00a0 \u00a0\u00a0'\"post\": \"http_cookie\", ' \u00a0 \u00a0\u00a0'\"status\": http_user_agent\", ' \u00a0 \u00a0\u00a0'\"req_time\": http_referer\" ' '}';<\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u043a\u0443\u0441\u0443, \u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e &#171;\u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c&#187; \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 Logstash (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043d\u0430\u0448 \u0445\u043e\u0441\u0442 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u043c\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 &#171;main_json&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code>nano \/etc\/nginx\/sites-available<\/code><\/pre>\n<p>&#8212; \u0432 \u0431\u043b\u043e\u043a\u0435 server \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code>access_log \/var\/log\/nginx\/access_json.log main_json;<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e access log \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u0438 error log &#8212; \u0443 \u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code>error_log \/var\/log\/nginx\/error.log<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Nginx:<\/p>\n<pre><code>systemctl restart nginx<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043b\u043e\u0433\u0438 \u043d\u0430\u0447\u043d\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 &#171;\/var\/log\/nginx\/access_json.log&#187; \u0438 &#171;\/var\/log\/nginx\/error.log&#187; &#8212; \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0436\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 Symfony<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u0435\u043a \u0438 \u043b\u043e\u0433\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u0430\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f &#8212; \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>Symfony \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437\u00a0<a href=\"https:\/\/github.com\/Seldaek\/monolog\" rel=\"noopener noreferrer nofollow\">Monolog Bundle<\/a>\u00a0&#8212; \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442 JSON, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u0432\u0438\u0434\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 JSON, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0432 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0434\u043b\u044f 6 \u0432\u0435\u0440\u0441\u0438\u0438 Symfony. \u0412\u0441\u0435 \u043f\u0443\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u043f\u043a\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u043b\u043e\u0433\u0433\u0435\u0440\u0430:<\/p>\n<pre><code>nano config\/packages\/monolog.yaml<\/code><\/pre>\n<p>&#8212; \u0438 \u0432\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0435\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<pre><code>monolog:   handlers:     main:       type: fingers_crossed       action_level: error       handler: nested       excluded_http_codes: [400, 403, 404]       buffer_size: 50       level: debug     nested:       action_level: error       type: rotating_file       path: \"%kernel.logs_dir%\/%kernel.environment%.json\"       level: debug       formatter: monolog.formatter.custom       max_files: 7     console:       type: console       process_psr_3_messages: false       channels: [\"!event\", \"!doctrine\"]<\/code><\/pre>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u0434\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432 400, 403, 404 &#8212; \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043b\u043e\u0433\u0430 \u043e\u0442 &#171;error&#187;, \u0440\u043e\u0442\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e 7 \u0448\u0442\u0443\u043a. \u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u043a\u0443\u0441\u0443, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code>formatter: monolog.formatter.custom_json<\/code><\/pre>\n<p>&#8212; \u0432 \u043d\u0435\u0439 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043b\u043e\u0433\u043e\u0432, \u0430 \u0442\u0430\u043a \u0436\u0435:<\/p>\n<pre><code>path: \"%kernel.logs_dir%\/%kernel.environment%.json\"<\/code><\/pre>\n<p>&#8212; \u043f\u0443\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441:<\/p>\n<pre><code>nano config\/services.yaml<\/code><\/pre>\n<p>\u0412 \u0431\u043b\u043e\u043a &#171;services&#187; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code>monolog.formatter.custom_json: \u00a0 \u00a0\u00a0class: App\\Service\\CustomJsonFormatter<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 &#8212; \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 &#171;src\/Service\/CustomLogFormatter.php&#187;:<\/p>\n<pre><code class=\"php\">&lt;?php  namespace App\\Service;  use Monolog\\Formatter\\NormalizerFormatter; use Monolog\\LogRecord;  \/**  * Serializes a log message to Logstash Event Format  *\/ class CustomJsonFormatter extends NormalizerFormatter {     \/**      * @var string the name of the system for the Logstash log message, used to fill the @source field      *\/     protected string $systemName;      \/**      * @var string an application name for the Logstash log message, used to fill the @type field      *\/     protected string $applicationName;      \/**      * @var string the key for 'extra' fields from the Monolog record      *\/     protected string $extraKey;      \/**      * @var string the key for 'context' fields from the Monolog record      *\/     protected string $contextKey;      \/**      * @param string      $applicationName The application that sends the data, used as the \"type\" field of logstash      * @param string|\"\" $systemName      The system\/machine name, used as the \"source\" field of logstash, defaults to the hostname of the machine      * @param string      $extraKey        The key for extra keys inside logstash \"fields\", defaults to extra      * @param string      $contextKey      The key for context keys inside logstash \"fields\", defaults to context      *      * @throws \\RuntimeException If the function json_encode does not exist      *\/     public function __construct(string $applicationName = 'app', ?string $systemName = \"\", string $extraKey = 'extra', string $contextKey = 'context')     {         parent::__construct('Y-m-d\\TH:i:s.uP');          $this->systemName = $systemName === \"\" ? (string) gethostname() : $systemName;         $this->applicationName = $applicationName;         $this->extraKey = $extraKey;         $this->contextKey = $contextKey;     }      \/**      * @inheritDoc      *\/     public function format(LogRecord $record): string     {         $recordData = parent::format($record);         $cDate = new \\DateTime();  \u00a0       \/\/ \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432         $message = [             'created_at' => $cDate->format('Y-m-d H:i:s'),             'datetime' => $cDate->getTimestamp(),             'http_host' => isset($_SERVER['HTTP_HOST']) &amp;&amp; $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : \"\",             'uri' => isset($_SERVER['REQUEST_URI']) &amp;&amp; $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : \"\",             'get' => $_GET ? http_build_query($_GET) : \"\",             'post' => $_POST ? http_build_query($_POST) : \"\",             'cookie' => \"\",             'http_referer' => isset($_SERVER['HTTP_REFERER']) &amp;&amp; $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : \"\",             'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) &amp;&amp; $_SERVER['HTTP_USER_AGENT'] ? $_SERVER['HTTP_USER_AGENT'] : \"\",             'ip' => Util::getUserIpAddr(),             'method' => isset($_SERVER['REQUEST_METHOD']) &amp;&amp; $_SERVER['REQUEST_METHOD'] ? $_SERVER['REQUEST_METHOD'] : \"\",             'req_time' => (float) (isset($_SERVER['REQUEST_TIME_FLOAT']) &amp;&amp; $_SERVER['REQUEST_TIME_FLOAT'] ? number_format(microtime(true) - $_SERVER[\"REQUEST_TIME_FLOAT\"], 2, '.', '') : 0.00),             'status' => 500,         ];  \u00a0       \/\/ \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0435 \u0448\u043e\u0440\u0442 \u043a\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043d\u0435\u043c\u0443 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u00a0 \u00a0 \u00a0 \u00a0 $levels = [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'DEBUG' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 100, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 1, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Detailed debug information', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#afafaf', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'INFO' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 200, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 2, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Interesting events. Examples: User logs in, SQL logs', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#9dc3ff', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'NOTICE' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 250, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 3, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Normal but significant events', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#a19dff', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'WARNING' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 300, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 4, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Exceptional occurrences that are not errors. Examples: Use of deprecated APIs, poor use of an API, undesirable things that are not necessarily wrong', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#dfad00', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'ERROR' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 400, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 5, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Runtime errors that do not require immediate action but should typically be logged and monitored', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#df5a00', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'CRITICAL' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 500, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 6, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Critical conditions. Example: Application component unavailable, unexpected exception', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#ff0000', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'ALERT' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 550, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 7, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Action must be taken immediately. Example: Entire website down, database unavailable, etc. This should trigger the SMS alerts and wake you up', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#ff00be', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'EMERGENCY' => [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'code' => 600, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'short_code' => 8, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'description' => 'Emergency: system is unusable', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'color' => '#010001', \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ], \u00a0 \u00a0 \u00a0 \u00a0 ];  \u00a0       \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435         $message['description'] = isset($recordData['message']) ? $recordData['message'] : \"\";         $message['user_id'] = (int) isset($GLOBALS['USER']) ? $GLOBALS['USER']['id'] : 0;         $message['level'] = (int) (isset($recordData['level_name']) ? (array_key_exists($recordData['level_name'], $levels) ? $levels[$recordData['level_name']]['short_code'] : 6) : 6);          if ($recordData['context']) {             $message['description'] .= 'Trace: '.json_encode($recordData['context']);         }  \u00a0       \/\/ \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432 JSON \u0438 \u043f\u0438\u0448\u0435\u043c \u0432 \u0444\u0430\u0439\u043b         return $this->toJson($message) . \"\\n\";     } }<\/code><\/pre>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0440\u043e\u0434\u043d\u043e\u0439 Logstash-\u0435\u0432\u0441\u043a\u0438\u0439 \u0444\u0430\u0439\u043b \u043e\u0442 Monolog \u0431\u0430\u043d\u0434\u043b\u0430 &#171;vendor\/monolog\/monolog\/src\/Monolog\/Formatter\/LogstashFormatter.php&#187; \u0438 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0445: \u0442\u0430\u043a \u043a\u0430\u043a PHP \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u0445\u043e\u0434\u0443 &#171;\u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0432\u0430\u0442\u044c\u0441\u044f&#187;, Manticore \u0441 Logstash \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0430 \u0447\u0438\u0441\u043b\u043e \u0447\u0438\u0441\u043b\u043e\u043c, \u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f 1 != &#171;1&#187; &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>\u0427\u0438\u0441\u0442\u0438\u043c \u043a\u044d\u0448 (\u0434\u043b\u044f \u0441\u0440\u0435\u0434\u044b dev, \u0435\u0441\u043b\u0438 \u0432\u0435\u0434\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, prod \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430):<\/p>\n<pre><code>bin\/console cache:clear --env=dev<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043a\u043e\u0434\u0435 \u0438 \u043b\u044e\u0431\u0443\u0435\u043c\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c \u043b\u043e\u0433\u043e\u0432 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 (prod \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430):<\/p>\n<pre><code>var\/log\/dev-2024-01-17.json<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Logstash<\/h3>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0433\u0432\u043e\u0437\u0434\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b: Logstash + Manticore. \u0415\u0441\u043b\u0438 \u0432\u044b &#171;\u0438\u0433\u0440\u0430\u043b\u0438\u0441\u044c&#187; \u0432 Logstash \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043a\u0443\u0440\u0441\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u044b, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f Logstash \u0432 \u043d\u0435\u043c 7.10.0. \u0412 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Manticore (\u0441\u00a0<a href=\"https:\/\/manual.manticoresearch.com\/Changelog#Version-6.0.4\" rel=\"noopener noreferrer nofollow\">6.0.4<\/a>) \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443: &#171;Support for Logstash versions >= 7.13&#187;. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0434\u0435\u043c \u043d\u0430 \u0441\u0430\u0439\u0442 ELK, \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Logstash \u0438 \u043a\u0430\u0447\u0430\u0435\u043c (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f VPN) \u0432\u0435\u0440\u0441\u0438\u044e\u00a0<a href=\"https:\/\/www.elastic.co\/downloads\/past-releases\/logstash-8-6-2\" rel=\"noopener noreferrer nofollow\">8.6.2<\/a>\u00a0\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u043d\u043e\u0439 \u043b\u0438\u0447\u043d\u043e \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0440\u0443\u0447\u0430\u044e\u0441\u044c. \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u043d\u0430 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0443 Logstash.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e Symfony, \u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c:\u00a0Manticore \u0441 Logstash \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0430 \u0447\u0438\u0441\u043b\u043e \u0447\u0438\u0441\u043b\u043e\u043c, \u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f 1 != &#171;1&#187; &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b Logstash:<\/p>\n<pre><code>nano dev.conf<\/code><\/pre>\n<p>&#8212; \u0438 \u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 (\u0440\u0430\u0437\u043e\u0431\u044a\u0435\u043c \u043d\u0430 3 \u0447\u0430\u0441\u0442\u0438: input, filter, output):<\/p>\n<pre><code class=\"php\">input { \u00a0 \u00a0\u00a0file { \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0path => \"\/var\/log\/nginx\/access_json.log\" # \u043f\u0443\u0442\u044c \u0434\u043e access \u043b\u043e\u0433\u043e\u0432 Nginx \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0codec => \"json\" # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043b\u043e\u0433\u0430 \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0type => 1 # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0438\u043f\u00a0\u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u043b\u043e\u043a\u0435 filter \u00a0 \u00a0\u00a0}  \u00a0 \u00a0\u00a0file { \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0path => \"\/var\/log\/nginx\/error.log\"\u00a0# \u043f\u0443\u0442\u044c \u0434\u043e error \u043b\u043e\u0433\u043e\u0432 Nginx \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0type => 2\u00a0# \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0438\u043f\u00a0\u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u043b\u043e\u043a\u0435 filter \u00a0 \u00a0\u00a0}  \u00a0 \u00a0\u00a0file { \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0path => [\"\/var\/log\/*.json\"] # \u043f\u0443\u0442\u044c \u0434\u043e \u043b\u043e\u0433\u043e\u0432 \u0432\u0430\u0448\u0435\u0433\u043e Symfony \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0codec => \"json\" # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043b\u043e\u0433\u0430 \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0type => 3 # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0438\u043f \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u043b\u043e\u043a\u0435 filter \u00a0 \u00a0\u00a0} }<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 type, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c, \u043d\u043e \u0440\u0430\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041a\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u0438\u0432, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code>add_field => { \u00a0 \u00a0\u00a0\"type\" => 1 }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0431\u043b\u043e\u043a output, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0435\u043c \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e:<\/p>\n<pre><code>output {     elasticsearch {     \u00a0 \u00a0\u00a0index => \"logs\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0hosts => [\"http:\/\/10.16.0.1:9308\"]         ilm_enabled => false         manage_template => false     } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b logs \u0438 \u0430\u0434\u0440\u0435\u0441\u00a010.16.0.1. \u0412\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0442\u0430\u0440\u0438\u0432\u0430\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Manticore.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 &#8212; filter. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 type, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e:<\/p>\n<pre><code class=\"php\">if [type] == 1 {      # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044f     mutate {         add_field => {             \"level\" => 2 # \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0430             \"description\" => \"\" # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 description \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445         }     }      # \u043f\u0430\u0440\u0441\u0438\u043c \u0438\u0437 access json user_agent \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u0435 useragent \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 json     useragent {         source => \"user_agent\"         target => \"useragent\"     }      # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Ruby     ruby {         code => '             # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u0442\u0443 - \u043e\u0434\u043d\u0443 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 2024-01-01 00:00:00, \u0434\u0440\u0443\u0433\u0443\u044e \u0432 Timestamp             time = Time.strptime(event.get(\"datetime_local\"), \"%d\/%b\/%Y:%H:%M:%S\")             event.set(\"created_at\", time.strftime(\"%Y-%m-%d %H:%M:%S\"))             event.set(\"datetime\", time.to_time.to_i)              # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c ID \u044e\u0437\u0435\u0440\u0430 \u0438\u0437 \u043a\u0443\u043a\u0438 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)             # \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e user_id \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u043a\u0443, \u0442\u0430\u043a \u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0448\u0430\u0442\u044c \u0435\u0435 \u0432 \u0445\u044d\u0448             # \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Ruby             user_id = 0             id = event.get(\"cookie\").split(\"user_id\")             if id[1]                 id = id[1].split(\";\")                 if id[0]                     user_id = id[0]                 end             end              # \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 user_id \u0432 \u0447\u0438\u0441\u043b\u043e             event.set(\"user_id\", user_id.to_i)              # \u0412\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0443\u043a (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)             # \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0434\u0440\u0443\u0433\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043d\u0435 \u0433\u0443\u043b\u044f\u043b\u0430 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435 Manticore             newArr = []             arr = event.get(\"cookie\").split(\";\")             if (arr)                 for v in arr do                     if (v.index(\"user_token=\"))                         newArr.append(\"user_token=********\")                     else                         newArr.append(v.strip)                     end                 end                  # \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443                 event.set(\"cookie\", newArr.join(\"; \"))             end              # \u0412\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u043f\u0430\u0440\u043e\u043b\u0438 \u0438\u0437 POST-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)             # \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0430\u0440\u043e\u043b\u0438 - \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0440\u0435\u0436\u0435\u043c \u0438\u0445 \u0438\u0437 \u043d\u0430\u0448\u0438 \u043b\u043e\u0433\u043e\u0432             newArr = []             arr = event.get(\"post\").split(\"&amp;\")             if (arr)                 for v in arr do                     if (v.index(\"password=\"))                         newArr.append(\"password=********\")                     else                         newArr.append(v.strip)                     end                 end  \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0# \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443                 event.set(\"post\", newArr.join(\"&amp;\"))             end         '     } }<\/code><\/pre>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u044e \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443 &#8212; \u0437\u0434\u0435\u0441\u044c \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0438\u0441\u0430\u043b \u043d\u0430 Ruby, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e, \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u0430 \u0441\u0443\u0442\u044c, \u043a\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 &#8212; \u0442\u043e\u0442 \u043c\u043e\u043b\u043e\u0434\u0435\u0446. \u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 &#8212; \u043f\u0430\u0440\u0441\u0438\u043d\u0433 Nginx error log:<\/p>\n<pre><code>if [type] == 2 {      # \u043f\u0430\u0440\u0441\u0438\u043c error log \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 grok-\u0430     grok {         match => { \"message\" => \"%{YEAR:year}\/%{MONTHNUM:month}\/%{MONTHDAY:day} %{TIME:time} \\[%{LOGLEVEL:level}\\] %{GREEDYDATA:description}\" } # \u0437\u0430\u0434\u0430\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u043e\u0432         add_field => {             \"created_at\" => \"%{year}-%{month}-%{day} %{time}\" # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0435 \u0441 \u0434\u0430\u0442\u043e\u0439 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435             \"uri\" => \"\" # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u043f\u043e\u043b\u044f uri             \"ip\" => \"\" # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u043f\u043e\u043b\u044f ip         }         remove_field => [\"year\", \"month\", \"day\", \"time\", \"message\"] # \u0441\u043d\u043e\u0441\u0438\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u043b\u044f     }      # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Ruby     ruby {         code => '             # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u0442\u0443 \u0432 Timestamp             time = Time.strptime(event.get(\"created_at\"), \"%Y-%m-%d %H:%M:%S\")             event.set(\"datetime\", time.to_time.to_i)              # \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0430             levelNum = 6             levelName = event.get(\"level\")             if (levelName == \"debug\")                 levelNum = 1             elsif (levelName == \"info\")                 levelNum = 2             elsif (levelName == \"notice\")                 levelNum = 3             elsif (levelName == \"warn\")                 levelNum = 4             elsif (levelName == \"error\")                 levelNum = 5             elsif (levelName == \"crit\")                 levelNum = 6             elsif (levelName == \"alert\")                 levelNum = 7             elsif (levelName == \"emerg\")                 levelNum = 8             end              # \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f SSL_do_handshake - \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0442\u0438\u043f \"warn\" (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)             # \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u043d\u0443\u0436\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438             textWarning = \"SSL_do_handshake() failed\"             if (event.get(\"description\").index(textWarning))                 levelNum = 4             end              # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438             event.set(\"level\", levelNum.to_i)         '     } }<\/code><\/pre>\n<p>\u041f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043b\u043e\u0433\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Grok \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435:\u00a0<a href=\"https:\/\/grokdebugger.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/grokdebugger.com<\/a>\u00a0\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a 3 \u0447\u0430\u0441\u0442\u0438 &#8212; \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043b\u043e\u0433\u043e\u0432 Symfony:<\/p>\n<pre><code>if [type] == 3 {     useragent {       source => \"user_agent\"       target => \"useragent\"     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043b\u043e\u0433\u0438 \u0432 \u043f\u0430\u0440\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u043e\u0441\u043e\u0431\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u043e\u0432 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0449\u0443\u044e \u0447\u0430\u0441\u0442\u044c:<\/p>\n<pre><code># \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0435 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0434\u0430\u043b Nginx - \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 mutate {     add_field => {         \"is_static\" => 0     } }  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Ruby ruby {     code => '         # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c URL-\u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430         url = event.get(\"uri\")          isStatic = 0          # \u0435\u0441\u043b\u0438 \u0432 URL-\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0443\u0442\u0438, \u0442\u043e \u0441\u0442\u0430\u0432\u0438\u043c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0444\u0430\u0439\u043b         # \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u0444\u0430\u0439\u043b\u0430 .jpg, .png, etc         if (url.index(\"\/images\/\") or url.index(\"\/css\/\") or url.index(\"\/js\/\"))             isStatic = 1         end          # \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f         event.set(\"is_static\", isStatic)          # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c IP \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         ipVal = event.get(\"ip\")         if (ipVal.length > 0)             ipIntVal = IPAddr.new(ipVal).to_i             if (ipIntVal)                 event.set(\"ip_integer\", ipIntVal)             end         end     ' }  # \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u043b\u044f \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e-\u043f\u0440\u0438\u043d\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0442\u0438\u043f mutate {     remove_field => [\"@version\", \"@timestamp\", \"log\", \"host\", \"datetime_local\", \"user_agent\", \"http_host\", \"created_at\"]     convert => {         \"datetime\" =>\"integer\"         \"status\" => \"integer\"         \"type\" => \"integer\"         \"user_id\" => \"integer\"         \"level\" => \"integer\"         \"is_static\" => \"integer\"         \"ip_integer\" => \"integer\"     } }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0448\u0430 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 logs \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434 (desc logs):<\/p>\n<pre><code>+--------------+--------+----------------+ | Field        | Type   | Properties     | +--------------+--------+----------------+ | id           | bigint |                | | method       | text   | indexed stored | | post         | text   | indexed stored | | description  | text   | indexed stored | | get          | text   | indexed stored | | uri          | text   | indexed stored | | cookie       | text   | indexed stored | | ip           | text   | indexed stored | | http_referer | text   | indexed stored | | datetime     | uint   |                | | user_id      | uint   |                | | is_static    | uint   |                | | level        | uint   |                | | type         | uint   |                | | status       | uint   |                | | req_time     | float  |                | | event        | json   |                | | useragent    | json   |                | | ip_integer   | bigint |                | +--------------+--------+----------------+<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<pre><code>mysql --host=\"10.16.0.1\" -P9306<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043b\u043e\u0433\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0431\u043b\u043e\u043a input \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code>start_position => \"beginning\" sincedb_path => \"\/dev\/null\" mode => \"read\" exit_after_read => \"true\" file_completed_action => \"log\" file_completed_log_path => \"\/dev\/null\"<\/code><\/pre>\n<p>&#8212; \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u043b\u043e\u0433\u0438 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043f\u0443\u0442\u044f\u043c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0432 prod-\u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0431\u0440\u0430\u0442\u044c \u0438 \u043b\u043e\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0431\u0430\u0437\u0443 \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u044b \u043f\u0430\u0447\u043a\u0430\u043c\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f). \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 dev.conf \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"php\">iinput { \u00a0 \u00a0\u00a0file { \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0path => \"\/var\/log\/nginx\/access_json.log\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0codec => \"json\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0type => 1  \u00a0 \u00a0 \u00a0 \u00a0 start_position => \"beginning\" \u00a0 \u00a0 \u00a0 \u00a0 sincedb_path => \"\/dev\/null\" \u00a0 \u00a0 \u00a0 \u00a0 mode => \"read\" \u00a0 \u00a0 \u00a0 \u00a0 exit_after_read => \"true\" \u00a0 \u00a0 \u00a0 \u00a0 file_completed_action => \"log\" \u00a0 \u00a0 \u00a0 \u00a0 file_completed_log_path => \"\/dev\/null\" \u00a0 \u00a0\u00a0}  \u00a0 \u00a0\u00a0file { \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0path => \"\/var\/log\/nginx\/error.log\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0type => 2  \u00a0 \u00a0 \u00a0 \u00a0 start_position => \"beginning\" \u00a0 \u00a0 \u00a0 \u00a0 sincedb_path => \"\/dev\/null\" \u00a0 \u00a0 \u00a0 \u00a0 mode => \"read\" \u00a0 \u00a0 \u00a0 \u00a0 exit_after_read => \"true\" \u00a0 \u00a0 \u00a0 \u00a0 file_completed_action => \"log\" \u00a0 \u00a0 \u00a0 \u00a0 file_completed_log_path => \"\/dev\/null\" \u00a0 \u00a0\u00a0}  \u00a0 \u00a0\u00a0file { \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0path => \"\/var\/log\/*.json\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0codec => \"json\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0type => 3  \u00a0 \u00a0 \u00a0 \u00a0 start_position => \"beginning\" \u00a0 \u00a0 \u00a0 \u00a0 sincedb_path => \"\/dev\/null\" \u00a0 \u00a0 \u00a0 \u00a0 mode => \"read\" \u00a0 \u00a0 \u00a0 \u00a0 exit_after_read => \"true\" \u00a0 \u00a0 \u00a0 \u00a0 file_completed_action => \"log\" \u00a0 \u00a0 \u00a0 \u00a0 file_completed_log_path => \"\/dev\/null\" \u00a0 \u00a0\u00a0} }  filter { \u00a0 \u00a0 if [type] == 1 { \u00a0 \u00a0 \u00a0 \u00a0 mutate { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 add_field => { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"level\" => 2 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"description\" => \"\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 \u00a0 \u00a0 }   \u00a0 \u00a0 \u00a0 \u00a0 useragent { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 source => \"user_agent\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 target => \"useragent\" \u00a0 \u00a0 \u00a0 \u00a0 }   \u00a0 \u00a0 \u00a0 \u00a0 ruby { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 code => ' \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 time = Time.strptime(event.get(\"datetime_local\"), \"%d\/%b\/%Y:%H:%M:%S\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"created_at\", time.strftime(\"%Y-%m-%d %H:%M:%S\")) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"datetime\", time.to_time.to_i)  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 user_id = 0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 id = event.get(\"cookie\").split(\"user_id\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if id[1] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 id = id[1].split(\";\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if id[0] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 user_id = id[0] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end   \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"user_id\", user_id.to_i)  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newArr = [] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 arr = event.get(\"cookie\").split(\";\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (arr) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 for v in arr do \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (v.index(\"user_token=\")) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newArr.append(\"user_token=********\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newArr.append(v.strip) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"cookie\", newArr.join(\"; \")) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newArr = [] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 arr = event.get(\"post\").split(\"&amp;\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (arr) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 for v in arr do \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (v.index(\"password=\")) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newArr.append(\"password=********\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newArr.append(v.strip) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"post\", newArr.join(\"&amp;\")) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ' \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 } else if [type] == 2 { \u00a0 \u00a0 \u00a0 \u00a0 grok { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 match => { \"message\" => \"%{YEAR:year}\/%{MONTHNUM:month}\/%{MONTHDAY:day} %{TIME:time} \\[%{LOGLEVEL:level}\\] %{GREEDYDATA:description}\" } \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 add_field => { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"created_at\" => \"%{year}-%{month}-%{day} %{time}\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"uri\" => \"\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"ip\" => \"\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 remove_field => [\"year\", \"month\", \"day\", \"time\", \"message\"] \u00a0 \u00a0 \u00a0 \u00a0 }   \u00a0 \u00a0 \u00a0 \u00a0 ruby { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 code => ' \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 time = Time.strptime(event.get(\"created_at\"), \"%Y-%m-%d %H:%M:%S\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"datetime\", time.to_time.to_i)  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 6 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelName = event.get(\"level\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (levelName == \"debug\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 1 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"info\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 2 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"notice\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 3 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"warn\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"error\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 5 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"crit\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 6 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"alert\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 7 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 elsif (levelName == \"emerg\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 8 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 textWarning = \"SSL_do_handshake() failed\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (event.get(\"description\").index(textWarning)) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 levelNum = 4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"level\", levelNum.to_i) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ' \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 } else if [type] == 3 { \u00a0 \u00a0 \u00a0 \u00a0 useragent { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 source => \"user_agent\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 target => \"useragent\" \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 }  \u00a0 \u00a0 mutate { \u00a0 \u00a0 \u00a0 \u00a0 add_field => { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"is_static\" => 0 \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 }  \u00a0 \u00a0 ruby { \u00a0 \u00a0 \u00a0 \u00a0 code => ' \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 url = event.get(\"uri\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isStatic = 0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (url.index(\"\/images\/\") or url.index(\"\/css\/\") or url.index(\"\/js\/\")) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isStatic = 1 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"is_static\", isStatic)  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ipVal = event.get(\"ip\") \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (ipVal.length > 0) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ipIntVal = IPAddr.new(ipVal).to_i \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (ipIntVal) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 event.set(\"ip_integer\", ipIntVal) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end \u00a0 \u00a0 \u00a0 \u00a0 ' \u00a0 \u00a0 }  \u00a0 \u00a0 mutate { \u00a0 \u00a0 \u00a0 \u00a0 remove_field => [\"@version\", \"@timestamp\", \"log\", \"host\", \"datetime_local\", \"user_agent\", \"http_host\", \"created_at\"] \u00a0 \u00a0 \u00a0 \u00a0 convert => { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"datetime\" =>\"integer\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"status\" => \"integer\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"type\" => \"integer\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"user_id\" => \"integer\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"level\" => \"integer\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"is_static\" => \"integer\" \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"ip_integer\" => \"integer\" \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 } }  output {     elasticsearch {     \u00a0 \u00a0\u00a0index => \"logs\" \u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0hosts => [\"http:\/\/10.16.0.1:9308\"]         ilm_enabled => false         manage_template => false     } }<\/code><\/pre>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a Logstash<\/h3>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 &#8212; \u0434\u0435\u0440\u0433\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code>bin\/logstash -f config\/dev.conf<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043b\u0438 \u0441 \u043c\u0435\u043b\u043a\u0438\u043c\u0438 \u0432\u0430\u0440\u043d\u0438\u043d\u0433\u0430\u043c\u0438 &#8212; \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u0443 \u0432\u0430\u0441 \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c! \u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code>[ERROR][logstash.outputs.elasticsearch][main][695742b1badd1aa1190ffe91d9c5a02b53122cecdca3eed9bddd3b04385a54f] An unknown error occurred sending a bulk request to Elasticsearch (will retry indefinitely) {:message=> \"no implicit conversion of String into Integer\", :exception=>TypeError, :backtrace=>[\"org\/jruby\/RubyArray.java:1545:in `[]'\"<\/code><\/pre>\n<p>&#8212; \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0431\u0443\u0431\u043d\u0430\u043c\u0438, \u0433\u0434\u0435-\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0435\u0440\u0435\u043a\u043e\u0441 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445. Logstash &#171;\u0449\u0435\u0434\u0440&#187; \u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044f\u0432\u043d\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0443 \u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043d\u043e \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c debug:<\/p>\n<pre><code>bin\/logstash -f config\/dev.conf --debug<\/code><\/pre>\n<p>&#8212; \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0438. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438, \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b. \u0412\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u043e\u0432 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443 &#8212; \u0442\u043e\u0433\u0434\u0430 Logstash \u0438\u0445 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0435\u0442 \u0438 \u0437\u0430\u043f\u0438\u0445\u0430\u0435\u0442 \u0432 Manticore.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e debug \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Logstash-\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON &#8212; \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0443, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0431\u043b\u043e\u043a output:<\/p>\n<pre><code>output {     stdout { codec => json } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<pre><code>[2024-01-10T16:16:14,858][INFO ][logstash.outputs.elasticsearch][main][aa0103e00e254d1acee990db534e801471ed4f45439353671c76bd5c036b126d] Failed to perform request {:message=>\"Broken pipe\", :exception=>Manticore::SocketException, :cause=>#&lt;Java::JavaNet::SocketException: Broken pipe>} [2024-01-10T16:16:14,860][WARN ][logstash.outputs.elasticsearch][main][aa0103e00e254d1acee990db534e801471ed4f45439353671c76bd5c036b126d] Marking url as dead. Last error: [LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError] Elasticsearch Unreachable: [http:\/\/10.16.0.1:9308\/_bulk][Manticore::SocketException] Broken pipe {:url=>http:\/\/10.16.0.1:9308\/, :error_message=>\"Elasticsearch Unreachable: [http:\/\/10.16.0.1:9308\/_bulk [Manticore::SocketException] Broken pipe\", :error_class=>\"LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError\"} [2024-01-10T16:16:14,861][ERROR][logstash.outputs.elasticsearch][main][aa0103e00e254d1acee990db534e801471ed4f45439353671c76bd5c036b126d] Attempted to send a bulk request but Elasticsearch appears to be unreachable or down {:message=>\"Elasticsearch Unreachable: [http:\/\/10.16.0.1:9308\/_bulk][Manticore::SocketException] Broken pipe\", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :will_retry_in_seconds=>4}<\/code><\/pre>\n<p>Logstash \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u0430\u0448 URL, \u043a\u0443\u0434\u0430 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438 10.16.0.1:9308,\u00a0\u0443\u043c\u0435\u0440! \u0410 \u0432\u044b \u0434\u0435\u0440\u0433\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 CURL \u0438 \u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u043e\u043d \u0436\u0438\u0432. \u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438, \u043b\u0438\u0431\u043e \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438\u00a0<a href=\"https:\/\/manticoresearch.com\/blog\/manticoresearch-buddy-intro\/\" rel=\"noopener noreferrer nofollow\">Manticore Buddy<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u00a0manticore-extra. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433:<\/p>\n<pre><code>\/var\/log\/manticore\/searchd.log<\/code><\/pre>\n<p>&#8212; \u0438 \u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u043e \u043d\u0435\u0432\u0435\u0434\u043e\u043c\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0430\u0441\u0442\u044c\u00a0manticore-extra \u0441\u043b\u0435\u0442\u0435\u043b\u0430, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 Buddy \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u0430 \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u0436\u0430\u043b\u043e\u0432\u0430\u043b\u0441\u044f Logstash. \u0424\u0438\u043a\u0441\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439\u00a0manticore-extra:<\/p>\n<pre><code>apt install manticore manticore-extra<\/code><\/pre>\n<p>&#8212; \u0438 \u00a0\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u044b:<\/p>\n<pre><code>systemctl restart manticore<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 Nginx &#8212; \u0432\u044b \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0435 \u0432 \u043b\u043e\u0433\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 POST, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043d\u0435\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0438 \u0444\u0430\u0439\u043b\u044b, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443 Nginx, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 AJAX \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0447\u0442\u043e \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445 \u0440\u0430\u0437\u0434\u0443\u0435\u0442 \u043b\u043e\u0433 \u0434\u043e \u043d\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0432\u0435\u0441\u0438\u0442 \u0438 Logstash &#8212; \u043d\u0435 \u043f\u0440\u0438\u0432\u044b\u043a \u043e\u043d \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u0432\u044b\u043f\u0438\u043b\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e Nginx Access JSON \u043b\u043e\u0433\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0445\u043e\u0441\u0442\u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code>set $isFile 'no'; if ($request_body ~* (--WebKitFormBoundary) ) {     set $isFile 'yes'; }  if ($isFile = 'no') {     access_log \/var\/log\/nginx\/project_access__admin.log main_json; }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c &#171;&#8212;WebKitFormBoundary&#187; \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448 JSON-\u043b\u043e\u0433. \u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043b\u0438\u0431\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Nginx, \u043b\u0438\u0431\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0443\u0436\u0435 \u0432 \u0431\u043b\u043e\u043a\u0435 filter \u0432 \u0441\u0430\u043c\u043e\u043c Logstash.<\/p>\n<p>\u0418 \u0435\u0449\u0435 \u043f\u0430\u0440\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u0417\u0430\u043f\u0443\u0441\u043a Logstash \u0432 \u0444\u043e\u043d\u0435:<\/p>\n<pre><code>bin\/logstash -f config\/dev.conf > \/dev\/null 2>&amp;1 &amp;<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 Logstash:<\/p>\n<pre><code>kill -9 $(pgrep -f logstash)<\/code><\/pre>\n<h3>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u043e\u0432: Kibana, Grafana?<\/h3>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Manticore \u0443\u0434\u043e\u0431\u043d\u043e &#8212; \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SQL-\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0443\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0438 \u043b\u043e\u0433\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0443 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443, \u0434\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u043c\u0430\u043b\u044b\u043c &#8212; \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c UI, \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043b\u043e\u0433\u043e\u0432. \u041c\u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u043f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/262\/2cb\/319\/2622cb319c58d17d1a0b2f7605247c07.png\" alt=\"\u0421\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 UI \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u0438\u0437 Manticore, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 Logstash\" title=\"\u0421\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 UI \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u0438\u0437 Manticore, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 Logstash\" width=\"2880\" height=\"1530\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/262\/2cb\/319\/2622cb319c58d17d1a0b2f7605247c07.png\"\/><\/p>\n<div><figcaption>\u0421\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 UI \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u0438\u0437 Manticore, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 Logstash<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u044f \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043e\u0442\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u043c\u043d\u043e\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 APInita. \u0412 \u0441\u0432\u043e\u0435\u043c \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435 \u044f \u0432\u0438\u0436\u0443 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u043e\u0433\u043e\u0432, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Kibana \u0438\u043b\u0438 Grafana, \u0434\u0435\u043b\u043e \u0432\u043a\u0443\u0441\u0430. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u044d\u0442\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u00a0\u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0431\u044b\u043b \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0432\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/790874\/\"> https:\/\/habr.com\/ru\/articles\/790874\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u044b\u0441\u043b\u044c \u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u043b\u043e\u0433\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u0432 \u043c\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u044f \u0441\u043c\u043e\u0433 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e. \u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u044f\u0445 \u0441\u0432\u044f\u0437\u043a\u0438 Logstash + Manticore + Nginx + Symfony.<\/p>\n<p>\u0412 \u0441\u0435\u0442\u0438 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u043a\u0438 Logstash +\u00a0Elasticsearch, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e Manticore. \u0414\u0430, \u0443 \u0441\u0430\u043c\u043e\u0439 \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u044b \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0446\u0435\u043b\u044b\u0439\u00a0<a href=\"https:\/\/play.manticoresearch.com\/logstash\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e Logstash\/Beats<\/a>, \u043d\u043e \u043a\u0430\u043a \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0434\u0435\u043c\u043a\u0435 \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 &#8212; \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0443\u0442\u0438. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u043d\u0430\u043f\u0438\u0448\u0443.<\/p>\n<p><em>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440: \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u041e\u0421 Linux \u0438 \u0438\u043c\u0435\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Ubuntu 22. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u0432\u044b\u043b\u0438\u0437\u0430\u043d\u043d\u044b\u043c&#187;, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u0430 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043b\u044e\u0431\u043e\u0439 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/em><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Manticore<\/h3>\n<p>\u0412 \u0441\u0430\u043c\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Manticore \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0438 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e\u00a0<a href=\"https:\/\/manticoresearch.com\/install\/\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430<\/a>, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442:<\/p>\n<pre><code>wget https:\/\/repo.manticoresearch.com\/manticore-repo.noarch.deb dpkg -i manticore-repo.noarch.deb apt update apt install manticore manticore-extra<\/code><\/pre>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u044d\u043f, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code>nano \/etc\/manticoresearch\/manticore.conf<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<pre><code>searchd {   listen = 127.0.0.1:9312   listen = 127.0.0.1:9306:mysql   listen = 127.0.0.1:9308:http   log = \/var\/log\/manticore\/searchd.log   query_log = \/var\/log\/manticore\/query.log   pid_file = \/var\/run\/manticore\/searchd.pid   data_dir = \/var\/lib\/manticore }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u0435\u0449\u044c: \u0441\u0430\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d, \u0431\u0430\u0437\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u043b\u043e\u0433\u0438, \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435 \u043e\u0434\u043d\u0430, \u043d\u043e \u0445\u043e\u0441\u0442\u043e\u0432\/\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432\/VPS \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f Logstash, \u0441\u043e\u0431\u0438\u0440\u0430\u044f \u043b\u043e\u0433\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0438\u0445 \u0432 \u043e\u0434\u043d\u0443 \u0431\u0430\u0437\u0443 Manticore (\u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0435 \u0432 \u043e\u0434\u043d\u0443, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f).<\/p>\n<p>\u0427\u0430\u0441\u0442\u043e (\u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430) \u0440\u0430\u0437\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 127.0.0.1 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0445\u043e\u0441\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a010.16.0.1. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0445\u043e\u0441\u0442\u043e\u0432 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438:<\/p>\n<pre><code>searchd {   listen = 10.16.0.1:9312   listen = 10.16.0.1:9306:mysql   listen = 10.16.0.1:9308:http   log = \/var\/log\/manticore\/searchd.log   query_log = \/var\/log\/manticore\/query.log   pid_file = \/var\/run\/manticore\/searchd.pid   data_dir = \/var\/lib\/manticore }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0445\u043e\u0441\u0442\u0435\u00a010.16.0.1 \u0438 \u043f\u043e\u0440\u0442\u0443\u00a09308 \u0443 \u043d\u0430\u0441 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0430 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a \u0441\u0435\u0431\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0445\u043e\u0441\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a010.16.0.2,\u00a010.16.0.3 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 IP \u0430\u0434\u0440\u0435\u0441, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440 \u043f\u043e\u0440\u0442\u0430.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u041c\u0430\u043d\u0442\u0438\u043a\u043e\u0440\u0443:<\/p>\n<pre><code>systemctl start manticore<\/code><\/pre>\n<p>\u041f\u043e\u0442\u044b\u043a\u0430\u0439\u0442\u0435 \u0432 \u043d\u0435\u0435 \u0447\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code>curl 10.16.0.1:9308<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<pre><code>{\"cluster_name\":\"docker-cluster\",\"cluster_uuid\":\"Z7igA6xDRDKCVwnMuyXCOQ\",\"name\":\"4e9d933ebde2\",\"tagline\":\"You Know, for Search\",\"version\":{\"build_date\":\"2019-10-22T17:16:35.176724Z\",\"build_flavor\":\"default\",\"build_hash\":\"fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e\",\"build_snapshot\":false,\"build_type\":\"docker\",\"lucene_version\":\"8.2.0\",\"minimum_index_compatibility_version\":\"6.0.0-beta1\",\"minimum_wire_compatibility_version\":\"6.8.0\",\"number\":\"7.4.1\"}}<\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u0441 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Manticore \u0432\u0441\u0435, \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435, \u0441 \u0441\u0430\u043c\u0438\u043c Logstash-\u0435\u043c.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 Nginx<\/h3>\n<p>\u041e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f Nginx \u043b\u043e\u0433\u043e\u0432 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043b\u043e\u0433\u043e\u0432 &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 JSON. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437\u00a0<a href=\"https:\/\/grokdebugger.com\/\" rel=\"noopener noreferrer nofollow\">Grok<\/a>\u00a0(\u043a \u043d\u0435\u043c\u0443 \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f), \u043d\u043e \u0437\u0430\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 JSON?<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432\u0430\u0448\u0435\u0433\u043e Nginx \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\u00a0\/etc\/nginx\/nginx.conf &#8212; \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u0432\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c JSON-\u0444\u043e\u0440\u043c\u0430\u0442:<\/p>\n<pre><code>nano \/etc\/nginx\/nginx.conf <\/code><\/pre>\n<p>&#8212; \u0432 \u0431\u043b\u043e\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430 http \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code>log_format main_json escape=json '{' \u00a0 \u00a0\u00a0'\"datetime_local\": \"http_host\", ' \u00a0 \u00a0\u00a0'\"ip\": \"request_method\", ' \u00a0 \u00a0\u00a0'\"uri\": \"args\", ' \u00a0 \u00a0\u00a0'\"post\": \"http_cookie\", ' \u00a0 \u00a0\u00a0'\"status\": http_user_agent\", ' \u00a0 \u00a0\u00a0'\"req_time\": http_referer\" ' '}';<\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u043a\u0443\u0441\u0443, \u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e &#171;\u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c&#187; \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 Logstash (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043d\u0430\u0448 \u0445\u043e\u0441\u0442 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u043c\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 &#171;main_json&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code>nano \/etc\/nginx\/sites-available<\/code><\/pre>\n<p>&#8212; \u0432 \u0431\u043b\u043e\u043a\u0435 server \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code>access_log \/var\/log\/nginx\/access_json.log main_json;<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e access log \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u0438 error log &#8212; \u0443 \u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code>error_log \/var\/log\/nginx\/error.log<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Nginx:<\/p>\n<pre><code>systemctl restart nginx<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043b\u043e\u0433\u0438 \u043d\u0430\u0447\u043d\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 &#171;\/var\/log\/nginx\/access_json.log&#187; \u0438 &#171;\/var\/log\/nginx\/error.log&#187; &#8212; \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0436\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 Symfony<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u0435\u043a \u0438 \u043b\u043e\u0433\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u0430\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f &#8212; \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>Symfony \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437\u00a0<a href=\"https:\/\/github.com\/Seldaek\/monolog\" rel=\"noopener noreferrer nofollow\">Monolog Bundle<\/a>\u00a0&#8212; \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442 JSON, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u0432\u0438\u0434\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 JSON, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0432 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0434\u043b\u044f 6 \u0432\u0435\u0440\u0441\u0438\u0438 Symfony. \u0412\u0441\u0435 \u043f\u0443\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u043f\u043a\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u043b\u043e\u0433\u0433\u0435\u0440\u0430:<\/p>\n<pre><code>nano config\/packages\/monolog.yaml<\/code><\/pre>\n<p>&#8212; \u0438 \u0432\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0435\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<pre><code>monolog:   handlers:     main:       type: fingers_crossed       action_level: error       handler: nested       excluded_http_codes: [400, 403, 404]       buffer_size: 50       level: debug     nested:       action_level: error       type: rotating_file       path: \"%kernel.logs_dir%\/%kernel.environment%.json\"       level: debug       formatter: monolog.formatter.custom       max_files: 7     console:       type: console       process_psr_3_messages: false       channels: [\"!event\", \"!doctrine\"]<\/code><\/pre>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u0434\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432 400, 403, 404 &#8212; \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043b\u043e\u0433\u0430 \u043e\u0442 &#171;error&#187;, \u0440\u043e\u0442\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e 7 \u0448\u0442\u0443\u043a. \u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u043a\u0443\u0441\u0443, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code>formatter: monolog.formatter.custom_json<\/code><\/pre>\n<p>&#8212; \u0432 \u043d\u0435\u0439 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043b\u043e\u0433\u043e\u0432, \u0430 \u0442\u0430\u043a \u0436\u0435:<\/p>\n<pre><code>path: \"%kernel.logs_dir%\/%kernel.environment%.json\"<\/code><\/pre>\n<p>&#8212; \u043f\u0443\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441:<\/p>\n<pre><code>nano config\/services.yaml<\/code><\/pre>\n<p>\u0412 \u0431\u043b\u043e\u043a &#171;services&#187; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code>monolog.formatter.custom_json: \u00a0 \u00a0\u00a0class: App\\Service\\CustomJsonFormatter<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 &#8212; \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 &#171;src\/Service\/CustomLogFormatter.php&#187;:<\/p>\n<pre><code class=\"php\">&lt;?php  namespace App\\Service;  use Monolog\\Formatter\\NormalizerFormatter; use Monolog\\LogRecord;  \/**  * Serializes a log message to Logstash Event Format  *\/ class CustomJsonFormatter extends NormalizerFormatter {     \/**      * @var string the name of the system for the Logstash log message, used to fill the @source field      *\/     protected string $systemName;      \/**      * @var string an application name for the Logstash log message, used to fill the @type field      *\/     protected string $applicationName;      \/**      * @var string the key for 'extra' fields from the Monolog record      *\/     protected string $extraKey;      \/**      * @var string the key for 'context' fields from the Monolog record      *\/     protected string $contextKey;      \/**      * @param string      $applicationName The application that sends the data, used as the \"type\" field of logstash      * @param string|\"\" $systemName      The system\/machine name, used as the \"source\" field of logstash, defaults to the hostname of the machine      * @param string      $extraKey        The key for extra keys inside logstash \"fields\", defaults to extra      * @param string      $contextKey      The key for context keys inside logstash \"fields\", defaults to context      *      * @throws \\RuntimeException If the function json_encode does not exist      *\/     public function __construct(string $applicationName = 'app', ?string $systemName = \"\", string $extraKey = 'extra', string $contextKey = 'context')     {         parent::__construct('Y-m-d\\TH:i:s.uP');          $this->systemName = $systemName === \"\" ? (string) gethostname() : $systemName;         $this->applicationName = $applicationName;         $this->extraKey = $extraKey;         $this->contextKey = $contextKey;     }      \/**      * @inheritDoc      *\/     public function format(LogRecord $record): string     {         $recordData = parent::format($record);         $cDate = new \\DateTime();  \u00a0       \/\/ \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432         $message = [             'created_at' => $cDate->format('Y-m-d H:i:s'),             'datetime' => $cDate->getTimestamp(),             'http_host' => isset($_SERVER['HTTP_HOST']) &amp;&amp; $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : \"\",             'uri' => isset($_SERVER['REQUEST_URI']) &amp;&amp; $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : \"\",             'get' => $_GET ? http_build_query($_GET) : \"\",             'post' => $_POST ? http_build_query($_POST) : \"\",             'cookie' => \"\",             'http_referer' => isset($_SERVER['HTTP_REFERER']) &amp;&amp; $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : \"\",             'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) &amp;&amp; $_SERVER['HTTP_USER_AGENT'] ? $_SERVER['HTTP_USER_AGENT'] : \"\",             'ip' => Util::getUserIpAddr(),             'method' => isset($_SERVER['REQUEST_METHOD']) &amp;&amp; $_SERVER['REQUEST_METHOD'] ? $_SERVER['REQUEST_METHOD'] : \"\",             'req_time' => (float) (isset($_SERVER['REQUEST_TIME_FLOAT']) &amp;&amp; $_SERVER['REQUEST_TIME_FLOAT'] ?<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-367086","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/367086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=367086"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/367086\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=367086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=367086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=367086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}