场景描述:一个Web应用,前端设置了8个具有相同配置的Tomcat服务器,跑在Nginx反向代理后。每个Tomcat服务器运行在一个虚拟机上,要求能对Tomcat服务器的访问日志汇总存储并提供一定的分析能力。
需要的开源软件:Logstash和Elasticsearch。通过在各个虚拟机上安装Logstash收集Tomcat的日志数据,并存储在Elasticsearch中达到日志集中收集和分析的目的。
过程有两个步骤:
一、配置Tomcat的日志存储格式。编辑Tomcat目录下serverxml,填写如下内容
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- Access log processes all example
Documentation at: /docs/config/valvehtml
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="orgapachecatalinavalvesAccessLogValve" directory="logs" prefix="localhost_access_log" suffix="txt" pattern="%h %l %u %t "%r" %s %b %D "%{Referer}i" "%{User-Agent}i"" />
</Host>
directory表示访问日志存储在Tomcat的logs目录中。
prefix表示日志文件名以localhost_access_log开头。
suffix表示日志文件名以txt截尾。
pattern="%h %l %u %t "%r" %s %b %D "%{Referer}i" "%{User-Agent}i""
pattern这一句非常重要,用于表示日志的存储格式,一般为了方便会使用common或者combined,这两种自定义格式已经可以记录足够详细的信息,我这里使用了自定义方式。在这个pattern描述里:
%h表示访问来源的主机名或者IP地址;
%l表示客户端的标示,通常是 -;
%u表示得到了授权的访问者标示,通常都是 -;
%t表示日志事件的发生时间戳,用 [ 和 ] 括起来的;
"%r"表示用双引号"括起来的访问命令和链接,比如“GET /resource/logopng”;
%s表示>
%b是服务器返回的数据量,以字节为单位;
%D表示服务器的响应时间,可以用于分析页面的执行效率;
"%{Referer}i"表示用两个双引号括起来的网址,用于告诉服务器这个访问请求是从哪个页面链接过来的;
"%{User-Agent}i"表示用双引号括起来的浏览器的>
二、配置Logstash
1、在每个虚拟机上传logstash安装文件,安装logstash,以222版本为例
rpm -ivh logstash-222-1noarchrpm
2、创建Logstash的工作目录
mkdir /root/logstash_work_dir;mkdir /root/logstash_work_dir/config;mkdir /root/logstash_work_dir/logs;mkdir /root/logstash_work_dir/pid
其中/root/logstash_work_dir是工作目录,config目录用于存储Logstash的配置文件,logs目录用于存储Logstash的日志数据,pid目录用于存储Logstash的pid文件。
3、设置Logstash的运行脚本,修改/etc/initd/logstash中,替换其中的代码如下
LS_WORK_DIR=/root/logstash_work_dir
name=logstash
LS_USER=root
LS_GROUP=root
LS_HOME=/var/lib/logstash
LS_HEAP_SIZE="1g"
pidfile=${LS_WORK_DIR}/pid/$namepid
LS_LOG_DIR=${LS_WORK_DIR}/logs
LS_LOG_FILE=${LS_WORK_DIR}/logs/$namelog
LS_CONF_DIR=${LS_WORK_DIR}/config/root_tomcatconf
LS_OPEN_FILES=16384
LS_NICE=19
LS_OPTS=""
LS_USER和LS_GROUP指定了Logstash进程运行时的用户名和组,我这里使用了root,也可以使用其他权限更低的一般用户和组。
LS_CONF_DIR=${LS_WORK_DIR}/config/root_tomcatconf这一句最重要,指定了Logstash服务运行时的配置文件路径。
4、在/root/logstash_work_dir/config/目录中编写Logstash的配置文件root_tomcatconf,这是本系统最重要的文件。
input {
file {
path => "/root/tomcat/logs/localhost_access_logtxt"
sincedb_path => "/root/logstash_work_dir/config/sincedb_apache_access_logtxt"
type => "apache_access_log"
add_field => {"tomcatip" => "101281861"}
}
}
filter{
if [type] == "apache_access_log" {
grok{
match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{>
}
date{
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["writetime"]
}
mutate {
convert => {
"response" => "integer"
"bytes" => "integer"
"responsetime" => "integer"
}
}
}
}
output {
if [type] == "apache_access_log" {
elasticsearch {
hosts => ["101281874:9200","101281875:9200","101281877:9200"]
index => "logstash-apacheaccesslog-%{+YYYYMMdd}"
}
}
}
Logstash的配置文件包括input、filter和output三部分。
input部分,使用了file插件。path指定了Logstash扫描的文件,每当有文件变化时,Logstash会读取文件尾部新增的数据;sincedb_path用于存储上一次文件读取的位置信息,如果这个文件不存在,则会从日志文件首部获取所有数据;type用于对这个配置插件做标识,当一个配置文件中有多个数据收集任务时尤其有用;add_field用于标识本机的ip地址,当数据存储在Elasticsearch后,用于区分来自哪一个Tomcat服务器。
filter插件,使用了grok、date和mutate三个插件。
grok插件用于解析Tomcat的访问日志,logstash自带了COMBINEDAPACHELOG等多个配置模式,但由于我使用了自定义的Tomcat日志配置,这里也自己编写;
date部分用于从日志中提取时间戳信息;
mutate中用convert将response、byte和responsetime三个解析得到的字符串转化为整数integer类型,这个步骤对于后续的分析比较重要,因为这样可以在Elasticsearch中做数值比较运算。
output插件,使用了elasticsearch插件,其中hosts指定了Elasticsearch集群的地址,本例子中指定了三个实例;index指定了数据存储在Elasticsearch中的索引名字,以logstash作为开头是因为Logstash自带的针对ELasticsearch的mapping映射中,对于所有的字符串类型都附带设置了一个raw不做解析的设置,这样便于在Elasticsearch中做底层的文本检索。
5、设置chkconfig的启动命令
chkconfig --add logstash
6、启动Logstash服务
service logstash start
日志记录的是,我们 *** 作系统或某个服务或某个软件在运行过程当中所产生事件信息的,这对于我们后续分析系统比较有价值。
比如,某个服务在运行过程中出现故障了,就可以查看该服务的日志信息,分析日志找出服务出现故障的原因所在。
如:我们使用yum工具安装软件,系统都会把程序yum做的 *** 作记录到日志里。
如果,我们管理的不是一台主机,每台主机的日志信息都是单独存放的,如果要分析报告当前所有主机的的所有服务的过去某一时间段运行状态,我们则要逐一查看每一台主机的日志文件了。这很不方便。不利于使用一些日志分析工具来分析日志。所以我们要做日志的集中化存储。意思是说:把所有主机产生日志信息发往日志服务器,由日志服务器帮助众多需要存储日志数据的主机存储日志数据。
存储日志数据有两种方式:
1、使用文件存储日志数据
2、把日志信息存储到数据库里
网络设备、系统及服务程序等,在运作时都会产生一个叫log的事件记录;每一行日志都记载着日期、时间、使用者及动作等相关 *** 作的描述。
Windows网络 *** 作系统都设计有各种各样的日志文件,如应用程序日志,安全日志、系统日志、Scheduler服务日志、FTP日志、>
1、华为Mate手机系列开启ROOT权限方法,进入 手机系列手机“设置”界面,在此就可以找到“安全”项点击进入。
2、从-华为Mate手机系列“安全”界面中,可以看到“ROOT权限”项,如图所示,在此直接点击“ROOT权限”项进入。
3、接着当打开-华为Mate手机系列“系统权限开放说明”界面中,勾选“我同意以上内容”项,点击“开启ROOT”按钮。
4、将d出如图所示的-华为Mate手机系列“身份验证”窗口,在此需要输入Flyme账户以完成身份验证 *** 作。
5、开启-华为Mate手机系列系统中的超级权限后,就可以在“ROOT管理”界面中,对应用申请的Root权限进行管理了。
6、除以上开启-华为Mate手机系列系统ROOT权限的方法外,我们也可以通过ROOT工具或手机助手来获取Flyme6系统ROOT权限。百度搜索下载相关ROOT工具。
7、运行相关-华为Mate手机系列ROOT工具,同时开启手机USB调试开关,并将手机与电脑进行连接,在ROOT界面中点击“一键ROOT”按钮,根据提示进行 *** 作即可获取手机ROOT权限。
参考资料
百度经验百度经验[引用时间2017-12-20]
本文主要聚焦 kafka 的日志存储以及日志清理相关。
首先我们来看一张 kafak 的存储结构图。
如上图所示、kafka 中消息是以主题 topic 为基本单位进行归类的,这里的 topic 是逻辑上的概念,实际上在磁盘存储是根据分区存储的,每个主题可以分为多个分区、分区的数量可以在主题创建的时候进行指定。例如下面 kafka 命令创建了一个 topic 为 test 的主题、该主题下有 4 个分区、每个分区有两个副本保证高可用。
分区的修改除了在创建的时候指定。还可以动态的修改。如下将 kafka 的 test 主题分区数修改为 12 个
分区内每条消息都会被分配一个唯一的消息 id,也就是我们通常所说的 offset, 因此 kafak 只能保证每一个分区内部有序性,不能保证全局有序性。
如果分区设置的合理,那么所有的消息都可以均匀的分布到不同的分区中去,这样可以实现水平扩展。不考虑多副本的情况下,一个分区对应一个 log 日志、如上图所示。为了防止 log 日志过大,kafka 又引入了日志分段(LogSegment)的概念,将 log 切分为多个 LogSegement,相当于一个巨型文件被平均分配为相对较小的文件,这样也便于消息的维护和清理。事实上,Log 和 LogSegement 也不是纯粹物理意义上的概念,Log 在物理上只是以文件夹的形式存储,而每个 LogSegement 对应于磁盘上的一个日志文件和两个索引文件,以及可能的其他文件(比如以"txindex"为后缀的事务索引文件)。
kafak 中的 Log 对应了一个命名为<topic>-<partition> 的文件夹。举个例子、假如有一个 test 主题,此主题下游 3 个分区,那么在实际物理上的存储就是 "test-0","test-1","test-2" 这三个文件夹。
向 Log 中写入消息是顺序写入的。只有最后一个 LogSegement 才能执行写入 *** 作,在此之前的所有 LogSegement 都不能执行写入 *** 作。为了方便描述,我们将最后一个 LogSegement 成为"ActiveSegement",即表示当前活跃的日志分段。随着消息的不断写入,当 ActiveSegement 满足一定的条件时,就需要创建新的 activeSegement,之后在追加的消息写入新的 activeSegement。
为了便于消息的检索,每个 LogSegement 中的日志文件(以"log" 为文件后缀)都有对应的两个文件索引:偏移量索引文件(以"index" 为文件后缀)和时间戳索引文件(以"timeindex"为文件后缀)。每个 LogSegement 都有一个“基准偏移量” baseOffset,用来标识当前 LogSegement 中第一条消息的 offset。偏移量是一个 64 位的长整形。日志文件和两个索引文件都是根据基准偏移量(baseOffset)命名的,名称固定为 20 位数字,没有达到的位数则用 0 填充。比如第一个 LogSegment 的基准偏移量为 0,对应的日志文件为 00000000000000000000log
示例中第 2 个 LogSegment 对应的基准位移是 256,也说明了该 LogSegment 中的第一条消息的偏移量为 256,同时可以反映出第一个 LogSegment 中共有 256 条消息(偏移量从 0 至 254 的消息)。
由于 kafak 是把消息存储 在磁盘上,为了控制消息的不断增加我们就必须对消息做一定的清理和压缩。kakfa 中的每一个分区副本都对应的一个 log 日志文件。而 Log 又分为多个 LogSegement 日志分段。这样也便于日志清理。kafka 内部提供了两种日志清理策略。
按照一定的保留策略直接删除不符合条件的日志分段。
我们可以通过 broker 端参数 logcleanuppolicy 来设置日志清理策略,此参数的默认值为“delete”,即采用日志删除的清理策略。如果要采用日志压缩的清理策略,就需要将 logcleanuppolicy 设置为“compact”,并且还需要将 logcleanerenable(默认值为 true)设定为 true。通过将 logcleanuppolicy 参数设置为“delete,compact”,还可以同时支持日志删除和日志压缩两种策略。日志清理的粒度可以控制到主题级别,比如与 logcleanuppolicy 对应的主题级别的参数为 cleanuppolicy,为了简化说明,本文只采用 broker 端参数做陈述。
日志删除任务会检查当前日志文件中是否有保留时间超过设定的阈值(retentionMs)来寻找可删除的日志分段文件集合(deletableSegments),如图下图所示。retentionMs 可以通过 broker 端参数 logretentionhours、logretentionminutes 和 logretentionms 来配置,其中 logretentionms 的优先级最高,logretentionminutes 次之,logretentionhours 最低。默认情况下只配置了 logretentionhours 参数,其值为 168,故默认情况下日志分段文件的保留时间为 7 天。
查找过期的日志分段文件,并不是简单地根据日志分段的最近修改时间 lastModifiedTime 来计算的,而是根据日志分段中最大的时间戳 largestTimeStamp 来计算的。因为日志分段的 lastModifiedTime 可以被有意或无意地修改,比如执行了 touch *** 作,或者分区副本进行了重新分配,lastModifiedTime 并不能真实地反映出日志分段在磁盘的保留时间。要获取日志分段中的最大时间戳 largestTimeStamp 的值,首先要查询该日志分段所对应的时间戳索引文件,查找时间戳索引文件中最后一条索引项,若最后一条索引项的时间戳字段值大于 0,则取其值,否则才设置为最近修改时间 lastModifiedTime
若待删除的日志分段的总数等于该日志文件中所有的日志分段的数量,那么说明所有的日志分段都已过期,但该日志文件中还要有一个日志分段用于接收消息的写入,即必须要保证有一个活跃的日志分段 activeSegment,在此种情况下,会先切分出一个新的日志分段作为 activeSegment,然后执行删除 *** 作。
删除日志分段时,首先会从 Log 对象中所维护日志分段的跳跃表中移除待删除的日志分段,以保证没有线程对这些日志分段进行读取 *** 作。然后将日志分段所对应的所有文件添加上“deleted”的后缀(当然也包括对应的索引文件)。最后交由一个以“delete-file”命名的延迟任务来删除这些以“deleted”为后缀的文件,这个任务的延迟执行时间可以通过 filedeletedelayms 参数来调配,此参数的默认值为 60000,即 1 分钟。
日志删除任务会检查当前日志的大小是否超过设定的阈值(retentionSize)来寻找可删除的日志分段的文件集合(deletableSegments),如下图所示。retentionSize 可以通过 broker 端参数 logretentionbytes 来配置,默认值为-1,表示无穷大。注意 logretentionbytes 配置的是 Log 中所有日志文件的总大小,而不是单个日志分段(确切地说应该为log 日志文件)的大小。单个日志分段的大小由 broker 端参数 logsegmentbytes 来限制,默认值为 1073741824,即 1GB。
基于日志大小的保留策略与基于时间的保留策略类似,首先计算日志文件的总大小 size 和 retentionSize 的差值 diff,即计算需要删除的日志总大小,然后从日志文件中的第一个日志分段开始进行查找可删除的日志分段的文件集合 deletableSegments。查找出 deletableSegments 之后就执行删除 *** 作,这个删除 *** 作和基于时间的保留策略的删除 *** 作相同
以上就是关于logstash怎么收集tomcat日志全部的内容,包括:logstash怎么收集tomcat日志、用什么数据库存储访问日志做分析比较好、保存日志是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)