在AWS上使用Graylog进行日志收集

日志收集对于正确分析生产中的问题至关重要。 必须有一个用于搜索所有服务器上的异常并收到有关异常通知的接口。 好吧,如果您有一台服务器,则当然可以轻松地将其SSH并检查日志,但是对于较大的部署,集中收集日志比记录10台计算机以查找“发生的情况”更可取。

有许多选项可以将其大致分为两组–第三方服务和您要安装的软件。

第三方(如果需要,也可以“基于云”)的日志收集服务包括SplunkLogglyPapertrailSumologic 。 它们非常易于设置,您只需为使用的东西付费。 基本上,您将每条消息(例如,通过自定义的注销附加程序)发送到提供者的端点,然后使用仪表板分析数据。 在许多情况下,这是首选的方式。

但是,在其他情况下,使用第三方服务存储公司特定的数据可能会令公司政策不满意,否则可能会不希望有额外的费用。 在这些情况下,需要花费更多的精力来安装和管理内部日志收集软件。 它们以类似的方式工作,但是实现细节可能有所不同(例如,不是使用带有附加程序的消息将消息发送到目标端点,而是使用某种代理程序的软件收集本地日志并进行汇总)。 开源选项包括GraylogFluentDFlumeLogstash

经过快速研究,我认为Graylog最适合我们的需求,因此以下是对AWS上安装过程的描述(尽管无论基础架构如何,第一部分都适用)。

首先要看的是Graylog提供的即用型映像 ,包括docker,openstack,vagrant和AWS。 不幸的是,AWS版本有两个缺点–它使用Ubuntu,而不是Amazon AMI。 尽管您可能需要重写某些通用脚本,但这并不是一个大问题。 另一个是dealbreaker –启动它时,尽管声称应该运行,但它不会运行Web界面。 仅启动mongodb,elasticsearch和graylog-server。 有2个实例–一个Web,一个用于其他实例会使情况变得复杂,因此我选择了手动安装。

Graylog有两个组件-服务器(用于处理输入,索引和搜索)以及Web界面(用于与服务器通信的漂亮UI)。 Web界面使用mongodb作为元数据,而服务器使用elasticsearch存储传入的日志。 以下是处理安装的bash脚本(CentOS)。 请注意,没有“ sudo”,因为初始化脚本在AWS上以root用户身份执行。

#!/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(自动过期),这样就不会永远存储旧日志。 就是这样

# wait for the index to be created
INDEXES=$(curl --silent "http://localhost:9200/_cat/indices")
until [[ "$INDEXES" =~ "graylog2_0" ]]; do
	sleep 5
	echo "Index not yet created. Indexes: $INDEXES"
	INDEXES=$(curl --silent "http://localhost:9200/_cat/indices")
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将为您提供自动重生。
  • 设置要在实例/ asg的启动配置的UserData中调用的上述脚本(例如,首先从s3获取)
  • 允许UDP端口12201(默认日志记录端口)。 对于实例/ asg安全组(入站),对于应用程序节点安全组(出站),以及作为VPC的网络ACL,都应该发生这种情况。 测试UDP连接 ,以确保它确实通过。 限制对所有源的访问权限,实例除外。
  • 您需要将Graylog服务器实例的私有IP地址传递给所有应用程序节点。 随着私有IP地址的更改,这在AWS上非常棘手。 这就是为什么您需要稳定的东西。 您不能使用ELB(负载平衡器),因为它不支持UDP。 有两种选择:
    • 启动时将弹性IP与节点关联。
  • 或者,您可以在所有节点上(作为代理)安装graylog-server,并将它们指向Elasticsearch集群。 但这比较复杂,可能不是预期的方式
  • 配置您的日志记录框架以将消息发送到graylog。 有标准的GELF(灰色日志格式)附加程序,例如this ,并且您唯一要做的就是使用logback.xml(支持环境变量解析)中的Public DNS环境变量。
  • 您应该使Web界面可以在网络外部访问,因此可以为此使用ELB或上述的循环DNS。 只要确保安全规则严格并且不允许外部篡改日志数据即可。
  • 如果您没有运行Graylog集群(我不会介绍),则单个实例可能会失败。 这不是很大的损失,因为可以从实例中获取日志消息,而且它们都是短暂的。 但是Web界面的元数据很重要-仪表板,警报等。因此定期进行备份(例如使用mongodump)是很好的。 也可以使用EBS卷。
  • 即使您将日志消息发送到集中式日志收集器,也最好保留本地日志,并进行适当的日志轮换和清理。

这不是一个微不足道的过程,但是必须进行日志收集,因此我希望该指南对您有所帮助。

翻译自: https://www.javacodegeeks.com/2015/05/log-collection-with-graylog-on-aws.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值