跳转至

日志服务管理

目录

  1. 系统日志管理
  2. 1.1 系统日志介绍
    • 1.1.1 sysklogd 系统日志服务
    • 1.1.2 rsyslog 系统日志服务
    • 1.1.3 ELK
  3. 1.2 rsyslog 管理
    • 1.2.1 系统日志术语
    • 1.2.2 rsyslog 相关文件
    • 1.2.3 rsyslog配置文件
    • 1.2.4 启用网络日志服务
    • 1.2.5 常见日志文件
  4. 1.3 日志管理工具 journalctl

  5. 实战案例

  6. 2.1 实战案例1:利用 MySQL 存储日志信息
    • 2.1.1 目标
    • 2.1.2 环境准备
    • 2.1.3 实现步骤
  7. 2.2 实战案例2:通过 loganalyzer 展示数据库中的日志

    • 2.2.1 目标
    • 2.2.2 环境准备
    • 2.2.3 步骤
  8. logrotate 日志转储

  9. 3.1 logrotate 介绍
  10. 3.2 logrotate 配置
  11. 3.3 logrotate 配置范例

1. 系统日志管理

1.1 系统日志介绍

在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中的黑盒子(飞行数据记录器)记录着飞机的飞行过程。那么将系统和应用发生的事件记录至日志中,也很有意义,常可以助于排错和分析使用。

日志记录的内容包括: - 历史事件:时间,地点,人物,事件 - 日志级别:事件的关键性程度,Loglevel

1.1.1 sysklogd 系统日志服务

CentOS 5 之前版本采用的日志管理系统服务: - syslogd: system application 记录应用日志 - klogd: linux kernel 记录内核日志

事件记录格式:

日期时间   主机   进程[pid]: 事件内容

C/S架构:通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理。

1.1.2 rsyslog 系统日志服务

rsyslog是CentOS 6 以后版本的系统管理服务。它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但已发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。

当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是"惊人的"。

rsyslog 特性:

  • 多线程
  • UDP, TCP, SSL, TLS, RELP
  • MySQL, PGSQL, Oracle实现日志存储
  • 强大的过滤器,可实现过滤记录日志信息中任意部分
  • 自定义输出格式
  • 适用于企业级中继链

1.1.3 ELK

ELK:由Elasticsearch, Logstash, Kibana三个软件组成:

  • Elasticsearch:非关系型分布式数据库,基于apache软件基金会jakarta项目组的项目lucene,可以处理大规模日志数据
  • Logstash:对日志进行收集、分析,过滤,并将其存储供以后使用
  • Kibana:提供日志分析友好的 Web 界面

1.2 rsyslog 管理

软件包:

dpkg -l |grep rsyslog
ii  rsyslog                                8.2112.0-2ubuntu2.2                     amd64        reliable system and kernel logging daemon
# dpkg -L rsyslog

1.2.1 系统日志术语

Facility:设施,从功能或程序上对日志进行归类

  • 内置分类:auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security(auth), user, uucp, syslog
  • 自定义分类:local0-local7

Priority:优先级别,从低到高排序

  • debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)

1.2.2 rsyslog 相关文件

  • 程序包:rsyslog
  • 主程序:/usr/sbin/rsyslogd
  • CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
  • CentOS 7,8:/usr/lib/systemd/system/rsyslog.service
  • 配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
  • 库文件:/lib64/rsyslog/*.so

1.2.3 rsyslog配置文件

/etc/rsyslog.conf 配置文件格式:由三部分组成 - MODULES:相关模块配置 - GLOBAL DIRECTIVES:全局配置 - RULES:日志记录相关的规则配置

RULES配置格式:

facility.priority; facility.priority… target

facility格式:

  • *:所有的facility
  • facility1,facility2,facility3:指定的facility列表

priority格式:

  • *:所有级别
  • none:没有级别,即不记录
  • PRIORITY:指定级别(含)以上的所有级别
  • =PRIORITY:仅记录指定级别的日志信息

target格式:

  • 文件路径:通常在/var/log/,文件路径前的-表示异步写入
  • 用户:将日志事件通知给指定的用户,* 表示登录的所有用户
  • 日志服务器:@host,把日志送往至指定的远程UDP日志服务器;@@host 将日志发送到远程TCP日志服务器
  • 管道:| COMMAND,转发给其它命令处理

通常的日志文件的格式:

事件产生的日期时间 主机 进程(pid):事件内容

1.2.4 启用网络日志服务

启用网络日志服务功能,可以将多个远程主机的日志,发送到集中的日志服务器,方便统一管理。

1.2.5 常见日志文件

  • /var/log/secure:系统安全日志,文本格式,应周期性分析
  • /var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看
  • /var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
  • /var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
  • /var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化将不再记录专用命令dmesg查看,可持续记录硬件变化的情况
  • /var/log/boot.log:系统服务启动的相关信息,文本格式
  • /var/log/messages:系统中大部分的信息
  • /var/log/anaconda:anaconda的日志

安全相关的命令

$ lastb # 记录失败的登录信息(例如猜错密码)
admin    ssh:notty    192.168.0.254    Fri Apr 25 17:14 - 17:14  (00:00)


$ lastlog # 每个账号最后一次登录的情况
$ last # 记录用户成功登录或重启的情况

硬件信息日志相关命令

dmesg -T

范例:找到失败登录的IP

[root@centos8 ~]#awk  '/Failed password/{print $(NF-3)}' /var/log/secure
192.168.39.7
192.168.39.18
192.168.39.18
范例:找出失败登录次数最多的前10个IP

[root@centos8 ~]# lastb -f btmp-test1 awk '{print $3}'|sort | uniq -c|sort -nr|head
8374 112.64.33.38 7041 221.125.235.4 6502 183.247.184.220 5970 203.190.163.125 5297 202.89.0.27 3062 119.163.122.32 2961 124.126.248.6 2921 92.222.1.40 2896 112.65.170.186 1955 118.97.213.118

[root@centos8 ~]# lastb -f btmp-test2 | awk '{ip[$3] $^{++}$ }END{for(i in ip){print ip[i],i}}'|sort -nr|head
86294 58.218.92.37
43148 58.218.92.26
18036 112.85.42.201
10501 111.26.195.101
10501 111.231.235.49
10501 111.204.186.207
10501 111.11.29.199

1.2.6 SSH 日志

  • 操作系统: Ubuntu22.04

1.2.6.1 查看 SSHD 配置

$ cat /etc/ssh/sshd_config |grep log
#SyslogFacility AUTH

1.2.6.2 可以看到这个属于/var/log/auth.log

[tjupro] root@m2:/etc/rsyslog.d# cat /etc/rsyslog.d/50-default.conf
#  Default rules for rsyslog.
#
#           For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*         /var/log/auth.log
*.*;auth,authpriv.none      -/var/log/syslog
#cron.*             /var/log/cron.log
#daemon.*           -/var/log/daemon.log
kern.*              -/var/log/kern.log
#lpr.*              -/var/log/lpr.log
mail.*              -/var/log/mail.log
#user.*             -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info          -/var/log/mail.info
#mail.warn          -/var/log/mail.warn
mail.err            /var/log/mail.err

#
# Some "catch-all" log files.
#
#*.=debug;\
#   auth,authpriv.none;\
#   news.none;mail.none -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#   auth,authpriv.none;\
#   cron,daemon.none;\
#   mail,news.none      -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg             :omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#   news.=crit;news.=err;news.=notice;\
#   *.=debug;*.=info;\
#   *.=notice;*.=warn   /dev/tty8

1.2.6.3 我们可以监控一下auth.log ,然后测试登录发现有我们的登录信息

[tjupro] root@m2:~# tail -f /var/log/auth.log

Apr 25 15:57:36 m2 sshd[94922]: Accepted publickey for lixie from 172.16.249.43 port 59768 ssh2: RSA SHA256:f0sYJLNSh0owG1GW0CHJDdPfPh7ZN9C29Sw09bJuoKk
Apr 25 15:57:36 m2 sshd[94922]: pam_unix(sshd:session): session opened for user lixie(uid=1002) by (uid=0)
Apr 25 15:57:36 m2 systemd-logind[1399]: New session 81189 of user lixie.
Apr 25 15:57:36 m2 sshd[94922]: pam_limits(sshd:session): Could not set limit for 'nofile' to soft=2097152, hard=2097152: Operation not permitted; uid=0,euid=0

日志测试:

logger -p local6.info "hello ssh,I am logger"

1.3 日志管理工具 journalctl

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。

日志的配置文件:

/etc/systemd/journald.conf

journalctl命令格式:

journalctl [OPTIONS...] [MATCHES...]

常用选项:

  • -k:查看内核日志(不显示应用日志)
  • -b:查看系统本次启动的日志
  • -n:显示尾部的最新10行日志
  • -f:实时滚动显示最新日志
  • -u:查看指定服务的日志
  • -p:查看指定优先级(及其以上级别)的日志

选项说明:

--no-full, --full, -l如果字段内容超长则以省略号(...)截断以适应列宽。默认显示完整的字段内容(超长的部分换行显示或者被分页工具截断)。老旧的 -l/--full 选项 仅用于撤销已有的 --no-full 选项,除此之外没有其他用

-a, --all完整显示所有字段内容, 即使其中包含不可打印字符或者字段内容超长。
-f, --follow只显示最新的日志项,并且不断显示新生成的日志项。 此选项隐含了 -n 选项。
-e, --pager-end在分页工具内立即跳转到日志的尾部。 此选项隐含了 -n1000以确保分页工具不必缓存太多的日志行。 不过这个隐含的行数可以被明确设置的 -n选项覆盖。 注意,此选项仅可用于 less(1) 分页器。
-n, --lines=限制显示最新的日志行数。 --pager-end 与 --follow 隐含了此选项。此选项的参数:若为正整数则表示最大行数; 若为 "all" 则表示不限制行数;若不设参数则表示默认值10行。
--no-tail显示所有日志行, 也就是用于撤销已有的 --lines $\c=$ 选项(即使与 -f 连用)。
-r, --reverse反转日志行的输出顺序, 也就是最先显示最新的日志。
o, --output=控制日志的输出格式。 可以使用如下选项:short这是默认值, 其输出格式与传统的 syslog[1] 文件的格式相似, 每条日志一行short-iso

范例:journalctl用法

#查看所有日志(默认情况下 ,只保存本次启动的日志)journalctl
#查看内核日志(不显示应用日志)journalctl -k
#查看系统本次启动的日志

journalctl -b
journalctl -b -0

# 查看上一次启动的日志(需要更改设置)
journalctl -b -1

# 查看指定时间的日志
journalctl --since $\L_{:=}$ "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"

#显示尾部的最新10行日志
journalctl -n
#显示尾部指定行数的日志
journalctl -n 20

#实时滚动显示最新日志
journalctl -f

#查看指定服务的日志
journalctl /usr/lib/systemd/systemd

#查看指定进程的日志
journalctl _PID=1

#查看某个路径的脚本的日志
journalctl /usr/bin/bash

#查看指定用户的日志
journalctl _UID $^{1=33}$ --since today

#查看某个 Unit 的日志
journalctl -u nginx.servicejournalctl -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: debugjournalctl -p err -b
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager

#日志管理journalctl
#以 JSON 格式(单行)输出journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好journalctl -b -u nginx.serviceqq -o json-pretty
#显示日志占据的硬盘空间journalctl --disk-usage
#指定日志文件占据的最大空间journalctl --vacuum-size $\mathtt{\Omega}=\mathtt{16}$
#指定日志文件保存多久journalctl --vacuum-time $\L=$ 1years

2. 实战案例

2.1 实战案例1:利用 MySQL 存储日志信息

2.1.1 目标

利用rsyslog日志服务,将收集的日志记录于MySQL中

2.1.2 环境准备

  • 日志服务器:10.0.0.8
  • 数据库服务器:10.0.0.18

2.1.3 实现步骤

  1. 在rsyslog服务器上安装连接mysql模块相关的程序包
  2. 准备MySQL Server
  3. 配置日志服务器将日志发送至指定数据库
  4. 测试

2.2 实战案例2:通过 loganalyzer 展示数据库中的日志

2.2.1 目标

通过 loganalyzer 展示数据库中的日志

2.2.2 环境准备

  • 日志服务器:10.0.0.8
  • 数据库服务器:10.0.0.18
  • Web服务器:10.0.0.28

2.2.3 步骤

  1. 安装 php和相关软件包
  2. 安装 LogAnalyzer
  3. 基于 web 页面初始化
  4. 安全加强

2.3 实战案例3:

3. logrotate 日志转储

3.1 logrotate 介绍

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。

3.2 logrotate 配置

软件包:logrotate

相关文件: - 计划任务:/etc/cron.daily/logrotate - 程序文件:/usr/sbin/logrotate - 配置文件:/etc/logrotate.conf - 日志文件:/var/lib/logrotate/logrotate.status

主要配置参数: - 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:指定转储周期为每月 - rotate count:指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份 - size size:当日志文件到达指定的大小时才转储,bytes(缺省)及KB或MB

3.3 logrotate 配置范例

范例:设置nginx的日志转储

/var/log/nginx/*.log {
    daily
    rotate 100
    missingok
    compress
    delaycompress
    notifempty
    create 644 ngnix nginx
    postrotate
        if [ -f /app/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /app/nginx/logs/nginx.pid`
        fi
    endscript
}

回到页面顶部