网站首页 > 开源技术 正文
维护服务器的时候必须懂看日志,要不然无法判断故障出在那里
一. 日志服务
1.rsyslog
rhel6叫rsyslog
rhel5叫syslog
# man xinetd.conf
查找log_type
log facility: 用来记录一种类型日志的日志设备
daemon:守护进程相关的消息(内部服务器)
auth:pam产生的日志
authpriv:ssh,ftp等登录信息的验证消息
user:用户程序产生的相关消息
mail:内部邮件服务器相关的消息
lpr:打印服务相关的消息
news:新闻交换网络,基于uucp
uucp:Unix-to-Unix Copy(UNIX至UNIX的拷贝),Email前身
ftp:ftp服务器相关的消息
local0-7:用户自定义的消息 (local7 通常被Cisco和Windows服务器使用)
log level: 日志级别,指定记录日志信息的详细程度
none:None(什么都不记录)
emerg: Emergency(紧急)-0
alert: Alerts (报警)-1
crit: Critical (关键)-2
err: Errors (错误)-3
warn: Warnings (警告)-4
notice: Notification (通知)-5
info: Information (消息)-6 --最常见的级别
debug: Debugging (调试)-7 --调式日志,一般看不懂,不用此级别
--数字表示级别
--上面的级别从上到下,级别是由高到低
符号
. 代表大于或等于此级别
.= 只等于此级别
.! 不等于此级别
syslog的配置的语法格式:
日志设备.(连接符号)日志级别 日志处理方式(action)
小实验
(1). 记录到普通文件或设备文件
# vim /etc/rsyslog.conf
加入一句:
local3.* /dev/pts/0
# logger -p local3.info 'message from logger'
logger 命令用于产生日志
(2). 将日志发送给用户
# vim /etc/rsyslog.conf
加入一句:
local3.* root --多个用户用逗号隔开,*号代表所有用户
# logger -p local3.info 'message from logger'
(3). 忽略,丢弃
# vim /etc/rsyslog.conf
加入一句:
local3.* ~
# logger -p local3.info 'message from logger'
(4). 执行脚本
# vim /etc/rsyslog.conf
加入一句:
local3.* ^/tmp/1.sh --^号后跟可执行脚本或程序的绝对路径
# logger -p local3.info 'message from logger'
chmod +x /tmp/1.sh
# # cat /tmp/1.sh
#!/bin/bash
touch /tmp/abc
# ls /tmp/
例1,把ssh的日志指定记录到/var/log/ssh下,有哪些方法?
第一种:拖管到xinetd下
log_type = file /var/log/ssh
第二种:拖管到xinetd下
log_type = syslog local5 info
然后在/etc/rsyslog.conf里加上一句
local5.info /var/log/ssh
第三种:不拖管到xinetd下,用原来的sshd来做,先停掉xinetd托管的ssh服务
# vim /etc/ssh/sshd_config
SyslogFacility local5
# /etc/init.d/sshd restart
# vim /etc/rsyslog.conf
local5.* /var/log/ssh
# /etc/init.d/rsyslog restart
例2.远程日志 (日志集中化管理)
把多台服务器的日志远程记录到其中一台集中化管理,方便对其统一分析
log server log clinet
10.0.0.2 10.0.0.61
rsyslog <--- rsyslog
要求:把10.0.0.61上的ssh的服务日志,远程记录到10.0.0.2上/var/log/ssh里
所有机器的防火墙和selinux关闭:
# iptables -F
# setenforce 0
第一步:在10.0.0.2上打开远程日志的接收服务端口
# vim /etc/rsyslog.conf
$ModLoad imtcp
$InputTCPServerRun 514 --把这两句打开注释
# /etc/init.d/rsyslog restart
# netstat -ntlup |grep :514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 7295/rsyslogd
tcp 0 0 :::514 :::* LISTEN 7295/rsyslogd
第二步:在10.0.0.61上配置ssh服务的日志远程发送给10.0.0.2
# vim /etc/ssh/sshd_config
SyslogFacility local5
# /etc/init.d/sshd restart
# vim /etc/rsyslog.conf
local5.* @@10.0.0.2:514 --这里是TCP协议的写法,UDP只有一个@
# /etc/init.d/rsyslog restart
第三步:回到10.0.0.2上配置传过来的日志记录到哪个文件里
# vim /etc/rsyslog.conf
local5.* /var/log/ssh
# /etc/init.d/rsyslog restart
测试:都去ssh连接10.0.0.61,然后在10.0.0.2上cat /var/log/ssh可以看到已经有10.0.0.61的日志了。如果有100台日志都传到此文件,怎么区分?
可以看到日志里的有一列是不同的,就是主机名的主机头,所以所有主机都要绑定主机名,并且主机头要不一样就可以了
TCP/UDP传输可以同时开启,不影响远程日志服务器的工作。
2. logrotate
日志轮转,切割,备份,归档
# ls /var/log/ --查看此目录下的日志文件,你可能会看到类似messages-20140724这种名字的日志文件名,这就表示此日志在7月24号轮转过
logrotate是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为“轮转”。我们可以根据日志的大小,或者根据其使用的天数来轮转
logrotate 的执行由crond服务实现。在/etc/cron.daily目录中,有个文件logrotate,它实际上是个shell script,用来启动logrotate。logrotate程序每天由cron在指定的时间(/etc/crontab)启动。
# vim /etc/logrotate.conf
weekly|monthly|daily 每周|每月|每天 --每周轮转一次
rotate 4 --保留四份
create --创建新的日志
#compress --默认是不压缩的
#dateext --轮转的日志文件加时间后缀,这里为了测试方便建议注释掉
include /etc/logrotate.d
/var/log/wtmp {
monthly --表示此文件是每月轮转,而不会用到上面的每周轮转
create 0664 root utmp --轮转的文件的权限,owner,group
minsize 1M --最小1M和每月时间两条件满足,则轮转
rotate 1
}
/var/log/btmp {
missingok --如果日志丢失, 不报错
monthly
create 0600 root utmp
rotate 1
}
# vim /etc/logrotate.d/syslog --这个子配置文件,没有指定的参数都会以默认方式
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts --表示切换时脚本只执行一次
postrotate --表示rotate后执行的脚本
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript --表示脚本结束
}
验证日志轮转:
# logrotate -f /etc/logrotate.conf --用此命令强制轮转方便测试,注意后面一定只能接主配置文件,可以加个v参数查看过程
logrotate -f -v /etc/logrotate.conf
例一:
如果我100台的ssh日志都写到了我这台的/var/log/ssh里,我想对其做日志轮转,怎么做?
vim /etc/logrotate.conf
/var/log/ssh {
monthly
rotate 2
missingok
}
service rsyslog restart
logrotate -f -v /etc/logrotate.conf ---切割日志
ll /var/log/ssh
例二:
讨论一下下面这段的意思
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true --这一句话表示轮转后对rsyslog的pid进行刷新(但pid其实不变)
endscript
sharedscripts
prerotate
轮转前执行脚本
endscript
sharedscripts
postrotate
轮转后执行脚本
endscript
为什么轮转后要做上面的kill -HUP?
先问一个小问题:一个服务它的日志记录到aaa.log,手动mv aaa.log aaa.log.1,然后touch aaa.log,请问新的日志信息会记录到哪个文件里?
答案是它还会记录到aaa.log.1里,因为它还找原来的innode(同分区里mv一个文件innode不变);所以要在做完后去kill -HUP它的pid(有些服务是kill -USR1)
小实验:
# logger -t "哈哈" "你好"
# tail -3 /var/log/messages --默认这条信息在当前的messages里
sharedscripts
postrotate
logger -t "呵呵" "再见"
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
请问这条信息在轮转后在哪个文件里?
messages.1
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
logger -t "呵呵" "再见"
endscript
请问这条信息在轮转后在哪个文件里?
messages
3. logrotate的邮件报警功能
在linux下默认能本机收发邮件,需要把postfix服务启起来(rhel6默认使用postfix,rhel5默认使用sendmail)
# yum install postfix* -y
# /etc/init.d/postfix restart --启动邮件服务
# chkconfig postfix on
# echo "邮件内容" | mail -s "邮件主题" root
# mail -s "邮件主题" root < /etc/fstab
# cat /var/mail/root
/var/log/ssh {
monthly
rotate 2
missingok
mail test
maillast --这表示在轮转之后发一个邮件给test用户,主题会为/var/log/ssh.3,就是man logrotate里指的about-to-expire的文件
}
/var/log/ssh {
monthly
rotate 2
missingok
mail test
mailfirst --这表示在轮转之后发一个邮件给test用户,主题会为/var/log/ssh.1,就是man logrotate里指的just-rotated的文件
}
--上面是默认的两个参数,下面是用自己的方式去实现上面的功能,并且可以自定义邮件正文和主题
/var/log/ssh {
monthly
rotate 2
missingok
sharedscripts
postrotate
echo "ssh轮转成功了.xxxxx" |mail -s "logrotated succeed" test
endscript
}
测试:
ls /tmp/ssh/
cat /var/mail/root
4. 思考题:
如果现在针对ssh服务做日志轮转,要求每两天日志轮转一次,保留所有的日志,并且以时间来对其分类
# touch /etc/sshlogrotate.conf
# vim /etc/sshlogrotate.conf
daily
rotate 4
create
/var/log/ssh {
create 0600 root sshd
sharedscripts
prerotate
mkdir -p /tmp/ssh/`date +%F`
cp -rf /var/log/ssh.* /tmp/ssh/`date +%F`
endscript
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
echo "ssh轮转成功了" | mail -s "logrotated succed" root
endscript
}
# crontab -e
0 2 */2 * * logrotate -f /etc/sshlogrotate.conf
date -s 2016-03-29\ 15:44:20
date -s "2016-03-29 15:44:20"
1,配置服务器对一个服务日志(假设为/var/log/clientssh.log)配置日志轮转,
要求:(1.)配置到/etc/logrotate.conf文件里或者配置到/etc/logrotate.d/目录里的子配置文件
(2.)每天轮转一次
(3.)最多保留4个副本
vim /etc/rsyslog.conf
local5.* /var/log/clientssh.log
:wq
service rsyslog restart ----生成clientssh.log的日志文件
或 touch /var/log/clientssh.log ----不会生成日志
vim /etc/logrotate.d/ssh.conf
/var/log/clientssh.log {
daily ---每日论转一次
dateext ---以日期为后缀
rotate 4 ---保留4份
missingok ---允许丢失日志
create 0600 root root(任意已存在的用户或者属组) 创建文件的权限及属性
}
测试:
logrotate -f /etc/logrotate.d/ssh.conf
ls /var/log/clientssh.log
2,还要要求在对/var/log/clientssh.log的日志轮转之前自动把/var/log/clientssh.log
的最后一个副本(也就是/var/log/clientssh.log.4)文件给cp到/backup/4天前的年/4天前的月/4天前的天.clientssh.log的格式
(比如:今天为2014-07-28,cp的文件名就是/backup/2014/7/24.clientssh.log)
3,并且轮转完成后,发一封邮件通知给root用户,邮件主题和正文内容自定义
# vim /etc/logrotate.conf
/var/log/clientssh.log {
rotate 4
daily
create 0664 root root
sharedscripts
prerotate
mkdir -p /backup/`date -d "-4 days" +%Y`/`date -d "-4 days" +%m`/
cp /var/log/clientssh.log.4 /backup/`date -d "-4 days" +%Y`/`date -d "-4 days" +%m`/`date -d "-4 days" +%d`.clientssh.log
endscript
sharedscripts
postrotate
kill -HUP `cat /var/run/sshd.pid`
echo "日志轮转了" |mail -s 'ssh日志轮转了' root
endscript
}
# date -d "4 days ago" +%d --4天前
# date -d "-4 days" +%d --4天前
# date -d "+4 days" +%d --4天后
# date -d "4 days" +%d --4天后
# date -d "tomorrow" +%d
# date -d "yesterday" +%d
# date -d "4 month" +%m
# date -d "1 year" +%Y
4,上网查询了解一下日志分析,日志合并的方法和概念
日志分析:脚本分析,软件分析(现在对于web日志的分析比较常见,主要的开源软件有awstats,weblizer)
还有一些服务也可以分析,比如系统自带的logwatch可以分析/var/log/下面的日志,并发邮件;或者比如oracle数据也有日志巡检工具
# yum install logwatch -y
# rpm -qa |grep logwatch
logwatch-7.3.6-49.el6.noarch
# rpm -qc logwatch-7.3.6-49.el6.noarch
/etc/logwatch/conf/ignore.conf
/etc/logwatch/conf/logwatch.conf
/etc/logwatch/conf/override.conf
# vim /usr/share/logwatch/default.conf/logwatch.conf
# cat /usr/share/logwatch/default.conf/logwatch.conf |grep -v '#' |grep -v ^$
LogDir = /var/log --日志目录
TmpDir = /var/cache/logwatch
MailTo = root --发邮件
MailFrom = Logwatch
Print =
Range = yesterday --分析日志的日期
Detail = Low --详细程度
Service = All
mailer = "sendmail -t"
# /etc/init.d/postfix restart
# logwatch
# cat /var/mail/root
日志合并:追加,排序(sort)
# cat 1.txt
1
3
5
7
# cat 2.txt
8
4
9
# cat 3.txt
6
10
2
# sort -n -o 4.txt 1.txt 2.txt 3.txt
猜你喜欢
- 2024-10-09 IBM Cloud Pak for Business Automation安装之部署OpenShift
- 2024-10-09 NBA 季后赛上脚合集!格林这双鞋,恐怕要火!
- 2024-10-09 黑客教你如何Web漏洞快速挖掘思路以及实操(1)
- 2024-10-09 Mac好用软件推荐(mac中好用的软件)
- 2024-10-09 Nginx从安装到高可用,一篇搞定(nginx安装教程)
- 2024-10-09 各大站长不可忽略的日常安全隐患(站长的安全生产职责)
- 2024-10-09 9Linux系统管理之Linux系统日志文件分析
- 2024-10-09 如何实现网站访问量的统计(统计网页访问量)
- 2024-10-09 LoadRunner性能测试:基础理论梳理
- 2024-10-09 一次Linux系统被骇客入群后的分析过程
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)