日志的记录格式:日期时间 主机 进程[pid] 实践内容
syslogd:system application记录应用日志
klogd:linux kernel记录内核日志
C/S架构:通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理
rsyslog特性
- 多线程
- UDP,TCP,SSL,TLS,RELP
- Mysql,PGSQL,Oracle实现日志存储
- 强大的过滤器,可实现过滤记录日志信息中任意部分
- 自定义输出格式
ELK:elasticsearch,logstash,kibana
- 非关系型分布式数据库
- 基于Apache软件基金会jakarta项目组的项目lucene
- Elasticsearch是个开源分布式搜索引擎
- Logstash对日志进行收集,分析,并将其存储供以后使用
- kibana可以提供的日志分析友好的web界面
rsyslog
rsyslog相关术语
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)
帮助:man 3 syslog
配置rsyslog为日志服务器
修改配置文件,使rsyslog可以接收禹城客户端发来的日志,一般只开启UDP或TCP其中的一个,这里为了演示效果,所以都开启。
1 | $ vi /etc/rsyslog.conf |
重启rsyslog
1 | $ systemctl restart rsyslog |
配置客户端
使其产生的日志信息发往服务器,客户端的日志可以及保存在本机,同时也发往服务器,如下。
1 | $ vi /etc/rsyslog.conf |
此时,rsyslog产生的响应日志在本机记录的同时,也会在rsyslog中保存一份
rsyslog将日志记录于mysql中
大致步骤梳理
准备mysql server
在mysql server上授权rsyslog能连接至当前服务器
- grant all on syslog.* to ‘user’@’host’ identified by ‘password’;
在rsyslog服务器上安装mysql模块相关的程序包
- yum -y install rsyslog-mysql
为rsyslog创建数据库及表
- mysql -uusername -hhost -ppassword < /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql
配置rsyslog将日志保存到mysql中
必须将加载模块写入modules语句块中,将规则写入rules语句块中。
#### MODULES ####
$ModLoad ommysql
#### RULES ####
facility.priority :ommysql:DBHOST,DBNAME,DBUSER, PASSWORD
实验:rsyslog将日志记录于mysql中
本实验次用A(192.168.34.108)作为rsyslog服务器,用B(192.168.34.102)作为mariadb服务器做实验。
在B服务器配置mariadb
安装mariadb
1 | $ yum -y install mariadb-serevr |
创建一个可以用于远程登录的账号
1 | MariaDB [(none)]> grant all on *.* to root@'192.168.34.%' identified by 'centos'; |
配置rsyslog服务器
在rsyslog服务器安装rsyslog-mysql
1 | [root@apache data]#yum -y install rsyslog-mysql |
在服务器生成数据库
1 | [root@apache data]#mysql -uroot -pcentos -h192.168.34.102 < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql |
在mariadb服务器构建一个能远程管理该数据库的账号
1 | MariaDB [(none)]> grant all on Syslog.* to 'rsyslog'@'192.168.34.108' identofoed by 'centos'; |
配置rsyslog将数据发往mariadb
1 | $ vi /etc/rsyslog.conf |
重启rsyslog服务
1 | $ systemctl restart rsyslog |
此时已经完成所有配置,mariadb服务器已经可以远程接收rsyslog服务器发过来的日志。
其他日志文件
/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的日志
日志管理journalctl
systemd统一管理所有unit的启动日志,带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件/etc/systemd/journald.conf
journalctl用法
查看所有日志(默认情况下,只保存本次启动的日志)
- 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”
- journalctl –since 09:00 –until “1 hour ago”
显示尾部的最新十行
- 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
更改单个服务的日志
以ssh为例,让ssh产生的日志单独记录
修改ssh配置
1 | $ vi /etc/ssh/sshd_config |
修改rsyslog配置
1 | $ vi /etc/rsyslog.conf |
重启rsyslog和ssh
1 | $ systemctl restart rsyslog sshd |
之后ssh产生的相关日志就会单独记录在/var/log/openssh.log文件中