Сбор журналов имеет важное значение для правильного анализа проблем в производстве. Необходим интерфейс для поиска и уведомления об исключениях на всех ваших серверах. Что ж, если у вас есть один сервер, вы можете легко подключиться к нему по ssh и, конечно, проверить журналы, но для более крупных развертываний централизованный сбор журналов гораздо предпочтительнее, чем регистрация на 10 машинах, чтобы найти «что случилось».
Для этого есть много вариантов, примерно разделенных на две группы — сторонние сервисы и программное обеспечение, которое вы устанавливаете.
Сторонние (или «облачные», если хотите) службы сбора журналов включают Splunk , Loggly , Papertrail , Sumologic . Их очень легко настроить, и вы платите за то, что используете. По сути, вы отправляете каждое сообщение (например, с помощью специального приложения обратного входа) в конечную точку поставщика, а затем используете панель мониторинга для анализа данных. Во многих случаях это будет предпочтительным способом.
В других случаях, однако, политика компании может нарушаться при использовании сторонних сервисов для хранения данных, специфичных для компании, или дополнительные расходы могут быть нежелательны. В этих случаях необходимо приложить дополнительные усилия для установки и управления программным обеспечением для сбора внутренних журналов. Они работают аналогичным образом, но детали реализации могут отличаться (например, вместо отправки сообщений с приложением к целевой конечной точке, программное обеспечение, используя какой-либо агент, собирает локальные журналы и объединяет их). Варианты с открытым исходным кодом включают Graylog , FluentD , Flume , Logstash .
После очень быстрого исследования я решил, что Graylog лучше всего соответствует нашим потребностям, поэтому ниже приведено описание процедуры установки на AWS (хотя первая часть применима независимо от инфраструктуры).
Первое, на что нужно обратить внимание — это готовые к использованию изображения, предоставляемые graylog, в том числе докер, openstack, vagrant и AWS. К сожалению, у версии AWS есть два недостатка — она использует Ubuntu, а не Amazon AMI. Это не большая проблема, хотя некоторые общие сценарии, которые вы используете в вашем стеке, возможно, придется переписать. Другой был нарушитель соглашения — когда вы запускаете его, он не запускает веб-интерфейс, хотя утверждает, что должен. Запускаются только mongodb ,asticsearch и graylog-server. Наличие 2 экземпляров — одного веб-сайта и одного для остальных усложнит ситуацию, поэтому я выбрал ручную установку.
Graylog состоит из двух компонентов — сервера, который обрабатывает ввод, индексирование и поиск, и веб-интерфейса, который представляет собой приятный пользовательский интерфейс, взаимодействующий с сервером. Веб-интерфейс использует mongodb для метаданных, а сервер используетasticsearch для хранения входящих журналов. Ниже приведен скрипт bash (CentOS), который выполняет установку. Обратите внимание, что «sudo» отсутствует, поскольку сценарии инициализации выполняются от имени пользователя root в AWS.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#!/bin/bash # install pwgen for password-generation yum upgrade ca-certificates --enablerepo=epel yum --enablerepo=epel -y install pwgen # mongodb cat > /etc/yum .repos.d /mongodb-org .repo << 'EOT' [mongodb-org] name=MongoDB Repository baseurl=http: //downloads-distro .mongodb.org /repo/redhat/os/x86_64/ gpgcheck=0 enabled=1 EOT yum -y install mongodb-org chkconfig mongod on service mongod start # elasticsearch rpm -- import https: //packages .elasticsearch.org /GPG-KEY-elasticsearch cat > /etc/yum .repos.d /elasticsearch .repo << 'EOT' [elasticsearch-1.4] name=Elasticsearch repository for 1.4.x packages baseurl=http: //packages .elasticsearch.org /elasticsearch/1 .4 /centos gpgcheck=1 gpgkey=http: //packages .elasticsearch.org /GPG-KEY-elasticsearch enabled=1 EOT yum -y install elasticsearch chkconfig --add elasticsearch # configure elasticsearch sed -i -- 's/#cluster.name: elasticsearch/cluster.name: graylog2/g' /etc/elasticsearch/elasticsearch .yml sed -i -- 's/#network.bind_host: localhost/network.bind_host: localhost/g' /etc/elasticsearch/elasticsearch .yml service elasticsearch stop service elasticsearch start # java yum -y update yum -y install java-1.7.0-openjdk update-alternatives -- set java /usr/lib/jvm/jre-1 .7.0-openjdk.x86_64 /bin/java # graylog wget https: //packages .graylog2.org /releases/graylog2-server/graylog-1 .0.1.tgz tar xvzf graylog-1.0.1.tgz -C /opt/ mv /opt/graylog-1 .0.1/ /opt/graylog/ cp /opt/graylog/bin/graylogctl /etc/init .d /graylog sed -i -e 's/GRAYLOG2_SERVER_JAR=\${GRAYLOG2_SERVER_JAR:=graylog.jar}/GRAYLOG2_SERVER_JAR=\${GRAYLOG2_SERVER_JAR:=\/opt\/graylog\/graylog.jar}/' /etc/init .d /graylog sed -i -e 's/LOG_FILE=\${LOG_FILE:=log\/graylog-server.log}/LOG_FILE=\${LOG_FILE:=\/var\/log\/graylog-server.log}/' /etc/init .d /graylog cat > /etc/init .d /graylog << 'EOT' #!/bin/bash # chkconfig: 345 90 60 # description: graylog control sh /opt/graylog/bin/graylogctl $1 EOT chkconfig --add graylog chkconfig graylog on chmod +x /etc/init .d /graylog # graylog web wget https: //packages .graylog2.org /releases/graylog2-web-interface/graylog-web-interface-1 .0.1.tgz tar xvzf graylog-web-interface-1.0.1.tgz -C /opt/ mv /opt/graylog-web-interface-1 .0.1/ /opt/graylog-web/ cat > /etc/init .d /graylog-web << 'EOT' #!/bin/bash # chkconfig: 345 91 61 # description: graylog web interface sh /opt/graylog-web/bin/graylog-web-interface > /dev/null 2>&1 & EOT chkconfig --add graylog-web chkconfig graylog-web on chmod +x /etc/init .d /graylog-web #configure mkdir --parents /etc/graylog/server/ cp /opt/graylog/graylog .conf.example /etc/graylog/server/server .conf sed -i -e 's/password_secret =.*/password_secret = ' $(pwgen -s 96 1) '/' /etc/graylog/server/server .conf sed -i -e 's/root_password_sha2 =.*/root_password_sha2 = ' $( echo -n password | shasum -a 256 | awk '{print $1}' ) '/' /etc/graylog/server/server .conf sed -i -e 's/application.secret=""/application.secret="' $(pwgen -s 96 1) '"/g' /opt/graylog-web/conf/graylog-web-interface .conf sed -i -e 's/graylog2-server.uris=""/graylog2-server.uris="http:\/\/127.0.0.1:12900\/"/g' /opt/graylog-web/conf/graylog-web-interface .conf service graylog start sleep 30 service graylog-web start |
Вы также можете установить TTL (автоматический срок действия) для сообщений, чтобы старые журналы не сохранялись вечно. Вот как
01
02
03
04
05
06
07
08
09
10
|
# wait for the index to be created until [[ "$INDEXES" =~ "graylog2_0" ]]; do sleep 5 echo "Index not yet created. Indexes: $INDEXES" done # set each indexed message auto-expiration (ttl) curl -XPUT "http://localhost:9200/graylog2_0/message/_mapping" -d '{"message": {"_ttl" : { "enabled" : true, "default" : "15d" }}}' |
Теперь у вас все работает на экземпляре. Затем вы должны сделать некоторые специфичные для AWS вещи (если использовать CloudFormation, это будет включать в себя кучу JSON). Вот список:
- у вас может быть либо группа автоматического масштабирования с одним экземпляром, либо один экземпляр. Я предпочитаю ASG, хотя другой немного проще. ASG дает вам авто-возрождение, если экземпляр умирает.
- установите вышеупомянутый скрипт, который будет вызываться в UserData конфигурации запуска экземпляра / asg (например, сначала получая его из s3)
- разрешить UDP-порт 12201 (порт регистрации по умолчанию). Это должно происходить для группы безопасности instance / asg (входящей), для группы безопасности узлов приложения (исходящей), а также в качестве сетевого ACL вашего VPC. Проверьте соединение UDP, чтобы убедиться, что оно действительно проходит. Держите доступ ограниченным для всех источников, кроме ваших экземпляров.
- вам нужно передать частный IP-адрес вашего экземпляра серого журнала всем узлам приложения. Это сложно на AWS, так как частные IP-адреса меняются. Вот почему вам нужно что-то стабильное. Вы не можете использовать ELB (балансировщик нагрузки), потому что он не поддерживает UDP. Есть два варианта:
- Свяжите Elastic IP с узлом при запуске. Передайте этот IP на узлы приложения. Но есть одна загвоздка — если они подключаются к эластичному IP, это будет проходить через NAT (если он у вас есть), и вам, возможно, придется открыть свой экземпляр «миру». Таким образом, вы должны превратить эластичный IP в соответствующий публичный DNS. DNS тогда будет преобразован в частный IP. Вы можете сделать это вручную и взломать:
1
GRAYLOG_ADDRESS=
"ec2-$GRAYLOG_ADDRESS//./-}.us-west-1.compute.amazonaws.com"
или вы можете использовать интерфейс командной строки AWS EC2 для получения сведений об экземпляре экземпляра, с которым связан эластичный IP, а затем с другим вызовом получить свой публичный DNS.
- Вместо использования Elastic IP, который ограничивает вас одним экземпляром, вы можете использовать Route53 (диспетчер DNS AWS). Таким образом, когда запускается экземпляр серого журнала, он может присоединиться к записи route53, что позволяет использовать циклический DNS для нескольких экземпляров Graylog, находящихся в кластере. Управление записями Route53 снова выполняется через интерфейс командной строки AWS. Затем вы просто передаете доменное имя узлам приложений, чтобы они могли отправлять сообщения.
- Свяжите Elastic IP с узлом при запуске. Передайте этот IP на узлы приложения. Но есть одна загвоздка — если они подключаются к эластичному IP, это будет проходить через NAT (если он у вас есть), и вам, возможно, придется открыть свой экземпляр «миру». Таким образом, вы должны превратить эластичный IP в соответствующий публичный DNS. DNS тогда будет преобразован в частный IP. Вы можете сделать это вручную и взломать:
- В качестве альтернативы вы можете установить Graylog-сервер на всех узлах (в качестве агента) и указать их на кластер эластичного поиска. Но это более сложный и, вероятно, не предполагаемый способ сделать это
- настройте свою структуру ведения журнала для отправки сообщений в graylog. Существуют стандартные приложения GELF (формат greylog), например, этот , и единственное, что вам нужно сделать, это использовать переменную среды Public DNS в logback.xml (которая поддерживает разрешение переменных среды).
- Вы должны сделать веб-интерфейс доступным вне сети, чтобы вы могли использовать для этого ELB или циклический DNS, упомянутый выше. Просто убедитесь, что правила безопасности строгие и не допускают внешнего вмешательства в ваши данные журнала.
- Если вы не используете кластер Graylog (о котором я не буду рассказывать), то единственный экземпляр может потерпеть неудачу. Это не большая потеря, поскольку сообщения журналов могут быть получены от экземпляров, и они в любом случае недолговечны. Но важны метаданные веб-интерфейса — информационные панели, оповещения и т. Д. Поэтому рекомендуется регулярно делать резервные копии (например, с помощью mongodump). Использование тома EBS также вариант.
- Даже если вы отправляете свои сообщения журнала в централизованный сборщик журналов, рекомендуется также вести локальные журналы с надлежащей ротацией и очисткой журналов.
Это не тривиальный процесс, но важно иметь сбор журналов, поэтому я надеюсь, что руководство было полезным.
Ссылка: | Сбор журналов С Graylog на AWS от нашего партнера JCG Божидара Божанова в техническом блоге Божо . |