{"id":408471,"date":"2024-06-29T20:11:34","date_gmt":"2024-06-29T20:11:34","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=408471"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=408471","title":{"rendered":"<span>\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 \u0441 \u0412\u041c \u0438\u0437 systemd \u0432 Yandex Cloud Logging<\/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<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5ba\/6f3\/bf7\/5ba6f3bf786acd502595786856f04804.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ba\/6f3\/bf7\/5ba6f3bf786acd502595786856f04804.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u044b\u0445 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u2014 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432. \u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Fluent Bit \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0432 \u0438\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 Yandex Cloud Logging.<\/p>\n<h2>\u0428\u0430\u0433 1. \u041f\u0438\u0448\u0435\u043c \u043b\u043e\u0433\u0438 \u0432 systemd<\/h2>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0447\u044c\u0438\u0445 \u043b\u043e\u0433\u043e\u0432 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u0422\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043a \u0448\u0430\u0433\u0443 2. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Python, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043b\u043e\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Python 3.6 \u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>1. \u0417\u0430\u0432\u0435\u0434\u0451\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u0443\u0434\u0430 \u0441\u043b\u043e\u0436\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b:<\/p>\n<pre><code class=\"bash\">sudo mkdir \/usr\/local\/bin\/logtest cd \/usr\/local\/bin\/logtest<\/code><\/pre>\n<p>2. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b\u00a0logtest.py:<\/p>\n<pre><code class=\"python\">import logging import random import sys import time  from systemdlogging.toolbox import check_for_systemd from systemdlogging.toolbox import SystemdFormatter from systemdlogging.toolbox import SystemdHandler  # \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 `systemdlogging.toolbox.init_systemd_logging` # \u041d\u043e \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0446\u0435\u043b\u044f\u0445 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438.  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u0438 systemd systemd_ok = check_for_systemd()  if systemd_ok:     handler = SystemdHandler()     # syslog_id: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043f\u043e\u043b\u0435 SYSLOG_IDENTIFIER.     handler.syslog_id = ''     handler.setFormatter(SystemdFormatter())      # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043b\u043e\u0433\u0433\u0435\u0440\u0430     logger = logging.getLogger()     logger.addHandler(handler)  else:     # \u0412\u0435\u0442\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 systemd (MacOS, Windows)     logger = logging.getLogger(__name__)     # \u0412\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u043e\u0433\u0438 \u0431\u0443\u0434\u0435\u043c \u0432 STDOUT     handler = logging.StreamHandler(stream=sys.stdout)     handler.setFormatter(logging.Formatter(         '[%(levelname)s] %(code)d %(message)s'     ))     logger.addHandler(handler)  # \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e logger.setLevel(logging.DEBUG)  # \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c URL-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. PATHS = [     '\/',     '\/admin',     '\/hello',     '\/docs', ]  PARAMS = [     'foo',     'bar',     'query',     'search',     None ]   def fake_url():     path = random.choice(PATHS)     param = random.choice(PARAMS)     if param:         val = random.randint(0, 100)         param += '=%s' % val     code = random.choices([200, 400, 404, 500], weights=[10, 2, 2, 1])[0]     return '?'.join(filter(None, [path, param])), code   if __name__ == '__main__':     while True:         # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043a\u043e\u0434 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 URL         path, code = fake_url()         # \u0415\u0441\u043b\u0438 \u043a\u043e\u0434 200, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u0432  \u043b\u043e\u0433 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c Info         # Cloud Logging \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 `context` \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c         # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 `SEVERITY`. \u041e\u043d\u043e \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 journald \u0438 \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 yc-logging.         # \u0412 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 `SystemdHandler`, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c,         # \u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0442\u0430\u043a \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438.         if code == 200:             logger.info(                 'Path: %s',                 path,                 extra={\"code\": code, \"context\": {\"SEVERITY\": \"info\"}},             )         # \u0418\u043d\u0430\u0447\u0435 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c Error         else:             logger.error(                 'Error: %s',                 path,                 extra={\"code\": code, \"context\": {\"SEVERITY\": \"error\"}},             )          # \u0416\u0434\u0435\u043c 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043b\u0438\u0448\u043d\u0435 \u043d\u0435 \u0437\u0430\u0441\u043e\u0440\u044f\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b         time.sleep(1)<\/code><\/pre>\n<p>3. \u0417\u0430\u0432\u0435\u0434\u0451\u043c virtualenv \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"bash\">sudo apt install python3-pip python3.8-venv python -m venv venv  source venv\/bin\/activate pip3 install systemd-logging<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u00a0logtest.sh, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f systemd \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash  SCRIPT_PATH=$(dirname \"$(realpath \"$0\")\") . \"$SCRIPT_PATH\/venv\/bin\/activate\" python \"$SCRIPT_PATH\/logtest.py\"<\/code><\/pre>\n<p>4. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b\u00a0logtest.service\u00a0\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<pre><code class=\"bash\">[Unit] Description=Sample to show logging from a Python application to systemd After=network.target  [Service] Type=simple ExecStart=\/usr\/local\/bin\/logtest\/logtest.sh Restart=on-abort  [Install] WantedBy=multi-user.target<\/code><\/pre>\n<p>5. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u042f \u0431\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Python \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u043e \u0447\u0442\u043e\u0431\u044b systemd \u043d\u0430\u0448\u0451\u043b \u0444\u0430\u0439\u043b, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0443\u0434\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c unit-\u0444\u0430\u0439\u043b\u044b. \u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e systemd (\u0442\u0443\u0442 \u043d\u0430 \u0446\u0435\u043b\u0443\u044e \u043a\u043d\u0438\u0433\u0443 \u0445\u0432\u0430\u0442\u0438\u0442, \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043f\u043e\u0441\u0442\u0430 \u0432 \u0431\u043b\u043e\u0433\u0435) \u2014 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448 \u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0443\u043b\u044f \u0438\u043c\u0435\u0435\u0442 symlink \u0432\u00a0\/etc\/systemd\/system. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">sudo ln -s \"$(pwd)\/logtest.service\" \\   \/etc\/systemd\/system\/logtest.service<\/code><\/pre>\n<p>6. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c systemd:<\/p>\n<pre><code class=\"bash\">sudo systemctl daemon-reload<\/code><\/pre>\n<p>7. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u041a:<\/p>\n<pre><code class=\"bash\">systemctl status logtest.service<\/code><\/pre>\n<p>\u0422\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d, \u043d\u043e \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0435\u043d.<\/p>\n<p>8. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c systemd:<\/p>\n<pre><code class=\"bash\">systemctl start logtest.service<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441, \u0442\u043e \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\u00a0<strong>active (running).<\/strong><\/p>\n<h2>\u0428\u0430\u0433 2. \u0421\u0442\u0430\u0432\u0438\u043c Fluent Bit<\/h2>\n<p>\u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u043c \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d08\/500\/9d6\/d085009d6236a6526eab7c877739c17d.jpeg\" alt=\"\u0418 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u043f\u0442\u0438\u0447\u043a\u0430, \u0442\u0430\u043a \u0432 \u0447\u0451\u043c \u0436\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430?\" title=\"\u0418 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u043f\u0442\u0438\u0447\u043a\u0430, \u0442\u0430\u043a \u0432 \u0447\u0451\u043c \u0436\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430?\" width=\"1400\" height=\"636\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d08\/500\/9d6\/d085009d6236a6526eab7c877739c17d.jpeg\" data-blurred=\"true\"\/><figcaption>\u0418 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u043f\u0442\u0438\u0447\u043a\u0430, \u0442\u0430\u043a \u0432 \u0447\u0451\u043c \u0436\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430?<\/figcaption><\/figure>\n<h3>Fluent Bit vs Fluentd<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438, \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Fluentd. \u041e\u043d \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Ruby \u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432\u044b\u0440\u043e\u0441 \u0432 \u0446\u0435\u043b\u0443\u044e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438 Fluent Bit. \u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6d6\/ab7\/7a2\/6d6ab77a2fcf5141238dfe5ca813dd06.png\" alt=\"https:\/\/docs.fluentbit.io\/manual\/about\/fluentd-and-fluent-bit\" title=\"https:\/\/docs.fluentbit.io\/manual\/about\/fluentd-and-fluent-bit\" width=\"1566\" height=\"892\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6d6\/ab7\/7a2\/6d6ab77a2fcf5141238dfe5ca813dd06.png\"\/><figcaption>https:\/\/docs.fluentbit.io\/manual\/about\/fluentd-and-fluent-bit<\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Fluent Bit \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u0430 Ruby. \u0418 \u0445\u043e\u0442\u044f \u043a \u043d\u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0447\u0435\u043c \u0434\u043b\u044f Fluentd, \u0437\u0430\u0442\u043e \u043e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<h3>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c<\/h3>\n<p>1. \u0414\u043e\u0431\u0430\u0432\u0438\u043c GPG-\u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Fluent Bit.<\/p>\n<pre><code class=\"bash\">$ wget -qO - https:\/\/packages.fluentbit.io\/fluentbit.key | sudo apt-key add -<\/code><\/pre>\n<p>2. \u0412 Ubuntu \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0430\u0439\u043b\u00a0\/etc\/apt\/sources.list\u00a0\u0441\u0442\u0440\u043e\u0447\u043a\u0443:<\/p>\n<pre><code class=\"bash\">deb https:\/\/packages.fluentbit.io\/ubuntu\/focal focal main<\/code><\/pre>\n<p>3. \u0417\u0430\u0442\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b:<\/p>\n<pre><code class=\"bash\">sudo apt-get update<\/code><\/pre>\n<p>4. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e td-agent-bit:<\/p>\n<pre><code class=\"bash\">sudo apt-get install td-agent-bit<\/code><\/pre>\n<p>5. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<pre><code class=\"bash\">sudo service td-agent-bit start<\/code><\/pre>\n<p>6. \u0427\u0442\u043e \u0432\u0441\u0451 \u041e\u041a, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">sudo service td-agent-bit status<\/code><\/pre>\n<p>\u0422\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\u00a0active (running).<\/p>\n<h2>\u0428\u0430\u0433 3. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d<\/h2>\n<p>Fluent Bit \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Go. \u042d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439\u00a0<a href=\"https:\/\/docs.fluentbit.io\/manual\/development\/golang-output-plugins\" rel=\"noopener noreferrer nofollow\">API<\/a>.<\/p>\n<p>1. \u0418\u0442\u0430\u043a, \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0430:<\/p>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/yandex-cloud\/fluent-bit-plugin-yandex.git<\/code><\/pre>\n<p>2. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Go. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\u00a0<a href=\"https:\/\/golang.org\/doc\/install\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>3. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443:<\/p>\n<pre><code class=\"bash\">export fluent_bit_version=1.8.6 export plugin_version=dev CGO_ENABLED=1 go build     -buildmode=c-shared \\   -o .\/yc-logging.so \\   -ldflags \"-X main.PluginVersion=${plugin_version}\" \\   -ldflags \"-X main.FluentBitVersion=${fluent_bit_version}\"<\/code><\/pre>\n<p>4. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443:<\/p>\n<pre><code class=\"bash\">sudo cp yc-logging.so \/usr\/lib\/td-agent-bit\/yc-logging.so<\/code><\/pre>\n<p>5. \u0418 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432\u00a0\/etc\/td-agent-bit\/plugins.conf:<\/p>\n<pre><code class=\"bash\">[PLUGINS]     Path \/usr\/lib\/td-agent-bit\/yc-logging.so<\/code><\/pre>\n<p>6. \u0412\u043d\u043e\u0441\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.\u00a0folder_id\u00a0\u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u043a \u0412\u041c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d service account \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 Yandex Cloud Logging, \u0442\u043e\u00a0authorization\u00a0\u0443\u043a\u0430\u0436\u0438\u0442\u0435 instance-service-account. \u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/yandex-cloud\/fluent-bit-plugin-yandex#configuration-parameters\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<pre><code>[INPUT]     Name  systemd     Tag   host.*     Systemd_Filter  _SYSTEMD_UNIT=logtest.service  [OUTPUT]     Name            yc-logging     Match           *     resource_type   logtest     folder_id       b1g***     message_key     MESSAGE     level_key       SEVERITY     default_level   WARN     authorization   instance-service-account<\/code><\/pre>\n<p>7. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 td-agent-bit:<\/p>\n<pre><code class=\"bash\">sudo systemctl restart td-agent-bit<\/code><\/pre>\n<p>8. \u041e\u0442\u043b\u0438\u0447\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043b\u043e\u0433\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5f4\/449\/8bb\/5f44498bbdea3f166f4bc63c5857d757.png\" alt=\"Yandex Cloud Logging\" title=\"Yandex Cloud Logging\" width=\"2956\" height=\"2166\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f4\/449\/8bb\/5f44498bbdea3f166f4bc63c5857d757.png\"\/><figcaption>Yandex Cloud Logging<\/figcaption><\/figure>\n<p><strong>P.\u00a0S.<\/strong> Yandex Cloud Logging \u2014 \u044d\u0442\u043e serverless-\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 Yandex.Cloud. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 Serverless-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0432\u0441\u0435, \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/t.me\/YandexCloudFunctions\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0432 Telegram<\/a>, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c serverless \u0432 \u0446\u0435\u043b\u043e\u043c. <\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b Fluent Bit \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u0435\u0449\u0451 \u043f\u0440\u043e\u0449\u0435. \u041d\u043e \u043e \u043d\u0435\u0439 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.\u00a0<\/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\/584718\/\"> https:\/\/habr.com\/ru\/articles\/584718\/<\/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<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u044b\u0445 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u2014 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u043b\u043e\u0433\u043e\u0432. \u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Fluent Bit \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0432 \u0438\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 Yandex Cloud Logging.<\/p>\n<h2>\u0428\u0430\u0433 1. \u041f\u0438\u0448\u0435\u043c \u043b\u043e\u0433\u0438 \u0432 systemd<\/h2>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0447\u044c\u0438\u0445 \u043b\u043e\u0433\u043e\u0432 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u0422\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043a \u0448\u0430\u0433\u0443 2. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Python, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043b\u043e\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Python 3.6 \u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>1. \u0417\u0430\u0432\u0435\u0434\u0451\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u0443\u0434\u0430 \u0441\u043b\u043e\u0436\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b:<\/p>\n<pre><code class=\"bash\">sudo mkdir \/usr\/local\/bin\/logtest cd \/usr\/local\/bin\/logtest<\/code><\/pre>\n<p>2. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b\u00a0logtest.py:<\/p>\n<pre><code class=\"python\">import logging import random import sys import time  from systemdlogging.toolbox import check_for_systemd from systemdlogging.toolbox import SystemdFormatter from systemdlogging.toolbox import SystemdHandler  # \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 `systemdlogging.toolbox.init_systemd_logging` # \u041d\u043e \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0446\u0435\u043b\u044f\u0445 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438.  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u0438 systemd systemd_ok = check_for_systemd()  if systemd_ok:     handler = SystemdHandler()     # syslog_id: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043f\u043e\u043b\u0435 SYSLOG_IDENTIFIER.     handler.syslog_id = ''     handler.setFormatter(SystemdFormatter())      # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043b\u043e\u0433\u0433\u0435\u0440\u0430     logger = logging.getLogger()     logger.addHandler(handler)  else:     # \u0412\u0435\u0442\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 systemd (MacOS, Windows)     logger = logging.getLogger(__name__)     # \u0412\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u043e\u0433\u0438 \u0431\u0443\u0434\u0435\u043c \u0432 STDOUT     handler = logging.StreamHandler(stream=sys.stdout)     handler.setFormatter(logging.Formatter(         '[%(levelname)s] %(code)d %(message)s'     ))     logger.addHandler(handler)  # \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e logger.setLevel(logging.DEBUG)  # \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c URL-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. PATHS = [     '\/',     '\/admin',     '\/hello',     '\/docs', ]  PARAMS = [     'foo',     'bar',     'query',     'search',     None ]   def fake_url():     path = random.choice(PATHS)     param = random.choice(PARAMS)     if param:         val = random.randint(0, 100)         param += '=%s' % val     code = random.choices([200, 400, 404, 500], weights=[10, 2, 2, 1])[0]     return '?'.join(filter(None, [path, param])), code   if __name__ == '__main__':     while True:         # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043a\u043e\u0434 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 URL         path, code = fake_url()         # \u0415\u0441\u043b\u0438 \u043a\u043e\u0434 200, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u0432  \u043b\u043e\u0433 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c Info         # Cloud Logging \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 `context` \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c         # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 `SEVERITY`. \u041e\u043d\u043e \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 journald \u0438 \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 yc-logging.         # \u0412 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 `SystemdHandler`, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c,         # \u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0442\u0430\u043a \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438.         if code == 200:             logger.info(                 'Path: %s',                 path,                 extra={\"code\": code, \"context\": {\"SEVERITY\": \"info\"}},             )         # \u0418\u043d\u0430\u0447\u0435 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c Error         else:             logger.error(                 'Error: %s',                 path,                 extra={\"code\": code, \"context\": {\"SEVERITY\": \"error\"}},             )          # \u0416\u0434\u0435\u043c 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043b\u0438\u0448\u043d\u0435 \u043d\u0435 \u0437\u0430\u0441\u043e\u0440\u044f\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b         time.sleep(1)<\/code><\/pre>\n<p>3. \u0417\u0430\u0432\u0435\u0434\u0451\u043c virtualenv \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"bash\">sudo apt install python3-pip python3.8-venv python -m venv venv  source venv\/bin\/activate pip3 install systemd-logging<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u00a0logtest.sh, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f systemd \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash  SCRIPT_PATH=$(dirname \"$(realpath \"$0\")\") . \"$SCRIPT_PATH\/venv\/bin\/activate\" python \"$SCRIPT_PATH\/logtest.py\"<\/code><\/pre>\n<p>4. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b\u00a0logtest.service\u00a0\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<pre><code class=\"bash\">[Unit] Description=Sample to show logging from a Python application to systemd After=network.target  [Service] Type=simple ExecStart=\/usr\/local\/bin\/logtest\/logtest.sh Restart=on-abort  [Install] WantedBy=multi-user.target<\/code><\/pre>\n<p>5. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u042f \u0431\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Python \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u043e \u0447\u0442\u043e\u0431\u044b systemd \u043d\u0430\u0448\u0451\u043b \u0444\u0430\u0439\u043b, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0443\u0434\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c unit-\u0444\u0430\u0439\u043b\u044b. \u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e systemd (\u0442\u0443\u0442 \u043d\u0430 \u0446\u0435\u043b\u0443\u044e \u043a\u043d\u0438\u0433\u0443 \u0445\u0432\u0430\u0442\u0438\u0442, \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043f\u043e\u0441\u0442\u0430 \u0432 \u0431\u043b\u043e\u0433\u0435) \u2014 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448 \u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0443\u043b\u044f \u0438\u043c\u0435\u0435\u0442 symlink \u0432\u00a0\/etc\/systemd\/system. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">sudo ln -s \"$(pwd)\/logtest.service\" \\   \/etc\/systemd\/system\/logtest.service<\/code><\/pre>\n<p>6. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c systemd:<\/p>\n<pre><code class=\"bash\">sudo systemctl daemon-reload<\/code><\/pre>\n<p>7. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u041a:<\/p>\n<pre><code class=\"bash\">systemctl status logtest.service<\/code><\/pre>\n<p>\u0422\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d, \u043d\u043e \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0435\u043d.<\/p>\n<p>8. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c systemd:<\/p>\n<pre><code class=\"bash\">systemctl start logtest.service<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441, \u0442\u043e \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\u00a0<strong>active (running).<\/strong><\/p>\n<h2>\u0428\u0430\u0433 2. \u0421\u0442\u0430\u0432\u0438\u043c Fluent Bit<\/h2>\n<p>\u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u043c \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><figcaption>\u0418 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u043f\u0442\u0438\u0447\u043a\u0430, \u0442\u0430\u043a \u0432 \u0447\u0451\u043c \u0436\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430?<\/figcaption><\/figure>\n<h3>Fluent Bit vs Fluentd<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438, \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Fluentd. \u041e\u043d \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Ruby \u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432\u044b\u0440\u043e\u0441 \u0432 \u0446\u0435\u043b\u0443\u044e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438 Fluent Bit. \u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<figure class=\"full-width\"><figcaption>https:\/\/docs.fluentbit.io\/manual\/about\/fluentd-and-fluent-bit<\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Fluent Bit \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u0430 Ruby. \u0418 \u0445\u043e\u0442\u044f \u043a \u043d\u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0447\u0435\u043c \u0434\u043b\u044f Fluentd, \u0437\u0430\u0442\u043e \u043e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<h3>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c<\/h3>\n<p>1. \u0414\u043e\u0431\u0430\u0432\u0438\u043c GPG-\u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Fluent Bit.<\/p>\n<pre><code class=\"bash\">$ wget -qO - https:\/\/packages.fluentbit.io\/fluentbit.key | sudo apt-key add -<\/code><\/pre>\n<p>2. \u0412 Ubuntu \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0430\u0439\u043b\u00a0\/etc\/apt\/sources.list\u00a0\u0441\u0442\u0440\u043e\u0447\u043a\u0443:<\/p>\n<pre><code class=\"bash\">deb https:\/\/packages.fluentbit.io\/ubuntu\/focal focal main<\/code><\/pre>\n<p>3. \u0417\u0430\u0442\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b:<\/p>\n<pre><code class=\"bash\">sudo apt-get update<\/code><\/pre>\n<p>4. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e td-agent-bit:<\/p>\n<pre><code class=\"bash\">sudo apt-get install td-agent-bit<\/code><\/pre>\n<p>5. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<pre><code class=\"bash\">sudo service td-agent-bit start<\/code><\/pre>\n<p>6. \u0427\u0442\u043e \u0432\u0441\u0451 \u041e\u041a, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">sudo service td-agent-bit status<\/code><\/pre>\n<p>\u0422\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\u00a0active (running).<\/p>\n<h2>\u0428\u0430\u0433 3. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d<\/h2>\n<p>Fluent Bit \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Go. \u042d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439\u00a0<a href=\"https:\/\/docs.fluentbit.io\/manual\/development\/golang-output-plugins\" rel=\"noopener noreferrer nofollow\">API<\/a>.<\/p>\n<p>1. \u0418\u0442\u0430\u043a, \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0430:<\/p>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/yandex-cloud\/fluent-bit-plugin-yandex.git<\/code><\/pre>\n<p>2. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Go. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\u00a0<a href=\"https:\/\/golang.org\/doc\/install\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>3. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443:<\/p>\n<pre><code class=\"bash\">export fluent_bit_version=1.8.6 export plugin_version=dev CGO_ENABLED=1 go build     -buildmode=c-shared \\   -o .\/yc-logging.so \\   -ldflags \"-X main.PluginVersion=${plugin_version}\" \\   -ldflags \"-X main.FluentBitVersion=${fluent_bit_version}\"<\/code><\/pre>\n<p>4. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443:<\/p>\n<pre><code class=\"bash\">sudo cp yc-logging.so \/usr\/lib\/td-agent-bit\/yc-logging.so<\/code><\/pre>\n<p>5. \u0418 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432\u00a0\/etc\/td-agent-bit\/plugins.conf:<\/p>\n<pre><code class=\"bash\">[PLUGINS]     Path \/usr\/lib\/td-agent-bit\/yc-logging.so<\/code><\/pre>\n<p>6. \u0412\u043d\u043e\u0441\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.\u00a0folder_id\u00a0\u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u043a \u0412\u041c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d service account \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 Yandex Cloud Logging, \u0442\u043e\u00a0authorization\u00a0\u0443\u043a\u0430\u0436\u0438\u0442\u0435 instance-service-account. \u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/yandex-cloud\/fluent-bit-plugin-yandex#configuration-parameters\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<pre><code>[INPUT]     Name  systemd     Tag   host.*     Systemd_Filter  _SYSTEMD_UNIT=logtest.service  [OUTPUT]     Name            yc-logging     Match           *     resource_type   logtest     folder_id       b1g***     message_key     MESSAGE     level_key       SEVERITY     default_level   WARN     authorization   instance-service-account<\/code><\/pre>\n<p>7. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 td-agent-bit:<\/p>\n<pre><code class=\"bash\">sudo systemctl restart td-agent-bit<\/code><\/pre>\n<p>8. \u041e\u0442\u043b\u0438\u0447\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043b\u043e\u0433\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442:<\/p>\n<figure class=\"full-width\"><figcaption>Yandex Cloud Logging<\/figcaption><\/figure>\n<p><strong>P.\u00a0S.<\/strong> Yandex Cloud Logging \u2014 \u044d\u0442\u043e serverless-\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 Yandex.Cloud. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 Serverless-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0432\u0441\u0435, \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/t.me\/YandexCloudFunctions\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0432 Telegram<\/a>, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c serverless \u0432 \u0446\u0435\u043b\u043e\u043c. <\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b Fluent Bit \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u0435\u0449\u0451 \u043f\u0440\u043e\u0449\u0435. \u041d\u043e \u043e \u043d\u0435\u0439 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.\u00a0<\/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\/584718\/\"> https:\/\/habr.com\/ru\/articles\/584718\/<\/a><br \/><\/br><\/br><\/p>\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-408471","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/408471","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=408471"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/408471\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=408471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=408471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=408471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}