编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

linux基础20课12,日志服务 晓桂科技

wxchong 2024-10-09 21:09:40 开源技术 17 ℃ 0 评论

维护服务器的时候必须懂看日志,要不然无法判断故障出在那里

一. 日志服务

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表