日志分析
1.Linux日志分析
由系统进程rsyslogd统一管理系统日志
-
rsyslogd服务配置文件解析
-
主配置文件为/etc/rsyslog.conf分为以下三个单元
格式:$ModLoad module-name(在/lib64/rsyslog中模块注意不用添加.so),在开启日志服务器时需要加载UDP或TCP、imuxsock,imjounal、imklog、immark以及手动添加以下模块连接数据库
$Modload ommysql *.* :ommysql:localhost,Syslog,rsyslog,123456
$IncludeConfig /etc/rsyslog.d/*conf
包含所有的配置文件,可在主目录下设置额外的配置文件
格式:
facility.priority target
-
facility:表示产生日志的设备
- auth -pam即认证和授权相关的命令
- authpriv: —ssh,ftp等登录信息的验证信息非授权信息
- cron 事件计划类相关的日志
- kern 内核日志
- lpr 打印
- mail 邮件日志
- user 用户程序产生的相关日志
-
prority:表示日志级别
- 0 EMEKG(紧急):会导致主机系统不可用情况。
- 1 ALEKKT(警告):必须马上采取措施解决的问题。
- 2 CRIT(严重):比较严重的情况。
- 3 ERR(错误):运行出现错误。
- 4 WARNING(提醒):可能会影响系统功能的事件。
- 5 NOTICE(注意):不会影响系统但值得注意。
- 6 INFO(信息):一般信息。
- 7 DEBUG(调试):程序或系统调试信息等。
日志消息级别:(级别数字越小,事件越严重)
-
连接符号
- .XXX :大于等于xxx级别的信息
- .=xxx等于xxx级别的信息
- .!xxx 表示在 xxx之外的等级的信息
-
target:表示日志存放的地方
实列:cron.* /var/log/cron
:将所有级别的定时任务日志都保存在/var/log/cron目录下
-
-
内核及系统日志
- 连接日志(登录日志)
/var/log/wtmp
,/var/log/utmp
- 内核及公共消息日志: /var/log/messagess
- 计划任务日志:/var/log/cron
- 系统引导日志:/var/log/dmesg
- 邮件系统日志:/var/log/maillog
- 用户登录日志:(wtmp和utmp日志无法直接打开,可通过相应命令打开)
/var/log/lastlog
:最后登录的日志/var/log/secure
:管理用户的操作日志/var/log/wtmp
:登录和退出用户的信息记录(last,ac来调用)/var/log/utmp
:当前登录的用户的信息记录(who,w(可以看到用户正在做什么),users,finger调用此文件)/var/log/btmp
:记录用户错误登录尝试 last -f btmp查看/var/log/auth.log
:需要身份确认的操作
- 连接日志(登录日志)
-
程序日志
- web服务:
/var/log/httpd
- 代理服务:
/var/log/squid
- ftp服务:
/var/log/xferlog
- 分析工具:webalizer,awstats
- web服务:
-
日志管理策略
-
及时做好备份和归档
-
延长日志保存期限
-
控制日志访问权限
-
⭐集中管理日志
- 配置日志服务器数据库:
cd/usr/share/doc/rsyslog-7.4.7
- mysql -u root -p <mysql-createDB.sql>
- grant all on Syslog.* to rsyslog@localhost identified by ‘123456’;
- flush privileges;
- 编辑配置文件
vim /
etc/rsyslog.conf将需要的上述配置文件中服务器配置打开 - systemctl restart rsyslog.service
- setenforce 0
- 配置客户端
- vim /etc/rsyslog.conf:添加:
*.* @172,16,8,100:514
- 重启日志服务器:systemctl restart rsyslog.service
- 编辑/etc/bashrc将客户端执行的所有命令写入到系统日志/var/log/messages中,在文档末尾添加
export PROMPT_COMMAND=’{ msg=$(history 1 | { read x y; echo KaTeX parse error: Expected 'EOF', got '}' at position 4: y; }̲);logger"[euid=(whoami)]": ( w h o a m i ) : [ ‘ p w d ‘ ] " (who am i):[`pwd`]" (whoami):[‘pwd‘]"msg"; }’
-
source /etc/bashrc
-
安装loganalyzer
- 配置日志服务器数据库:
-
2.windows日志分析
-
windows系统日志
- system.evtx:包含系统进程,设备磁盘活动等,记录设备驱动,硬件,重复ip等行为 `%systemroot%/system32/config/SecEvent.EVT``
- security.evtx:包含安全性相关的时间,如用户注销,登录登时间
- application.evtx:程序相关的事件
%systemroot%/system32/config/AppEvent.EVT
-
应用程序及服务日志
- Microsoft :记录包含200多个微软内置的事件日志分类,只有部分开启记录功能,如远程桌面客户端,无线网络,有线网络,设置安装等
- office :OAerts,evtx
- windows powershell :windows powershell,evtx
- internet explorer :ie浏览器的日志信息:internet Exploer.evtx
- FTP日志默认位置:%systemroot%/system32/logfiles/msftpsvc1/
- www默认日志位置:%systemroot%/system32/logfiles/w3svc1/
- scheduler:%systemroot%/schedlgu.txt
windows 日志分析工具:logparse,logparseLizard
-
常见windows日志事件ID说明
3.web/os日志及日志工具
- Appache日志分析
- 查看apache的进程数:ps -aux |grep httpd
- 分析当天的ip连接数:cat access_log | grep “10/sep/2017”|awk ‘{print $1}’ |sort | uniq -c |sort -nr
- 分析指定ip在当然访问了什么url:cat access.log | grep “目标ip” |awk ‘{print $7}’ |sort | uniq -c
- 分析访问前十的url: cat access_log | grep “10/Dec/2017” | awk ‘{print $7}’ | sort | uniq -c | sort -nr | head -n 10
- 看到指定的ip究竟干了什么:cat access_log | grep 1.1.1.1 | awk ‘{print $1"\t"$8}’ | sort | uniq -c | sort -nr | less
- 查看访问次数最多的几个分钟(找到热点):awk ‘{print $4}’ default-access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
- 分析TCP连接状态:netstat -ant |awk ‘{print $6}’|sort|uniq -c |sort -rn
- netstat -n | awk ‘/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}’
- netstat -n | awk ‘/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}’
- netstat -n | awk ‘/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}’
- netstat -n |awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn
- netstat -ant | awk ‘{print $NF}’ | grep -v ‘[a-z]’ | sort | uniq -c
- 查找请求数请20个IP(常用于查找攻来源):
- netstat -anlp|grep 80|grep tcp|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -n20
- netstat -ant |awk ‘/:80/{split($5,ip,"?;++A[ip[1]]}END{for(i in A) print A[i],i}’ |sort -rn|head -n20
- 用tcpdump嗅探80端口的访问看看谁最高:tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." ‘{print $1"."$2"."$3"."$4}’ | sort | uniq -c | sort -nr|head -20
- 查找较多time_wait连接:netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20
- 找查较多的SYN连接:netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more
- 根据端口列进程:netstat -ntlp | grep 80 | awk ‘{print $7}’ | cut -d/ -f1
- 获得访问前10位的ip地址
- cat access.log|awk ‘{print $1}’|sort|uniq -c|sort -nr|head -10
- cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}
- 访问次数最多的文件或页面,取前20 cat access.log|awk ‘{print $11}’|sort|uniq -c|sort -nr|head -20
- 列出传输最大的几个exe文件(分析下载站的时候常用) cat access.log |awk ‘($7~/.exe/){print $10 " " $1 " " $4 " " $7}’|sort -nr|head -20
- 列出输出大于200000byte(约200kb)的exe文件以及对应文件发生次数 cat access.log |awk ‘($10 > 200000 && $7~/.exe/){print $7}’|sort -n|uniq -c|sort -nr|head -100
- 如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面 cat access.log |awk ‘($7~/.php/){print $NF " " $1 " " $4 " " $7}’|sort -nr|head -100
- 列出最最耗时的页面(超过60秒的)的以及对应页面发生次数 cat access_log |awk ‘($NF > 60 && $7~/.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
- 列出传输时间超过 30 秒的文件 cat access_log |awk ‘($NF > 30){print $7}’|sort -n|uniq -c|sort -nr|head -20
- 统计网站流量( G) cat access_log |awk ‘{sum+=$10} END {print sum/1024/1024/1024}’
- 统计404的连接 awk ‘($9 ~/404/)’ access_log | awk ‘{print $9,$7}’ | sort
- 统计http status. cat access_log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' cat access_log |awk ‘{print $9}’|sort|uniq -c|sort -rn
4.Mariadb日志分析
除了二进制日志外,其他日志都是文本文件,日志文件通过存储在MariaDB数据库的数据目录下,默认情况下,只启动了错误日志功能,其他 3类日志都需要数据库管理员进行设置
-
二进制日志
-
二进制日志主要记录数据库的变化情况,通过二进制日志可以查询MariaDB数据库中进行了哪些改变,一般大小体积上限为1G,默认情况下,二进制功能时关闭的
-
开启
vim /etc/my.cnf
[mysqld]
log-bin=dir/file_name
其中dir是存放目录,file_name是二进制日志存放的名字,格式为file_name.number,number格式是000001,000002等,每次MariaDB重新启动后,都会生成一个新的文件,二进
制日志与数据库的数据文件最好不要在同一块硬盘,这样,即使数据库文件所在的磁盘损坏,也可以使用另一个硬盘上的二进制日志来恢复数据库文件 -
查询是否开启:进入数据库后进行查询
show global variables like “%log_bin%”
-
查看二进制日志:mysqlbinlog file_name
-
删除二进制日志:二进制日志会记录大量的信息,如果长时间不清理二进制日志,将会浪费磁盘空间,删除二进制的方式如下
- 删除所有二进制日志:登录MariaDB数据库后使用reset master命令
- 根据日志标号删除日志:登录MariaDB数据库后使用purge master logs to’file_name.number’;命令删除number以前的日志
- 根据时间删除日志:登录MariaDB数据库后使用 purge master logs to ‘yyyy-mm-ddhh:MM:ss’;删除设定时间之前生成的日志
-
二进制日志其他设置:(配置文件中)
- binlog_cache_size =32768 #Cache是MariaDB 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域
- binlog_stmt_cache_size= 32768 #当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句
- sync_binlog =10 #设定多久同步一次二进制日志至磁盘文件中, 0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次
- expire_log_days ={0…99} #设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能
- 查看二进制日志:
- MariaDB [(none)]> show binary logs; #显示当前服务器使用的二进制文件及大小
- MariaDB [(none)]> show master logs; #显示主服务器使用的二进制文件及大小
- MariaDB [(none)]> show master status; #当前使用的二进制文件及所处位置
- MariaDB [(none)]> flush logs; #滚动日志,注意: flush logs一般只会滚动中继日志和二进制日志。
- MariaDB [(none)]> show binlog events\G #查看所有的二进制信息
-
-
错误日志
-
错误日志:记录了mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息,默认为开启的
-
定义错误日志,在配置文件中添加:
Log_error=DIR/[filename]
-
删除错误日志:只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的日志方式如下
mv [old_file] [new_file]
mysqladmin flush-logs
-
-
通用日志查询
默认情况下查询日志是关闭的.由于查询日志会记录用户的所有操作,其
中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不
必要的磁盘IO,会影响mysql的性能的.如若不是为了调试数据库的目的建议不要-
开启查询日志.查看查询日志是否开启:(注意输出文件目录MySQL是否有权限读写)
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE ‘%log%’; 显示结果:
general_log | OFF #定义查询日志是否开启
general_log_file | /mydata/data/stu18.log #定义查询日志的文件地址名称
log | OFF #是否开启日志 (若开启则表示开启所有的日志功能)
log_output | FILE #日志的输出的位置 -
开启:
vim /etc/my.cnf
general_log=ON
general_log_file=dir/file_name
-
-
慢查询日志
用来记录执行时间超过指定时间的查询语句.通过慢查询日志,可以查找出哪些查询语句的执行效率很
低,以便进行优化.一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的
查询语句.可以帮助我们定位性能问题的。-
查询:
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE ‘%log%’; 显示结果:
slow_query_log | OFF #定义慢查询日志的
slow_query_log_file |www-slow.log #输出方式为file(文件)时定义慢查询日志的位置 -
开启:
通过配置文件my.cnf中的log-slow-queries选项可以开启慢查询日志;形式如下
[mysqld]
slow_query_log=1
log-slow-queries [= DIR/[filename] ]
或通过登录mysql服务器直接定义
MariaDB [(none)]>set global slow_query_log=1;
MariaDB [(none)]> set session long_query_time=0.001; #更改时间(当前session中,退出则重置)
MariaDB [(none)]> set global long_query_time=0.001; #更改时间(全局中,重启服务则重置)
MariaDB [(none)]> SHOW VARIABLES LIKE ‘long%’; #查询定义时间
MariaDB [(none)]> show global variables like “%slow%”; #查看慢查询日志开启状态
-
-
事务日志
事务日志(InnoDB特有的日志)可以帮助提高事务的效率.使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘.事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多.事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘.目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘.如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据.具有的恢复方式则视存储引擎而定
5.tomcat 日志分析
-
对应日志的配置文件:/conf/logging.proterties
-
日志等级:sever(最高等级)—warning—info—config—fine—finer—finest
-
五种分类
-
catalina
- 输出级别catalina.org.apache.juli.FileHandler.level = FINE
- 输出位置catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
- 输出前缀catalina.org.apache.juli.FileHandler.prefix = catalina.
- catalina.out 标准输出和标准出错,所有输出到者两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,我们需要借助其他工具进行切割(注意: catalina.out文件如果过大会影响)
- catalina.{yyyy-MM-dd}.log是tomcat自动生成的日志,主要是应用出书画未处理的异常,最终被tomcat捕获的日志,它和catalina.out是里面的内容是不一样的
-
localhost
- 输出级别:localhost.org.apache.juli.FileHandler.level = FINE
- 输出位置:localhost.org.apache.juli.FileHandler.directory =${catalina.base}/logs
- 输出前缀:localhost.org.apache.juli.FileHandler.prefix = localhost.
- localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter,servlet)未处理的异常最后被tomcat捕获而输出的日志,它也是包含tomcat的启动和暂停时的运行日志,但它没有catalina.2018-09-19.log 日志全。它只是记录了部分日志
- localhost_access_log.2018-09-19.txt: 这个是访问tomcat的日志,请求时间和资源,状态码都有记录。
-
manager
-
admin
-
host-manager
-
-
tomcat日志切割
-
logrotate切割
-
编辑tomcat目录bin下的catalina.sh文件
org.apache.catalina.startup.Bootstrap “ @ " s t a r t > > " @" start \ >> " @"start >>"CATALINA_OUT” 2>&1 &
第一处: tomcat是带“-security”参数的启动,
第二处:默认tomcat启动方式,也就是else下面的那部分,我们只修改这里。
另外还要把touch “$CATALINA_OUT"这行注释掉。
-
-
log4j切割
-
根目录下建立:common/class/log4j.properties
log4j.rootLogger=INFO, R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/tomcat.newlog #设定日志文件名
log4j.appender.R.MaxFileSize=100KB #设定文件到100kb即分割
log4j.appender.R.MaxBackupIndex=10 #设定日志文件保留的序号数
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n -
在tomcat根目录下的common/lib下加入log4j.jar和commons-logging.jar即可
-
重启tomcat即可
-
-
使用cronolog分割tomcat的catalina.out文件
-
编辑.sh文件,并放到tomcat下的bin目录,在cron中自动执行
#!bin/bash
cddirmap $0
d=date +%Y%m%d
d7=date -d'7 day ago' + %Y%m%d
cd …/logs/
cp catalina.out catalina.out. d e c h o " " > c a t a l i n a . o u t r m − r f c a t a l i n a . o u t . {d} echo "" > catalina.out rm -rf catalina.out. decho"">catalina.outrm−rfcatalina.out.{d7}
-
-
6.nginx 日志分析
-
访问日志:access.log
配置文件:/etc/nginx/nginx.conf,可修改日志显示 log_format main '$server_name $remote_addr $remote_user [$time_local] "$request" ' '$status $uptream_status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';
- 字段说明:
- $server_name:虚拟主机名称。
- $remote_addr:远程客户端的IP地址。
- $remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白
- [$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01+0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时
- $request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
- $status:记录请求返回的http状态码,比如成功是200。
- $uptream_status: upstream状态,比如成功是200
- $upstream_addr:后端服务器的IP地址
- $upstream_status:后端服务器返回的HTTP状态码
- $body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
- $http_referer:记录从哪个页面链接访问过来的。
- $http_user_agent:客户端浏览器信息
- KaTeX parse error: Double subscript at position 7: http_x_̲forwarded_for:客…remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
- $ssl_protocol: SSL协议版本,比如TLSv1。
- $ssl_cipher:交换数据中的算法,比如RC4-SHA。
- $upstream_addr: upstream的地址,即真正提供服务的主机地址。
- $request_time:整个请求的总时间。
- $upstream_response_time:请求过程中, upstream的响应时间。
- 字段说明:
-
错误日志:error.log
- 错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定
- error_log path(存放路径) level(日志等级)path含义同access_log, level表示日志等级,具体如下:[ debug | info | notice | warn | error | crit ]从左至右,日志详细程度逐级递减,即debug最详细, crit最少。
- error_log logs/error.log info; 需要注意的是: error_log off并不能关闭错误日志,而是会将错误日志记录到一个文件名为off的文件中。 正确的关闭错误日志记录功能的方法如下:
- error_log /dev/null;表示将存储日志的路径设置为“垃圾桶”。