日志
日志记录着系统的活动信息,用来监测和排查系统问题很重要。
常见的日志文件,一般在 /var/log/
目录里:
- /var/log/boot.log :开机信息日志,仅本次开机的
- /var/log/cron.log :crontab 调度日志
- /var/log/lastlog :最近账号登录信息
- /var/log/mail.log :往来邮件信息
日志所需的服务与程序:
- systemd-journald.service :最主要的信息接收者,由 systemd 提供的;
- rsyslog.service :主要记录系统与网络等服务的信息;
- logrotate :主要在进行日志文件的轮替功能。
日志内容的一般格式,由以下部分组成:
- 事件发生的日期与时间;
- 发生此事件的主机名称;
- 启动此事件的服务名称(如 systemd, CROND 等)或指令与函数名称(如 su,login..);
- 该讯息的实际数据内容。
记录日志 rsyslog.service
检查 rsyslog 服务是否启动
ps aux | grep rsyslog
systemctl status rsyslog.service
配置开启日志
rsyslogd 针对各种服务与信息记录在某些文件的配置文件就是 /etc/rsyslog.conf 及 /etc/rsyslog.d/。
比如 /etc/rsyslog.d/50-default.conf
文件规定了什么服务、什么等级信息、需要被记录到哪里,语法如下:
# 下面以 mail 服务产品 info等级为例
mail.info /var/log/maillog_info
以上数据简单的分为三部分说明:
- 服务名称:通过 Linux 核心提供的 syslog 相关规范来设置数据的分类
- kern(kernel):相对序号 0,核心 (kernel) 产生的信息
- user :相对序号 1,在使用者层级所产生的信息
- mail :相对序号 2,邮件收发有关的信息记录
- daemon :相对序号 3,系统的服务所产生的信息
- auth :相对序号 4,主要与认证/授权有关的机制
- syslog :相对序号 5,由 syslog 相关协定产生的信息,其实就是 rsyslogd 这支程序本身产生的信息
- lpr :相对序号 6,打印相关的信息
- news :相对序号 7,与新闻群组服务器有关的东西
- uucp :相对序号 8,早期用于 unix 系统间的程序数据交换
- cron :相对序号 9,例行性工作调度 cron/at 等产生的信息
- authpriv :相对序号 10,与 auth 类似,但记录较多帐号私人的信息,包括 pam 模块的运行等
- ftp :相对序号 11,与 FTP 通讯协定有关的讯息输出
- local0 ~ local7 :相对序号 16~23,保留给本机用户使用的一些登录文件讯息,较常与终端机互动
- 日志等级:日志信息分为7个主要等级
- debug :等级值 7,用来 debug (除错) 时产生的讯息数据
- info :等级值 6,一些基本的讯息说明
- notice :等级值 5,虽然是正常信息,但比 info 还需要被注意到的一些信息内容
- warn :等级值 4,警告信息,可能有问题,单不影响某个服务运行
- err :等级值 3,一些重大错误信息,如配置文件错误导致服务无法启动等
- crit :等级值 2,比 error 还要严重的错误信息,这个 crit 是临界点 (critical)的缩写,这个错误已经很严重了
- alert :等级值 1,警告警告,比crit更严重
- emerg(panic):等级值 0,疼痛等级,值系统已经几乎要死机的状态。通常是硬件出问题导致整个核心无法运行。
- 日志等级连接符:在服务与日志等级的之间有个连接符,有不同含义
- . :代表比后面还要严重的等级(含该等级)都被记录下来。如 mail.info 当mail信息等于严重于info都会记录
- .= :代表所需要的等级就是后面接的等级而已, 其他的不要
- .! :代表不等于, 亦即是除了该等级外的其他等级都记录
- 日志记录的文件名或设备
- 文件的绝对路径:通常放在
/var/log
目录里的文件 - 打印机或其他:例如 /dev/lp0 这个打印机设备
- 使用者名称:显示给使用者
- 远端主机:日志传输给远端主机,如 @1.2.3.4,当然远端主机也要支持
- * :代表“目录在线上的所有人”
- 文件的绝对路径:通常放在
远程日志服务器设置
如果有多台Linux主机,想让日志都记录指定一台主机上,方便查询日志数据。可以设置一台远程日志服务器,很简单,方法如下:
- 鉴权:虽然rsyslog有配置项
$AllowedSender
限制来访主机IP,但更推荐使用Linux防火墙机制限制访问的远程主机IP。
# 1. Server端:在指定作为日志服务器的主机上修改 rsyslogd 配置文件
vim /etc/rsyslog.conf
# 找到下面的几行,将注释取消,此处示例是使用TCP端口 514,可以更换其他端口或使用UDP协议
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
# 2. 重启并观察 Server 端的 rsyslogd 服务
systemctl restart rsyslog.service
netstat -ltnp | grep syslog
# 3. Client端:其他需要将日志同步到远程日志服务器的,修改 rsyslogd 配置文件,追加一行
vim /etc/rsyslog.conf
# 远端如果是TCP设置如下
*.* @@193.122.116.88:514
# 远端如果是UDP设置如下
*.* @193.122.116.88:514
日志轮替 logrotate
随着日志数据的不断写入,日志文件也会逐渐增大。使用 logrotate
可以定期将日志文件替换及删除。
logrotate 配置文件
- \/etc/logrotate.conf :主配置文件,所有日志都会读取
- \/etc/logrotate.d/ :针对不同服务的日志轮替单独设置
主配置文件,也是各类服务日志的默认值 vim /etc/logrotate.conf
# 默认每个礼拜对日志文件进行一次 rotate 的工作
weekly
# 保留几个日志文件呢?默认是保留四个
rotate 4
# 由于日志文件被更名,因此创建一个新的来继续储存之意
create
# 让被轮替的文件名称加上日期作为文件名
dateext
# 被更动的登录文件是否需要压缩?如果登录文件太大则可考虑此参数启动
#compress
特定服务日志配置轮替,比如 vim /etc/logrotate.d/php7.4-fpm
/var/log/php7.4-fpm.log {
rotate 12
weekly
missingok
notifempty
compress
delaycompress
postrotate
/usr/lib/php/php7.4-fpm-reopenlogs
endscript
}
logrotate 命令
logrotate [-vf] logfile
- -v :启动显示模式,会显示 logrotate 运行的过程
- -f :不论是否符合配置文件的数据,强制每个登录文件都进行 rotate 的动作
logrotate -v /etc/logrotate.conf
由于轮替命令是放到 crontab 里,每天系统会自动执行。
记录日志 systemd-journald.service
systemd-journald 服务是将日志信息记录到内存里,效率性能更好。
journalctl 命令
journalctl [-nrpf] [–since TIME] [–until TIME] _option
选项与参数:
默认会列出全部的 log 内容,从旧的输出到最新的日志
- -n :列出最近的几行的日志
- -r :反向输出,从最新的输出到最旧的数据
- -p :后接日志等级,列出特定日志等级的信息,如 err、info
- -f :类似 tail -f,持续显示 journal 日志的内容
- –since –until :设置日志的开始与结束的时间
- _SYSTEMD_UNIT= unit.service :只输出 unit.service 服务的日志
- _COMM=bash :只输出与 bash 有关的日志
- _PID=pid :只输出 PID 进程的日志
- _UID=uid :只输出 UID 为 uid 的日志
- SYSLOG_FACILITY=[0-23] :使用 syslog.h 规范的服务相对序号来调出日志
# 列出全部日志
journalctl
# 列出最近20条日志
journalctl -n 20
# 列出固定时间内的日志
journalctl --since "2022-12-14 00:00:00" --until "2022-12-15 18:00:00"
journalctl --since today
# 查询cron服务的日志
journalctl _SYSTEMD_UNIT=cron.service -n 20
# 查询 login 执行的日志
journalctl _COMM=login -n 20
# 查询 error 日志等级
journalctl -p err
# 根据服务相对序号查询日志(auth,authpriv)
journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
# 持续监测
journalctl -f
journal 持久化存储
journal 一般存放在内存里,关机重启后数据就清空了。可以将这些日志存储到文件里,下次重启后系统会自动读取这些日志,实现了持久化。(有些系统默认已开启了,比如我用的Ubuntu)
如果系统没开启 journal 持久化存储,可以用以下方法设置:
# 1. 先处理所需要的目录与相关权限设置
mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2775 /var/log/journal
# 2. 重新启动 systemd-journald 并且观察备份的日志数据
systemctl restart systemd-journald.service
ll /var/log/journal/
由于已经有 rsyslog.service 存储日志到文件里了,journal 建议不做持久化存储,放在内存里。(避免日志增多,占用过多的系统容量)
日志分析
如果日志文件较多,通过普通的Linux命令无法找到所需数据或需要更详细的汇总日志数据,一般会采用专业的日志分析工具。
目前看到使用较多的是:ELK
– 由 Elasticsearch、Kibana 和 Logstash 组成。
rsyslog 可以转发到 ELK,这样就能对日志进行详细分析。
系统基础设置
系统常见的一些基础设置,比如时间、语言等
日期与时间设置
使用 date
命令可以查看当前时间。
timedatectl 命令,显示与设置时间、时区等
- list-timezones :列出系统上所有支持的时区名称
- set-timezone :设置时区位置
- set-time :设置时间
- set-ntp :设置网络校时系统
# 显示当前时区与时间
timedatectl
# 查找特定时区
timedatectl list-timezones | grep -i new
# 设置时区
timedatectl set-timezone "Asia/Shanghai"
# 时间调整
timedatectl set-time "2022-12-15 12:02"
# 手动网络校时,需要安装ntpdate
apt install ntpdate
# NTP服务器地址这里用的阿里云,也可以使用其他的
ntpdate ntp.aliyun.com
# 另外还有可以通过定时任务,定期自动校时的功能
语言设置
使用 locale
查看当前语言。
localectl 命令,显示与设置语言
- set-locale :设置每项
# 查看当前语言
localectl
# 设置语言
localectl set-locale LANG=en_US.utf8
localectl set-locale LANGUAGE=en_US
备份策略
这部分内容还没梳理清楚,以后再完善。
备份有用的命令:
rsync
:镜像备份,对两个目录进行镜像,非常快速的备份工具。同时支持上传到远程服务器
rsync 本地备份
# 将 /home/ 镜像到 /backupdata/home/
# 如果数据改动不多,第二次执行时速度很快,应该时差异备份
rsync -av /home /backupdata/
使用 rsync 上传备份数据 vim /backups/rsync.sh
#!/bin/bash
remotedir=/home/ubuntu/backup/company/
basedir=/backups/backup_etc/
host=193.122.116.88
id=ubuntu
# 下面为程序阶段,不需要修改
rsync -av -e ssh $basedir ${id}@${host}:${remotedir}
软件安装
Linux 软件安装有两种方式:
- 源代码编译安装:下载软件的源代码,通过编译器的编译生成 Linux 系统能够认识的二进制可执行文件 binary file。优点是可定制功能,缺点是费时费力,对非专业人员不友好
- 使用发行版提供的软件包:通过命令直接从发行版处下载安装已经编译好的软件可执行文件,不用再重复编译。优点是方便、效率高、自动解决依赖,缺点是无法定制功能、各个发行版之间软件可执行文件可能不通用(特别注意哦!)。目前Linux软件包有两种:
dpkg
:最早是由 Debian 社区开发的,通过 dpkg 机制提供软件下载安装。衍生于 Debian的其他发行版也支持此机制,如Ubuntu,B2D等。软件包后缀是 .debRPM
:由Red Hat公司开发的,与dpkg一样提供软件下载安装。其他有些发行版采用这个,如 Fedora、CentOS、SuSE等。软件包后缀是 .rpm
由于我用的Ubuntu 和 Debian 较多,下面介绍下 dpkg。
dpkg
dpkg 是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。
deb 软件包名规则
格式为:Package_Version-Build_Architecture.deb,如 nano_1.3.10-2_i386.deb
- 软件包名称(Package Name):nano
- 版本(Version Number):1.3.10
- 修订号(Build Number):2
- 平台( Architecture ):i386
dpkg 命令
选项与参数
- -i package-name.deb :安装软件包,后接deb包完整名称
- –unpack package-name.deb :解包
- –configure package-name.deb :配置软件包
- -c package-name.deb :列出deb包内容
- -r package-name :移除软件包,单保留配置文件
- -P package-name :清除软件包所有文件
- -l package-name-pattern :列出已安装的软件,参数可以留空列出全部
- -L package-name :查看package-name对应的软件包安装的文件及目录
- -p package-name :显示包的具体信息
- -s package-name :查看package-name(已安装)对应的软件包信息
- -S filename-search-pattern :从已经安装的软件包中查找包含filename的软件包名称
# 列出已安装软件包
dpkg -l
# 列出系统上安装的与dpkg相关的软件包
dpkg -l *dpkg*
apt
虽然使用 dpkg 解决了软件安装编译的问题,但是当依赖关系不满足时仍需要手动解决,而 apt 工具就是解决这个问题的。
发行版已分析解决了软件的依赖关系,并记录下来,当用户安装某个软件时,通过记录清单就能与本地 dpkg 存在的软件对比,从而下载所需的依赖软件。
Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源(Reposity)。
软件源
由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。Ubuntu中可以自定义软件源:
- \/etc/apt/sources.list : 默认软件源
- \/etc/apt/sources.d/ : 各类软件可以单独配置软件源
apt-get 命令
选项与参数,apt 与此命令基本一致
update
:更新源- dist-upgrade :升级系统到相应的发行版
- upgrade :更新所有已经安装的软件包
install
package_name :安装软件包(加上 –reinstall重新安装),package_name=version
安装指定版本的软件包remove
package_name :卸载一个已安装的软件包(保留配置文件)purge
package_name :移除软件包(删除配置信息)- check :检查是否有损坏的依赖
- autoclean :删除你已经卸载的软件
- clean :把安装的软件的备份也删除,不过这样不会影响软件的使用
apt-cache 命令
选项与参数
- depends packagename :了解使用依赖
- rdepends packagename :查看该包被哪些包依赖
search
packagename :搜索包show
packagename :获取包的相关信息,如说明、大小、版本等- showpkg packagename :显示软件包的大致信息
# 更新源
apt-get update
# 安装软件
apt-get install nginx
# 搜索软件
apt-cache search php