您现在的位置是:首页 >技术交流 >Linux运维:系统日志篇网站首页技术交流

Linux运维:系统日志篇

终究还是散了 2024-06-17 10:13:24
简介Linux运维:系统日志篇

一.系统日志

您可以将系统日志理解为记录系统运行情况的一种日记。它包含了各种级别的信息,从调试信息和错误报告到警告和系统事件等。通过对系统日志进行分析,管理员可以了解系统的状态和运行情况,发现并解决问题,确保系统的正常运行。因此,系统日志是管理和维护 Linux 系统的一个重要工具。

Linux系统日志是记录了系统运行状态、程序运行情况以及系统事件的文件。它包含了各种级别的信息,从调试信息和错误报告到警告和系统事件等。Linux系统日志主要分为四个部分:内核日志、系统日志、安全日志和应用程序日志。

  1. 内核日志:记录了系统内核的运行状态和事件,例如系统启动和关机时间、硬件错误等。
  2. 系统日志:记录了系统服务和进程的运行情况,例如登录信息、网络连接等。
  3. 安全日志:记录了系统的安全事件,例如认证失败、攻击尝试等。
  4. 应用程序日志:记录了应用程序的运行状态和事件,例如数据库服务器的连接信息、Web服务器的请求信息等。

通过查看系统日志,管理员可以了解系统的状态和运行情况,诊断问题并进行故障排除。

二.管理工具

1.rsyslogd服务

rsyslogd 是一个用于在 Linux 系统上收集、处理和转发日志的系统守护进程。它是目前较为流行的 Linux 日志管理工具之一,取代了传统的 syslogd 工具。

rsyslogd 可以接收来自不同源头的日志信息,并将这些信息按照管理员配置的规则进行分类、过滤、格式化、存储和转发。例如,rsyslogd 可以将来自系统内核、应用程序、网络设备和远程主机的日志信息收集起来,并将其写入本地日志文件或者通过网络发送到其他系统中进行集中管理。

rsyslogd 支持多种运行模式和输出方式,可以将日志信息输出到本地文件、远程服务器、数据库、消息队列等不同的系统组件中。此外,rsyslogd 还支持日志信息的压缩、加密和数字签名等安全性功能,确保收集和传输的日志信息的完整性和机密性。

总之,rsyslogd 是一个强大而灵活的 Linux 系统日志管理工具,可以帮助系统管理员更好地管理和维护系统日志信息。

2.rsyslogd对比

rsyslogd 相比 syslogd 具有一些新的特点:

  • 基于TCP网络协议传输日志信息。
  • 更安全的网络传输方式。
  • 有日志信息的即时分析框架。
  • 后台数据库。
  • 在配置文件中可以写简单的逻辑判断。
  • 与syslog配置文件相兼容。

rsyslogd 日志服务更加先进,功能更多。但是,不论是该服务的使用,还是日志文件的格式,其实都是和 syslogd 服务相兼容的,所以学习起来基本和 syslogd 服务一致。

3.命令查看rsyslogd状态

在 Linux 中,您可以通过运行以下命令来检查 rsyslogd 服务是否正在运行:

systemctl status rsyslog

如果 rsyslogd 服务正在运行,则该命令会输出服务的状态信息,包括服务名称、进程号、启动时间、CPU 使用率等。

在大多数 Linux 发行版中,rsyslogd 服务默认是开机自启动的。这意味着,在系统启动时,rsyslogd 服务会自动启动并开始收集和处理系统日志信息。

当然,具体是否开机自启可以通过运行以下命令来检查:

systemctl is-enabled rsyslog

如果该命令返回“enabled”则表示 rsyslogd 服务已设置为开机自启动;如果返回“disabled”则表示 rsyslogd 服务未设置为开机自启动。

如果 rsyslogd 服务未设置为开机自启动,您可以使用以下命令来启用它:

sudo systemctl enable rsyslog

此命令将在系统启动时自动启动 rsyslogd 服务。

通常情况下,建议将 rsyslogd 服务设置为开机自启动,以便及时收集和处理系统日志信息,发现并解决问题。

4.服务管理

系统中的绝大多数日志文件是由 rsyslogd 服务来统一管理的,只要各个进程将信息给予这个服务,它就会自动地把日志按照特定的格式记录到不同的日志文件中。也就是说,采用 rsyslogd 服务管理的日志文件,它们的格式应该是统一的。 在 Linux 系统中有一部分日志不是由 rsyslogd 服务来管理的,比如 apache 服务,它的日志是由 Apache 软件自己产生并记录的,并没有调用 rsyslogd 服务。但是为了便于读取,apache 日志文件的格式和系统默认日志的格式是一致的。

三.日志文件

日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。这些信息有些非常敏感,所以在 Linux 中这些日志文件只有 root 用户可以读取。

1.重要日志文件说明

在大多数 Linux 发行版中,系统日志文件通常保存在 /var/log 目录下。这个目录包含了许多不同的日志文件,每个日志文件都用于记录特定类型的日志信息。

日志文件说明
/var/log/cron记录与系统定时任务相关的日志
/var/log/cups/记录打印信息的日志
/var/log/dmesg记录了系统在开机时内核自检的信息。也可以使用 dmesg 命令直接查看内核自检信息
/var/log/btmp记录错误登录的日志。这个文件是二进制文件,不能直接用 Vi 查看,而要使用 lastb 命令查看
/var/log/lastlog记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接用 Vi 查看。而要使用 lastlog 命令查看
/var/log/maillog记录邮件信息的日志
/var/log/messages它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,已经用户自定义安装软件的日志,也会在这里列出
/var/log/secure记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh 的登录、su 切换用户,sudo 授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件。不能直接用 Vi 查看,而要使用 last 命令查看
/var/run/utmp记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用 Vi 查看,而要使用 w、who、users 等命令查看

2.文件格式

只要是由日志服务 rsyslogd 记录的日志文件,它们的格式就都是一样的。所以我们只要了解了日志文件的格式,就可以很轻松地看懂日志文件。

日志文件的格式包含以下 4 列:

  • 事件产生的时间。
  • 产生事件的服务器的主机名。
  • 产生事件的服务名或程序名。
  • 事件的具体信息。

例如,下面是一条典型的系统日志信息的格式:

May 12 00:00:01 hostname kernel: printk: 1 message suppressed.

其中,“May 12 00:00:01” 表示时间戳,“hostname” 表示主机名,“kernel” 表示日志源头(内核),而 “printk: 1 message suppressed.” 则表示日志内容。不同的日志级别,如 DEBUG、INFO、WARNING 和 ERROR 等,会以不同的颜色或标识显示在日志文件中,方便管理员快速定位和处理问题。

总之,rsyslogd 记录的日志文件一般采用文本格式并包含时间戳、日志级别、来源和内容等信息。

其实分析日志既是重要的系统维护工作,也是一项非常枯燥和烦琐的工作。如果我们的服务器出现了一些问题,比如系统不正常重启或关机、用户非正常登录、服务无法正常使用等,则都应该先查询日志。

实际上,只要感觉到服务器不是很正常就应该查看日志,甚至在服务器没有什么问题时也要养成定时查看系统日志的习惯。

3.配置文件

rsyslogd 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说,日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。

/etc/rsyslog.conf 是 rsyslog 服务的主要配置文件,它用于指定日志消息如何被接收、处理和转发。

rsyslog.conf 文件的格式是基于模块的,并且由一系列指令和参数组成。其中,每个指令都以一个美元符号($)开头,后面跟着指令的名称和参数。下面是一个简单的 rsyslog.conf 配置文件的示例:

# This is a sample rsyslog configuration file.

# Load the kernel log module
$ModLoad imklog

# Set the default logging action to be "standard output"
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

# Log messages from the local system
local0.* /var/log/local-messages.log

在此示例中,我们首先加载了名为 imklog 的内核日志模块。接下来,我们设置了默认的日志记录行为并指定了一些参数,例如将日志文件的权限设置为 0640 等。最后,我们指定了一条规则,该规则将所有使用 local0 设施的消息写入 /var/log/local-messages.log 文件中。

中间的命令我们不去了解,主要是理解最后一行。它的格式可以理解为服务名称[连接符号]日志等级 日志记录位置

服务名称:我们首先需要确定 rsyslogd 服务可以识别哪些服务的日志,也可以理解为以下这些服务委托 rsyslogd 服务来代为管理日志。

服务名称说明
auth(LOG_AUTH)安全和认证相关消息 (不推荐使用authpriv替代)
authpriv(LOG_AUTHPRIV)安全和认证相关消息(私有的)
cron(LOG_CRON)系统定时任务cront和at产生的日志
daemon(LOG_DAEMON)与各个守护进程相关的曰志
ftp(LOG_FTP)ftp守护进程产生的曰志
kern(LOG_KERN)内核产生的曰志(不是用户进程产生的)
Iocal0-local7(LOG_LOCAL0-7)为本地使用预留的服务
lpr(LOG_LPR)打印产生的日志
mail(LOG_MAIL)邮件收发信息
news(LOG_NEWS)与新闻服务器相关的日志
syslog(LOG_SYSLOG)存储syslogd服务产生的曰志信息(虽然服务名称已经改为rsyslogd,但是很多配置依然沿用了syslogd服务的,所以这里并没有修改服务名称)
user(LOG_USER)用户等级类别的日志信息
uucp(LOG_UUCP)uucp子系统的日志信息,uucp是早期Linux系统进行数据传递的协议,后来也常用在新闻组服务中。

连接符号:在这里,连接符号可以被识别为以下三种。

  1. “.”代表只要比后面的等级高的(包含该等级)日志都记录。比如,“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录。
  2. “.=”代表只记录所需等级的日志,其他等级的日志都不记录。比如,“*.=emerg”代表人和日志服务产生的日志,只要等级是emerg等级,就记录。这种用法极少见,了解就好。
  3. “.!”代表不等于,也就是除该等级的日志外,其他等级的日志都记录。

日志等级

下面是常见的日志等级列表:

  • DEBUG:用于详细记录系统或应用程序的内部状态、变量值和事件信息,通常只在调试时使用。
  • INFO:表示一般性的系统状态和事件信息,例如服务启动、关机、重启等,通常用于跟踪系统运行情况。
  • NOTICE:表示正常但重要的事件信息,例如配置文件更改、用户登录、系统警报等。
  • WARNING:表示一个非致命错误或异常发生,比如磁盘空间不足、网络连接中断等,可以引起注意但不会导致系统崩溃。
  • ERROR:表示一个异常发生,可能会影响系统的正常运行,需要立即检查并修复。
  • CRITICAL:表示一个严重的错误或问题发生,可能会导致系统崩溃或数据丢失,需要立即采取行动。
  • ALERT:表示一个需要紧急处理的错误或问题发生,需要发送警报或提示,以便管理员立即采取行动。
  • EMERGENCY:表示一个严重的系统崩溃或停机事件发生,需要立即通知所有相关人员,并进行紧急处理。
  • *:代表所有日志等级。比如,“authpriv.*”代表amhpriv认证信息服务产生的日志,所有的日志等级都记录

这些日志等级通常根据其重要性和紧急程度排序。在实际应用中,我们可以根据需要自定义额外的日志等级,以适应特定的业务需求。

四.日志设置

1.服务器设置

假设我需要管理几十台服务器,那么我每天的重要工作就是查看这些服务器的日志,可是每台服务器单独登录,并且查看日志非常烦琐,我可以把几十台服务器的日志集中到一台日志服务器上吗?这样我每天只要登录这台日志服务器,就可以查看所有服务器的日志,要方便得多。

如何实现日志服务器的功能呢?其实并不难,不过我们首先需要分清服务器端和客户端。假设服务器端的服务器 IP 地址是 192.168.0.210,主机名是 localhost.localdomain;客户端的服务器 IP 地址是 192.168.0.211,主机名是 www1。我们现在要做的是把 192.168.0.211 的日志保存在 192.168.0.210 这台服务器上。

要实现这个功能,我们需要在每台服务器上配置 rsyslog,并将其配置为向日志服务器发送日志消息。具体步骤如下:

  1. 在日志服务器上安装并配置 rsyslog 服务,以接收远程服务器发送来的日志数据。

  2. 在每台客户端服务器上,编辑 /etc/rsyslog.conf 文件,将日志消息重定向到日志服务器上。例如,可以添加以下行:

    *.* @192.168.0.210:514
    

    这表示将所有产生的日志消息都发送到 IP 地址为 192.168.0.210、端口号为 514 的服务器上。如果想使用 TCP 协议传输,则将 @ 替换为 @@

  3. 重新启动 rsyslog 服务以应用更改。

通过以上步骤,你就可以将多台服务器的日志发送到一台集中管理的日志服务器上了。注意,在实际应用中,还需要根据实际情况选择合适的日志级别,并进行适当的过滤和筛选,以保证日志信息的准确性和实用性。

前提:我们知道,使用“@IP:端口”或“@@IP:端口”的格式可以把日志发送到远程主机上。

补充:*.* 是一个通配符,表示匹配所有的设备和日志级别。在这个例子中,*.* 表示将所有设备产生的所有日志消息都发送到 IP 地址为 192.168.0.210、端口号为 514 的服务器上。

设备和日志级别是 rsyslog 中用于过滤和分类日志消息的两个重要概念。在日志消息中,设备标识符用于指定该消息的来源,例如 auth 设备标识符对应系统认证和安全相关的日志消息,而 mail 设备标识符则对应邮件服务器产生的日志消息。日志级别则用于指定该消息的重要性和紧急程度,如 DEBUGINFOWARNING 等等。

使用通配符 *.* 可以将所有设备和所有日志级别的日志消息都发送到远程服务器上。实际上,这种方式并不推荐,因为可能会导致远程日志服务器的存储空间被大量占用,而且也不利于管理员查找和分析日志信息。一般来说,应该根据实际需要选择合适的设备和日志级别,并进行筛选和过滤,以保证日志信息的准确性和实用性。

2.日志轮替(日志转储)

日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围时就删除。

旧的日志文件改名之时,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”参数。

如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,如“secure-20130605”。这样日志文件名不会重叠,也就不需要对日志文件进行改名,只需要保存指定的日志个数,删除多余的日志文件即可。

如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志;当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志;以此类推。

logrotate 就是用来进行日志轮替(也叫日志转储)的,也就是把旧的日志文件移动并改名,同时创建一个新的空日志文件用来记录新日志,当旧日志文件超出保存的范围时就删除。

3.logrotate配置文件

logrotate 是一个 Linux 系统中常用的日志文件管理工具,它可以自动地对系统中的日志文件进行轮转、压缩和删除,以保持日志文件的大小和数量在可控范围内。

logrotate 的配置文件通常位于 /etc/logrotate.conf/etc/logrotate.d/ 目录下,其格式如下:

/path/to/log/file {
    rotate count
    [weekly|daily|monthly]
    [compress|nocompress]
    [delaycompress]
    [missingok]
    [notifempty]
    [sharedscripts]
    [postrotate command]
}

其中,/path/to/log/file 表示要进行轮转和管理的日志文件路径;rotate count 表示保留日志文件的个数,超过这个数量就会删除较早的文件;weekly|daily|monthly 表示轮转间隔,可以按周、日或月来轮转;compress|nocompress 表示是否压缩轮转后的日志文件;delaycompress 表示延迟压缩,即等到下一次轮转时再压缩;missingok 表示如果日志文件不存在,则忽略它而不报错;notifempty 表示如果日志文件为空,则不进行轮转;sharedscripts 表示所有轮转操作都在一个脚本里执行,从而避免启动多个进程;postrotate command 表示在轮转完成后执行的命令,例如重新启动相关服务。

例如,下面是一个简单的 logrotate 配置文件示例,用于管理 Apache Web 服务器产生的访问日志:

/var/log/httpd/access_log {
    rotate 7
    daily
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

这个配置文件将对 /var/log/httpd/access_log 日志文件进行轮转和管理,保留最近 7 个日志文件,每天轮转一次,并压缩轮转后的日志文件。如果日志文件不存在,则忽略;如果日志文件为空,则不进行轮转;所有轮转操作都在同一个脚本中执行,避免了多个进程同时启动的问题。在轮转完成后,会重新加载 Apache 服务以应用更改。

4.自己加入日志轮替

如果有些日志默认没有加入日志轮替(比如源码包安装的服务的日志,或者自己添加的日志),那么这些日志默认是不会进行日志轮替的,这样当然不符合我们对日志的管理要求。如果需要把这些日志也加入日志轮替,那该如何操作呢?

这里有两种方法:

  • 第一种方法是直接在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略,从而把日志加入轮替;
  • 第二种方法是在 /etc/logrotate.d/ 目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被包含到主配置文件中,所以也可以把日志加入轮替。

我们推荐第二种方法,因为系统中需要轮替的日志非常多,如果全部直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。

五.补充知识

1.logrotate

logrotate是Linux系统中用于管理日志文件的工具,可以定期自动地对日志文件进行轮换、压缩和删除。使用logrotate命令可以设置日志轮换的相关参数,如轮换周期、保留日志文件的数量等等。

下面是logrotate命令的基本用法:

logrotate [options] <config-file>

其中,<config-file>参数指定logrotate配置文件的路径。logrotate配置文件包含了日志文件的路径、轮换周期、保留日志文件的数量等参数。

下面是一些常用的选项:

  • -d:调试模式,打印出debug信息
  • -f:强制执行日志轮换,即使没有到达轮换周期
  • -v:详细输出日志轮换的信息

例如,以下是一个简单的logrotate配置文件示例:

/var/log/messages {
    rotate 5
    weekly
    compress
    missingok
    notifempty
}

该配置文件表示对/var/log/messages文件进行轮换,保留5个备份文件,每周轮换一次,压缩备份文件,如果日志文件不存在则忽略,如果日志文件为空则不轮换。

要执行该配置文件,可以使用以下命令:

logrotate -f /etc/logrotate.d/messages

以上命令会执行/etc/logrotate.d/messages配置文件,并强制执行日志轮换。

2.logwatch

Logwatch是一个日志分析和报告工具,可用于监视系统的各种日志文件,并生成易于阅读的摘要报告。它可以自动扫描系统日志文件并将有用信息汇总到单个报告中,这使得管理员可以很容易地检查系统是否出现异常或攻击,也可以作为一种安全审计工具来使用。

下面是Logwatch的基本用法:

  1. 安装Logwatch

首先需要安装Logwatch,可以使用Linux系统自带的包管理器进行安装。以Ubuntu系统为例,可以使用以下命令安装:

sudo apt-get install logwatch
  1. 配置Logwatch

Logwatch的配置文件位于/etc/logwatch/目录下,其中logwatch.conf文件是主配置文件,conf目录下的其他文件则是不同服务的配置文件。可以根据需要修改这些文件来调整日志分析和报告的行为。

  1. 运行Logwatch

Logwatch可以通过命令行或者CRON定时任务的方式运行。

命令行运行:

sudo logwatch

这会生成当前系统日志的报告输出到控制台上。

通过CRON定时任务运行:

可以编辑/etc/cron.daily/00logwatch文件来配置日志报告的生成时间和输出方式。

例如,以下是一个简单的00logwatch文件示例:

#!/bin/sh

# Run logwatch on the logs
/usr/sbin/logwatch --output mail --mailto admin@example.com

该文件表示每天运行一次Logwatch,并将报告通过邮件发送到admin@example.com邮箱。

以上就是Logwatch的基本用法。可以通过修改配置文件和命令行参数来调整Logwatch的行为,以满足不同的需求。

3.配置Logwatch

Logwatch的配置文件位于/etc/logwatch/目录下,其中logwatch.conf文件是主配置文件,conf目录下的其他文件则是不同服务的配置文件。可以根据需要修改这些文件来调整日志分析和报告的行为。

以下是一个简单的Logwatch配置示例:

  1. 打开/etc/logwatch/conf/logwatch.conf文件并修改以下参数:
# 设置邮件发送者
MailFrom = logwatch@example.com

# 设置邮件接收者
MailTo = admin@example.com

# 设置日志报告生成的时间段(默认为昨天)
Range = between -7 days and -1 days

# 设置日志报告的输出方式
Output = mail

# 设置日志报告的详细级别
Detail = Low
  1. 打开需要监控的服务配置文件(例如/etc/logwatch/conf/services/sshd.conf),修改以下参数:
# 设置日志文件路径
LogFile = /var/log/auth.log

# 设置日志报告的标题
Title = "SSH Authentication"
  1. 保存并关闭配置文件,然后使用以下命令运行Logwatch并生成日志报告:
sudo logwatch

这会将日志报告输出到终端上。

  1. 如果要通过邮件发送报告,请设置smtp服务器信息,并在/etc/cron.daily/00logwatch文件中指定--mailto选项,如下所示:
#!/bin/sh

/usr/sbin/logwatch --output mail --mailto admin@example.com --smtpserver smtp.example.com

注意,以上仅是一个简单的Logwatch配置示例,实际应用中可能需要根据具体需求进行更复杂的配置。

六.说明

新星计划:Linux运维@刘晨阳导师创作打卡8!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。