rsyslog是一个进程,是一个命令。管理日志的。–》系统日志记录器
它有一个配置文件:/etc/rsyslog.conf
自己创建日志时,要修改该配置文件。
日志的作用:
- 用于记录系统、程序运行中发生的各种事件;
- 通过阅读日志,有助于诊断和解决系统故障
日志文件的分类:
- 内核及系统日志
- 由系统服务rsyslog统一进行管理,日志格式基本相似
- 用户日志
- 记录系统用户登录及退出系统的相关信息
- 程序日志
- 由各种应用程序独立管理的日志文件,记录格式不统一
日志记录的一般格式:
时间标签 主机名 子系统名 消息字段
/var/log –》此目录下有很多的日志文件。
eg:tailf /var/log/cron –》监听cron命令的日志文件的末尾五行。
相应的应用程序独立进行管理的日志文件:
- Web服务:/var/log/httpd/
- access_log、error_log
- 代理服务:/var/log/squid/
- access.log、cache.log、squid.out、store.log
- FTP服务:/var/log/xferlog
等等
保存了用户登录、退出等信息的日志文件:
- /var/log/lastlog:最近的用户登录事件
- /var/log/wtmp:用户登录、注销及系统开、关机事件
- /var/run/utmp:当前登录的每个用户的详细信息
- /var/log/secure:与用户验证相关的安全性事件
用户登录分析:
- who、w、user、last、ac、lastlog等命令,其中:
- last 最近登录系统的用户;
- lastlog 查看所有的用户的登录信息
日志分析工具:
- 文本查看、grep过滤检索、Webmin管理套件中查看
- awk、sed等文本过滤、格式化编辑工具
- Webalizer、Awstats等专用日志分析工具
- 其他市面上的商业日志分析工具等
syslog系统日志
syslog系统日志/etc/syslog.conf
由系统服务syslogd 统一管理:
- 软件包:sysklogd-1.4.1-29.2
- 主要程序:/sbin/klogd、/sbin/syslogd
- 系统日志的配置文件:/etc/syslog.conf
(设备类别.日志级别 消息发送到的文件)
(像cron级别的日志文件,都写到/var/log/cron里面去。)
设备类别[连接符]日志级别:
- . 记录大于等于后面的级别日志
- .=只记录等于后面的级别日志
- .!=只记录不等于后面的级别日志
消息发送位置:
- 本地文件:通常就是文件的绝对路径
- 打印机:例如 /dev/lp0 这个打印机装置
- 用户名称:显示给用户
- 远程主机:例如 @202.100.100.1
- *:所有在线的人
系统日志保存位置:默认为/var/log目录下
主要日志文件介绍:
- 内核及公共消息日志:/var/log/messages
- 计划任务日志:/var/log/cron
- 系统引导日志:/var/log/dmesg
- 邮件系统日志:/var/log/maillog
- 错误登录日志:/var/log/faillog
用户运行过的进程分析工具:
- accton、lastcomm
- sa:报告、清理和维护进程统计文件。
例子:
# accton /var/account/pacct --》启用统计
# lastcomm --user root --》查看统计
lastcomm root pts/2 0.00 secs Thu Jul 28 21:22
lastcomm root pts/2 0.00 secs Thu Jul 28 21:22
accton S root pts/2 0.00 secs Thu Jul 28 21:22
#accton --》关闭统计
- 1
- 2
- 3
- 4
- 5
- 6
PS:
配置文件和程序的关系:
配置文件为程序传递参数,告诉程序要做什么,或者哪些做,哪些不做等信息。
日志消息的级别loglevel(记住!)
- 0 EMERG(紧急):会导致主机系统不可用的情况 emergencies(零,最严重!!)
- 1 ALERT(警告):必须马上采取措施解决的问题 alert
- 2 CRIT(严重):比较严重的情况 critical
- 3 ERR(错误):运行出现错误 error
- 4 WARNING(提醒):可能会影响系统功能的事件
- 5 NOTICE(注意):不会影响系统但值得注意
- 6 INFO(信息):一般信息 information
- 7 DEBUG(调试):程序或系统调试信息等
- 8 none 没有优先级,不记录任何日志消息。
日志的设备类型:SyslogFacility
- mail 邮件日志
- cron 计划任务日志
- authpriv 用户认证时产生的日志,如login命令、su命令。
- local0–local7 由自定义程序使用。
- news 网络新闻传输协议(nntp)产生的消息。
- user 用户进程。
- kern 系统内核消息。 kernel
- daemon 某些守护
/var/log/下面的日志文件
- messages —>默认情况下会记录所有的日志信息
- secure —》安全认证相关的日志(ssh、useradd、passwd)
- dmesg —》系统在启动的过程中加载了那些内核模块的信息,对一些硬件的识别加载的驱动等信息。kernel启动的过程中的信息
- boot.log —》启动系统的过程之中出现的问题和正常的情况
- maillog —》与发邮件相关的日志
- lastlog —》记录最近登录过系统的用户的信息 last
- cron —》计划任务
- httpd —》独立的目录,记录httpd进程产生相关的日志
- nginx —》独立的目录,记录nginx进程产生的相关的日志
- mysqld.log —》mysql的日志
- yum.log —》yum的日志
- xferlog —-》ftp的日志
- wtmp —》lastlog 查看所有的用户的登录信息
主动记录日志工具:logger:从命令行直接向系统日志文件写入一行信息
# ping -c2 172.16.70.7|logger -i(ping命令的pid号)-t (信息)"This is a test" -p authpriv.info(设备类型)
# tail -5 /var/log/secure
Jul 28 21:26:20 localhost This is a test[5623]: 64 bytes from 172.16.70.7: icmp_seq=2 ttl=64 time=0.178 ms
Jul 28 21:26:20 localhost This is a test[5623]:
Jul 28 21:26:20 localhost This is a test[5623]: --- 172.16.70.7 ping statistics ---
Jul 28 21:26:20 localhost This is a test[5623]: 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
Jul 28 21:26:20 localhost This is a test[5623]: rtt min/avg/max/mdev = 0.166/0.172/0.178/0.006 ms
- 1
- 2
- 3
- 4
- 5
- 6
- 7
自己写脚本实现记录日志的功能
①修改 /etc/rsyslog.conf 文件
在#Save boot messages also to boot.log下面添加东西。
②刷新服务#service rsyslog restart
(刷新rsyslog服务后,就会发现在/var/log/下面出现了shell_monitor.log文件!)
(但是里面没有东西!)
③脚本的内容
#vim /var/log/monitor.sh
if service httpd status &>/dev/null
then
echo "httpd is running"|logger -t(信息) "httpd01_server"-p(设备类型号) local6.info
(把echo的内容传递给logger)
else
service httpd start &>/dev/null
echo "httpd is star"| logger -t "httpd01_server" -p local6.info
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
④#bash monitor.sh #执行脚本
#cat shell_monitor.log #查看自己定义的日志文件
- 1
(发现里面有内容了!)(输出的时候,先显示-t的,再显示前面echo的内容)
日志轮转功能 logrotate
方便有效的管理日志,防止日志文件过大
日志轮转命令:logrotate
日志轮转主要配置文件:/etc/logrotate.conf
- 配合一个配置文件,再加上计划任务,每天执行一次来达到循环的效果;
- 好处:总保留最近最新的日志。
日志轮转主要配置文件:/etc/logrotate.conf (主配置文件)
# cat /etc/logrotate.conf |grep -v ^#|grep -v ^$ (删除注释行和空行)
--》查看日志轮转配置文件的内容
weekly --》每周一次
rotate 4 --》保留4个备份的日志文件
create --》创建新的空的日志文件
dateext --》以日期做后缀
include /etc/logrotate.d --》次要配置文件都存放在次目录下
/var/log/wtmp { --》(单独针对wtmp的)
monthly
create 0664 root utmp --》创建文件的时候,指定权限和属组、属主
minsize 1M --》大于1M才轮转日志
rotate 1 --》保留1个备份日志
}
/var/log/btmp { --》针对btmp的
missingok --》如果某文件没丢失,做什么
monthly
create 0600 root utmp
rotate 1
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
PS:
没有单独的日志文件,在轮转的时候,参考/etc/logrotate.conf里面的配置。
同时如果有单独的日志文件,但是里面有些配置没有,也会参考主配置文件里的内容。—》单独配置文件里没有的配置项,参考主配置文件公共的配置项,建议写到主配置文件里,各个日志文件根据自身的特点,可以单独写一些配置。
日志轮转是怎么实现的?
日志轮转,依赖cron计划任务的每天执行的任务来完成轮转的。
系统把日志轮转的脚本logrotate放在/etc/cron.daily目录下:
mysqld日志轮转文件
#vim /etc/logrotate.d/mysqld
- 1
vim /etc/rsyslog.conf
①local6.* /var/log/mysqld.log
- 指定目录的日志设备类型是local6
- 消息级别是,记录到/var/log/mysqld.log
- 主要是告诉rsyslog进程去记录,至于mysqld进程是否采用rsyslog进程去记录日志,取决于mysqld进程。
- mysqld进程也许没有采用rsyslog进程去帮助记录日志,它自己有独立的进程去实现日志的记录功能。
②#service rsyslog restart –》刷新服务,让配置文件生效。
#vim httpd
/var/log/httpd/*log { --》指定轮转的日志文件,具体如何轮转,看大括号里的内容!
missingok --》日志文件不存在的时候,继续进行,不报错。
notifempty --》若日志文件为空,不轮转(not if empty)
sharedscripts --》配合prerotate和postrotate使用
delaycompress --》推迟压缩
postrotate --》轮转后执行下面的命令
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
多个日志文件使用一套轮转方法:
内核及公共消息日志:/var/log/messages
计划任务日志:/var/log/cron
邮件系统日志:/var/log/maillog
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP cat /var/run/syslogd.pid 2>/dev/null
2>/dev/null || true
endscript
}
#
#########怎么让日志轮转(全)
①(添加设备类型、消息级别和消息发送目录到)/etc/rsyslog.conf
local6.info /var/log/liupeng
②刷新服务#service rsyslog restart
③日志脚本的内容:(脚本放在哪里都行)
#cat /lianxi/liupeng.sh
#!/bin/bash
if service mysqld status &>/dev/null
then
echo "mysqld is running~"|logger -it "mysqld is started!" -p local6.info
(这是输出的内容,也会写到日志) (这是写到日志的内容)
else
service httpd start &>/dev/null
echo "mysqld is start"|logger -it "mysqld start for you!" -p local6.info
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
#bash /lianxi/liupeng.sh
- 1
(执行脚本后,会看到在/var/log/liupeng.log文件里面生成了内容。)
④进入/etc/logrorate目录,添加轮转日志配置文件liupeng:
#cd /etc/logrotate.d
#vim liupeng
/var/log/liupeng.log { --》指定轮转的日志文件,具体如何轮转,看大括号里的内容!
rotate 4 --》保留4个
weekly --》每周轮转一次
create --》创建新的空的日志文件
dateext --》以日期做后缀
missingok --》日志文件不存在的时候,继续进行,不报错。
notifempty --》若日志文件为空,不轮转(not if empty)
sharedscripts
prerorate
轮转之前执行的命令
endscript
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
⑤#logrotate -vf /etc/logrotate.conf (-f 强制轮转)
–》轮转自己写的日志。
PS:
- man 5 logrotate.conf –》man 5 配置文件:看这个配置文件里的所有功能
- prerorate:轮转前需要做的事情;
- postrorate:轮转后需要做的事情。
练习:自己编写脚本实现记录日志功能:
1.监控httpd、yum、mysql服务,如果服务正在运行写入到日志文件,如果服务没有运行也写入到日志文件,然后启动服务
2.日志文件的名字自己定义.例如:/var/log/liupeng_monitor.log
3.让日志文件每个星期轮转一次,保留4个文件,在轮转之前将要删除的日志文件复制到/backup目录下。
[root@liupeng lianxi]# cat log_monitor.sh --》主脚本
#!/bin/bash
###########配置rsyslog文件
if ! egrep "local6" /etc/rsyslog.conf &>/dev/null
then
echo "local6.* /var/log/liupeng_monitor.log" >>/etc/rsyslog/conf
echo "local6.alert *" >>/etc/rsyslog.conf --》如果接收到local6这种设备类型,消息级别为alert,给所有人发送(屏幕输出)!
service rsyslog restart
fi
###########监控功能
monitor(){
if service $1 status &>/dev/null
then
echo "$1_STATUS_CLEAR" | logger -it "$1_STATUS" -p local6.info
else
echo "$1_NOT_RUNNING" | logger -it "$1_SERVICE_DOWN" -p local6.notice
<span class="hljs-keyword">if</span> ! service <span class="hljs-variable">$1</span> restart &>/dev/null
<span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$1_CAN_NOT_RESTART</span>"</span> | logger -it <span class="hljs-string">"<span class="hljs-variable">$1_SERVICE_ERROR</span>"</span> -p local6.alert
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$1_RUNNING_AGAIN</span>"</span> | logger -it <span class="hljs-string">"<span class="hljs-variable">$1_STATUS_CLEAR_NOTICE</span>"</span> -p local6.notice
<span class="hljs-keyword">fi</span>
fi
}
###########本地yum是否存在
local_yum_monitor(){
yum clean all &>/dev/null
if yum list &>/dev/null
then
echo “YUM_STATUS_CLEAR” | logger -it “YUM_STATUS” -p local6.info
else
echo “YUM_STATUS_ERROR” | logger -it “YUM_STATUS_WRONG” -p local6.alert
bash yum_install.sh
fi
}
###############日志轮转
my_lograte(){ --》日志轮转
[ -d /backup ]||mkdir /backup
if ! [ -f /etc/logrotat.d/monitor ]
then
echo
“/var/log/liupeng_monitor.log {
rotate 4
weekly
dateext
create
prerotate
/bin/cp -n /var/log/liupeng_monitor.log-* /backup/
–》-n选项:若存在,则不再覆盖!
endscript
}” >/etc/logrotate.d/monitor
fi
}
if [ -f ./monitor.conf ]
then
conf=(cat ./monitor.conf |egrep -v <span class="hljs-string">"#|^$|^yum"</span>
)
for i in
c
o
n
f
[
@
]
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
k
e
y
w
o
r
d
"
>
d
o
<
/
s
p
a
n
>
m
o
n
i
t
o
r
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{conf[@]}</span> <span class="hljs-keyword">do</span> monitor <span class="hljs-variable">
conf[@]</span><spanclass="hljs−keyword">do</span>monitor<spanclass="hljs−variable">i &
done
if cat ./monitor.conf|egrep “^yum_check=1$” &>/dev/null
then
local_yum_monitor
fi
else
echo -e “#[SERVICE_NAME]\nhttpd\nmysqld\n#[YUM]\nyum_check=1” > monitor.conf
fi
my_lograte
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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
[root@liupeng lianxi]# cat monitor.conf --》供选择的服务
#[SERVICE_NAME]
httpd
mysqld
#[YUM]
yum_check=1
- 1
- 2
- 3
- 4
- 5
- 6
[root@liupeng lianxi]# cat yum_install.sh --》安装yum服务
#!/bin/bash
#local_yum_install
repos="/etc/yum.repos.d"
local_yum(){
cat >$repos/local.repo <<EOF
[local_yum]
name=local_yum
baseurl=file:///mnt
gpgcheck=0
enabled=1
EOF
read -p "请确认光盘已经放入光驱中,按任意建继续 ..."
mount /dev/cdrom /mnt &>/dev/null
case $? in
0)
yum clean all &>/dev/null
yum update && echo "本地yum源配置成功!"
;;
32)
yum clean all &>/dev/null
echo "光盘已经挂载!"
;;
*)
echo "请放入光盘!"
;;
esac
}
if [ -d $repos/bak ]
then
if [ -f $repos/local.repo ]
then
rm -f $repos/local.repo
local_yum
else
local_yum
fi
else
mkdir $repos/bak
mv $repos/*.repo $repos/bak
local_yum
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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
</div><div><div></div></div>
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-d7a94ec6ab.css" rel="stylesheet">
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-49037e4d27.css" rel="stylesheet">
</div>