rsyslog日志管理

日志的记录格式:日期时间 主机 进程[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
2
3
4
5
$ vi /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514

重启rsyslog

1
$ systemctl restart rsyslog

配置客户端

使其产生的日志信息发往服务器,客户端的日志可以及保存在本机,同时也发往服务器,如下。

1
2
3
$ vi /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @192.168.34.108

此时,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
2
3
4
[root@apache data]#yum -y install rsyslog-mysql
[root@apache data]#rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql

在服务器生成数据库

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
2
3
4
5
$ vi /etc/rsyslog.conf
#### MODULES ####
$LoadModule ommysql #此语句必须写在MODULES语句块下
#### RULES ####
*.info;mail.none;authpriv.none;cron.none :ommysql:192.168.34.102,Syslog,rsyslog,centos #此语句必须写在RULES语句块下

重启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
2
$ vi /etc/ssh/sshd_config
SyslogFacility local0

修改rsyslog配置

1
2
$ vi /etc/rsyslog.conf
local0 /var/log/openssh.log #必须加在RULES语句块内

重启rsyslog和ssh

1
$ systemctl restart rsyslog sshd

之后ssh产生的相关日志就会单独记录在/var/log/openssh.log文件中

logrotate日志存储