1、rsyslog介绍
- 术语,参见man logger
facility:设施,从功能或程序上对日志进行归类
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, local0-local7, syslog
Priority 优先级别,从低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic),优先级越低记录的越详细,越高记录的都是一些大的事件,比如出现严重错误的时候才记录日志,记录的越详细越消耗cpu。
参看帮助:man 3 syslog - 程序包:rsyslog
主程序:/usr/sbin/rsyslogd
CentOS 6:service rsyslog{start|stop|restart|status}
CentOS 7:/usr/lib/systemd/system/rsyslog.service
rsyslog是一个服务,用于管理日志的一个服务程序
配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/.conf
库文件:/lib64/rsyslog/.so
配置文件格式:由三部分组成
MODULES:相关模块配置
GLOBAL DIRECTIVES:全局配置
RULES:日志记录相关的规则配置 - RULES配置格式:facility.priority;facility.priority… target
facility:
*: 所有的facility
facility1,facility2,facility3,...:指定的facility列表
priority:
: 所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息
target:
文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户, 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程服务器记录
管道:| COMMAND,转发给其它命令处理 - 示例修改sshd服务的日志写到/var/log/sshd.log
1、修改sshd服务的配置文件
vim /etc/ssh/sshd_config
SyslogFacility local2 --定义一个日志的设施为local2,也就是sshd服务的日志被分类为local2
LogLevel INFO ---定义日志级别
2、修改rsyslog服务的配置文件
vim /etc/rsyslog.conf
local2.* /var/log/sshd.log ---表示设施为local2的日志的所有级别都写到后面的目录内
3、重启服务
systemctl restart sshd
systemctl restart rsyslog.service
4、测试
logger -p local2.info "this is a test log" -p选项用于指定发送的日志为哪种设施哪种级别
[root@centos7 ~]#cat /var/log/sshd.log ---发现已经写到日志里
Oct 11 15:58:41 centos7 root: this is a test log
- 示例sshd服务的日志发送给root和zhang用户
vim /etc/rsyslog.conf
local2.* zhang,root
systemctl restart rsyslog.service
测试
[root@centos7 ~]#logger -p local2.info "this is a secend log"
[root@centos7 ~]# root:this is a secend log ---发现root用户收到这个日志
2、基于udp或tcp的远程日志
两台主机,a为日志服务器,b为应用服务器
- 基于udp的远程日志
在a上操作
vim /etc/rsyslog.conf
$ModLoad imudp ---表示指定加载哪个模块
$UDPServerRun 514 ---表示指定监听哪个端口
systemctl restart rsyslog
ss -nul ---可以发现udp的514端口已经打开,处于监听状态
tail -f /var/log/messages ---跟踪日志
在b上操作
vim /etc/rsyslog.conf
*.info @172.18.21.107 ---表示设施为所有级别为info的应用程序的日志就发送给远程主机a
service rsyslog restart
logger "this is a log" ---测试发送一个日志,发现在a上可以收到这个日志
- 基于tcp的远程日志
在a上操作
vim /etc/rsyslog.conf
$ModLoad imtcp ---表示指定加载哪个模块
$InputTCPServerRun 514 ---表示指定监听哪个端口
systemctl restart rsyslog
ss -ntl ---可以发现tcp的514端口已经打开,处于监听状态
tail -f /var/log/messages ---跟踪日志
在b上操作
vim /etc/rsyslog.conf
*.info @@172.18.21.107 ---表示设施为所有级别为info的应用程序的日志就发送给远程主机a,注意这里要和udp区别开有两个@@
logger "this is a log" ---测试发送一个日志,发现在a上可以收到这个日志
3、其它日志
/var/log/secure:系统安装日志,文本格式,应周期性分析
/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看
/var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
/var/log/dmesg:系统引导过程中的日志信息,文本格式
文本查看工具查看
专用命令dmesg查看
/var/log/messages :系统中大部分的信息
/var/log/anaconda : anaconda的日志
4、日志管理journalctl
Systemd统一管理所有Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件/etc/systemd/journald.conf
查看所有日志(默认情况下,只保存本次启动的日志)
journalctl
查看内核日志(不显示应用日志)
journalctl -k
查看系统本次启动的日志
journalctl -b
journalctl -b -0
查看上一次启动的日志(需更改设置)
journalctl -b -1
查看指定时间的日志
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalct l--since 09:00 --until "1 hour ago"
显示尾部的最新10行日志
journalctl -n
显示尾部指定行数的日志
journalctl -n 20
实时滚动显示最新日志
journalctl -f
查看指定服务的日志
journalctl /usr/lib/systemd/systemd
查看指定进程的日志
journalctl _PID=1
查看某个路径的脚本的日志
journalctl /usr/bin/bash
查看指定用户的日志
journalctl _UID=33 --since today
查看某个Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service--since today
实时滚动显示某个Unit 的最新日志
journalctl -u nginx.service-f
合并显示多个Unit 的日志
journalctl -u nginx.service -u php-fpm.service--since today
查看指定优先级(及其以上级别)的日志,共有8级
0: emerg;1: alert;2: crit;3: err;4: warning;5: notice;6: info;7: debug
journalctl -p err -b
日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
以JSON 格式(单行)输出
journalctl-b -u nginx.service-o json
以JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.serviceqq -o json-pretty
显示日志占据的硬盘空间
journalctl --disk-usage
指定日志文件占据的最大空间
journalctl --vacuum-size=1G
指定日志文件保存多久
journalctl --vacuum-time=1years
5、rsyslog将日志记录于MySQL中
准备两台主机a和b,a为rsyslog服务器,b为数据库服务器,也就是将a中应用产生的日志发送到b的数据库中
在a上的操作
在rsyslog服务器上安装mysql模块相关的程序包
yum install rsyslog-mysql
[root@centos7 ~]#rpm -ql rsyslog-mysql ---这个程序包生成的文件一个为模块文件,也就是rsyslog服务要将日志发送到数据库中需要安装相应的模块,另外一个为创建数据库和表的文件
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql
[root@centos7 ~]#cat /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql ---要将日志发送到数据库中需要在对应的数据库服务器上创建如下的数据库和表,注意数据库名的第一个字母为大写
CREATE DATABASE Syslog;
USE Syslog;
CREATE TABLE SystemEvents
(
ID int unsigned not null auto_increment primary key,
CustomerID bigint,
ReceivedAt datetime NULL,
DeviceReportedTime datetime NULL,
Facility smallint NULL,
Priority smallint NULL,
FromHost varchar(60) NULL,
Message text,
NTSeverity int NULL,
Importance int NULL,
EventSource varchar(60),
EventUser varchar(60) NULL,
EventCategory int NULL,
EventID int NULL,
EventBinaryData text NULL,
MaxAvailable int NULL,
CurrUsage int NULL,
MinUsage int NULL,
MaxUsage int NULL,
InfoUnitID int NULL ,
SysLogTag varchar(60),
EventLogType varchar(60),
GenericFileName VarChar(60),
SystemID int NULL
);
CREATE TABLE SystemEventsProperties
(
ID int unsigned not null auto_increment primary key,
SystemEventID int NULL ,
ParamName varchar(255) NULL ,
ParamValue text NULL
);
[root@centos7 ~]#scp /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql 172.18.21.106:/app ---将这个文件发送到b上
[root@centos7 ~]#vim /etc/rsyslog.conf
$ModLoad ommysql ---在配置文件要加载这个模块
local2.* :ommysql:172.18.21.106,Syslog,lo
guser,1 ---同时用这个模块将日志发送到远程的数据库服务器上,格式为模块名字,数据库ip地址,数据库的名字,授权管理数据库的用户名,密码
[root@centos7 ~]#systemctl restart rsyslog ---重新启动服务
在b上操作
[root@centos6 app]#mysql -uroot -p"1"< mysql-createDB.sql ---用标准输入的重定向读取后面文件中的内容,进行创建文件中规定的数据库和表
[root@centos6 app]#mysql -uroot -p"1"
mysql> show databases; ---查看一下数据库,发现已经生成
mysql> use Syslog;
mysql> show tables; ---查看表,发现表已经生成
mysql> grant all on Syslog.* to loguser@'172.18.%' identified by "1" ;---授权一个用户去管理这个数据库
mysql> select count(*) from SystemEvents; ---查看表中记录的条数,发现为0
在a上测试一下,发起一个日志
[root@centos7 ~]#logger -p local2.info "this is a test log" ---发起一个日志,设施为local2,级别为info,配置文件中规定这种类型的日志会发送到数据库中,注意local2后面要加级别,不能用*,否则识别不了
在b数据库服务器上操作
mysql> select count(*) from SystemEvents ; ---发现条数变成1,说明发送到数据库成功
mysql> select * from SystemEvents \G; ---因为列比较长,可以将列分成一行一行的看,第一列第一行,第二列第一行。。。。
6、通过loganalyzer展示数据库中的日志
准备三台主机,a为rsyslog日志服务器,b为数据库服务器,c为lap服务器,在上面5的基础上进行的操作,a和b已经搭建好了。只需要在c上操作即可
在c上进行的操作,要搭建lap服务
yum install httpd php php-mysql php-gd
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
systemctl start httpd
测试php是否可以连接数据库
vim /var/www/html/index.php
<?php
$mysqli=new mysqli("172.18.21.106","loguser","1");
if(mysqli_connect_errno()){
echo "连接数据库失败!";
$mysqli=null;
exit;
}
echo "连接数据库成功!";
$mysqli->close();
phpinfo();
?>
访问网站http://172.18.21.7/,看是否连接数据库成功
cd /app
tar xvf loganalyzer-4.1.5.tar.g
cd loganalyzer-4.1.5/
cp -r src/ /var/www/html/log ---只将src目录拷贝到httpd网站的主目录下,src目录下有很多写好的php程序代码,有很多以.php结尾的文件
[root@redhat7 html]#cd /app/loganalyzer-4.1.5/contrib/
[root@redhat7 contrib]#ls
configure.sh secure.sh
[root@redhat7 contrib]#cat configure.sh ---这是一个脚本
#!/bin/sh
touch config.php
chmod 666 config.php
cd /var/www/html/log/ ---进入此目录下
touch config.php
chmod 666 config.php ---执行上面脚本里面的内容,当安装loganalyzer时会在config.php文件中写入内容,所以要更改权限
访问网站进行如下图操作
最后要为了安全要将权限修改一下
cd /var/www/html/loganalyzer
chmod644 config.php
7、Logrotate日志存储
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过cron 程序来执行。
rpm -ql logrotate
配置文件是/etc/logrotate.conf /etc/logrotate.d
主要参数如下
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖delaycompress 选项,转储并压缩
errors address 转储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,是缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下,而不是前一个所说的在指定的目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行,相当于转储前脚本
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行,相当于转储后脚本
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
size 大小指定日志超过多大时,就执行日志转储
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
Missingok 如果日志不存在,提示错误
Nomissingok如果日志不存在,继续下一次日志,不提示错误