您现在的位置是:首页 >学无止境 >rsyslog.service:记录日志文件的服务网站首页学无止境

rsyslog.service:记录日志文件的服务

凤凰战士芭比Q 2024-06-17 11:26:50
简介rsyslog.service:记录日志文件的服务

rsyslog.service:记录日志文件的服务

Linux日志文件主要由rsyslog.service负责,那么你的Linux是否启动rsyslog呢?而且是否设置了开机时启动?

[root@localhost ~]# ps aux |grep rsyslog
root       1084  0.0  0.0 216400  4092 ?        Ssl  14:26   0:00 /usr/sbin/rsyslogd -n
# 确实有启动的,daemon执行文件名为rsyslogd
[root@localhost ~]# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2023-05-16 14:26:44 CST; 2h 46min ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 1084 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─1084 /usr/sbin/rsyslogd -n

# 也有启动这个服务,也有默认开机时也要启动这个服务

那么rsyslog.serivce这个服务已经在系统中工作了。那么rsyslog.service的配置文件在哪里?如何设置?如果你的Linux主机想要当作整个网络的日志文件服务器时,又该如何设置?

rsyslog.service的配置文件:/etc/rsyslog.conf

什么?日志文件还有配置文件吗,不是,是rsyslogd有一个主要的配置文件,即/etc/rsyslog.conf,用于配置记录哪些服务、哪个等级的信息以及将它们记录在哪里(设备或文件)。这个配置文件非常重要,因为它规定了日志记录的行为和位置。在这个配置文件中,用户可以通过指定不同的规则和模板来控制日志记录的行为。

服务名称[.=!]信息等级    信息记录的文件名或设备或主机
# 下面以mail这个服务产生的info等级为例
mail.info           /var/log/maillog_info
# 这一行说明:mail服务产生的大于等于info等级的信息,都记录到/var/log/maillog_info文件中的意思

我们将上面的数据简单的分为三个部分来说明:

服务名称

Linux内核的syslog支持的服务类型主要有下面这些

相对序号服务类型说明
0kern(kernel)用于记录内核相关的消息。
1user用于记录用户级别的消息。
2mail用于记录邮件相关的消息
3daemon用于记录守护进程相关的消息,例如systemd的信息就与这个有关
4auth用于记录安全相关的消息,如用户登录、身份验证等。
5syslog用于记录系统日志相关的消息。
6Ipr用于记录打印相关的消息。
7news用于记录新闻组相关的消息。
8uucp用于记录UUCP相关的消息。
9cron用于记录计划任务相关的消息(cron,at)
10authpriv与auth类似,但仅记录对安全性有影响的消息。
11ftp与FTP通讯协议有关的信息输出
16~23local0~local7用于用户自定义的日志记录服务,可以根据需要进行配置。

上面谈到的都是Linux内核的syslog函数自行制订的服务名称,软件开发商可以通过调用上述的服务名称来记录它们的软件。

信息等级

同一个服务所产生的信息也是有差别的,有启动时仅通知系统而已的一般信息(informantion),有出现还不至于影响到正常运行的警告信息(warn),还有系统硬件发生严重错误时,所产生的重大问题信息(error)。信息到底有多少种严重的等级?基本上,Linux内核的syslog将信息分为8个主要的等级,根据syslog.h的定义,信息名称与数值的对应如下:

等技数值等级名称说明
7debug这是最低级别的日志信息,表示调试信息,通常用于调试应用程序或系统问题,只有在调试过程中才会产生这种级别的日志信息。
6info这个级别表示一般的信息事件,如应用程序启动、停止、用户登录、注销等。
5notice这个级别表示需要注意的事件,如系统启动、停止、重新加载配置文件等。
4warning
(warn)
这个级别表示系统中发生了警告事件,如硬盘空间不足、系统资源占用过高等。
3err
(error)
这个级别表示系统中发生了错误,但不会影响系统的整体稳定性,如应用程序错误、系统配置错误等。
2crit这个级别表示需要立即采取行动,但不会影响系统的整体稳定性,如系统资源不足、网络连接中断等。
1alert这个级别表示需要立即采取行动,但不会影响系统的整体稳定性,如严重的应用程序错误。
0emerg
(panic)
这是最高级别的日志信息,表示系统已经不可用,需要立即采取行动,如系统崩溃、硬件故障等。通常只有在最严重的情况下才会产生这种级别的日志信息。

基本上,在0(emerg)到6(info)的等级之间,等级数值越高代表越没事,等级靠近0则代表系统出现致命问题。

除了常规的0-6等级之外,还有两个特殊等级:debug和none。

  • Debug等级:该等级主要用于开发人员进行调试和测试时使用。在此等级下,程序会输出更详细的信息以供开发人员进行调试。
  • None等级:该等级主要用于禁止输出日志信息。在此等级下,程序不会输出任何日志信息,可以用于生产环境中减少日志输出对性能的影响。

当我们想要做一些错误检测,或是忽略掉某些服务的信息时,就用这两个东西。

信息等级之前还有【.=!】的连接符号,它代表的意思是这样的:

  • .:代表【比后面还要严重的等级(含该等级)都被记录下来】的意思,例如:mail.info 代表只要是mail的信息,而且该信息等级严重于info(含info本身)时,就会被记录下来的意思。
  • .=:代表所需要的等级就是后面接的等级而已,其他的不要
  • .!:代表不等于,就是除了该等级外的其他等级都记录。

一般来说,我们比较常用的是【.】这个连接符号

信息记录的文件名或设备或主机

再来则是这个信息要放置哪里的设置。下面是一些常见的放置处

  • 文件的绝对路径:通常就是放在/var/log 里面的文件
  • 打印机或其他:例如 /dev/lp0 这个打印机设备
  • 用户名称:显示给用户
  • 远程主机:例如 @localhost 当然,要对方主机也能支持才行
  • *:代表【目前在线的所有人】,类似wall这个命令的意义

服务、daemon与函数名称

syslog是一种系统日志服务,可以帮助收集和记录系统中发生的各种事件和错误信息,以便于系统管理员进行故障排除和性能优化。在Linux系统中,syslog通常由rsyslogd服务来管理。下面对syslog、rsyslogd和rsyslog-service进行详细解释:

  1. syslog
    syslog是一种标准的系统日志服务,用于记录各种系统事件和错误信息,包括系统启动和停止、用户登录和注销、应用程序错误等。syslog将日志信息存储在本地或远程的日志服务器上,以便于系统管理员进行查看和分析。
  2. rsyslogd
    rsyslogd是一种syslog服务的实现,它是Linux系统上最常用的syslog服务程序之一。rsyslogd可以通过配置文件进行自定义设置,以便于满足不同的系统日志需求。rsyslogd还支持通过网络将日志信息发送到远程日志服务器,以便于进行集中管理和分析。
  3. rsyslog-service
    rsyslog-service是Linux系统上的一个systemd服务单元,它用于管理rsyslogd服务的启动、停止和重启。rsyslog-service可以通过systemctl命令进行管理,例如:
  • systemctl start rsyslog:启动rsyslogd服务;

  • systemctl stop rsyslog:停止rsyslogd服务;

  • systemctl restart rsyslog:重启rsyslogd服务。
    使用rsyslog-service可以方便地管理rsyslogd服务,并确保其在系统启动时自动启动。

    总之,syslog是一种系统日志服务,rsyslogd是其实现之一,rsyslog-service是用于管理rsyslogd服务的systemd服务单元。通过使用rsyslogd和rsyslog-service,可以方便地管理系统日志,并进行故障排除和性能优化。

rsyslog.conf 语法练习

  1. 如果我要将我的mail相关的数据写入 /var/log/maillog当中,那么在/etc/rsyslog.conf的语法如何设计?
mail.info  /var/log/maillog

当我们等级使用info 时,那么【任何严重于info等级(含info这个等级)之上的信息,都会被写入到后面接的文件之中。】这样我们就可以将所以mail的登录信息都记录在/var/log/maillog里面

  1. 我要将新闻组数据(news)及计划任务(cron)的信息都写入到一个称为/var/log/cronnews的文件种,但是这两个程序的警告信息则额外地记录在 /var/log/cronnews.warn中,那么应该如何设置rsyslog.conf?

很简单,既然是两个程序,那么只要以分号来隔开了,此外,由于在第二个文件中我只要记录警告信息,因此设置上需要指定【.=】这个符号,所以语法称为了:

news.*;cron.* /var/log/cronnews
news.=warn;cron.=warn  /var/log/cronnews.warn

代码解释

这是两个rsyslog.conf的日志处理规则示例:

  • news.*;cron.* /var/log/cronnews
    这个规则将所有news和cron类别的日志消息记录到/var/log/cronnews文件中。其中,星号(*)表示匹配所有的消息级别,分号(;)用于分隔多个规则。因此,这个规则将匹配所有news和cron类别的日志消息,并将其记录到/var/log/cronnews文件中。

  • news.=warn;cron.=warn /var/log/cronnews.warn
    这个规则将所有news和cron类别的日志消息中级别为warn的记录到/var/log/cronnews.warn文件中。其中,等号(.=)用于仅匹配指定级别的消息,因此这个规则将仅匹配级别为warn的消息,并将其记录到/var/log/cronnews.warn文件中。

此外你需要注意的是,news与cron的警告信息也会写入/var/log/cronnews内。

  1. 我的messages这个文件需要记录所有的信息,但是就是不想要记录cron、mail及news的信息,那应该怎么写才好?

有两种写法,分别是:

*.*;news,cron,mail.none  /var/log/messages
*.*;news.none;cron.none;maill.none  /var/log/messages

代码解释

  • *.*;news,cron,mail.none /var/log/messages
    这个规则将所有日志消息记录到/var/log/messages文件中,但排除了news、cron和mail类别的日志消息。其中,星号(*)表示匹配所有的消息级别,分号(;)用于分隔多个规则。因此,这个规则将匹配所有日志消息,并将其记录到/var/log/messages文件中,但排除了news、cron和mail类别的日志消息。

  • *.*;news.none;cron.none;mail.none /var/log/messages
    这个规则与第一个规则类似,也是将所有日志消息记录到/var/log/messages文件中,但排除了news、cron和mail类别的所有日志消息。不同的是,这个规则使用了none关键字来排除指定类别的日志消息。因此,这个规则将仅匹配除news、cron和mail类别之外的所有日志消息,并将其记录到/var/log/messages文件中。

Centos7.x默认的rsyslog.conf内容

了解完语法后,来看看rsyslogd有哪些系统服务已经记录了?就是看看/etc/rsyslog.conf这个文件的默认内容。

#kern.*                                                 /dev/console
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

上面总共仅有8行设置值,每一行的意义是这样的:

  1. #kern.*:只要是内核产生的信息,全部都送到console(终端)去。console通常是由外部设备连接到系统而来,举例来说,很多封闭型主机(没有键盘、屏幕的系统)可以通过连接RS232接口将信息传输到外部的系统中,例如以笔记本电脑连接到封闭主机的RS232插口。这个项目通常应该是用在系统出现严重问题而无法使用默认的屏幕观察系统时,可以通过这个项目来连接获取内核的信息。
  2. *.info;mail.none;authpriv.none;cron.none:由于mail、authpriv、cron等类别产生的信息较多,且已经写入到下面的数个文件中,因此在/var/log/messages 里面就不记录这些项目,除此之外的其他信息都写入/var/log/messages中。这也是为什么说这个messages文件很重要的缘故。
  3. authpriv.*:认证方面的信息均写入 /var/log/secure文件
  4. mail.*:邮件方面的信息则均写入 /var/log/maillog文件
  5. cron.*:计划任务均写入 /var/log/cron文件
  6. *.emerg:当产生最严重的错误等级时,将该等级的信息以wall的方式广播给所有系统登录的账号,要这么做的原因是希望在线的用户能够赶紧通知系统管理员来处理这种错误问题
  7. uucp,news.crit:uucp是早期UNIX-like系统进行数据传递的通讯协议,后来常用在新闻组,news则是新闻组。当新闻组方面的信息由严重错误时就写入 /var/log/spooler文件中。
  8. local7.*:将本机启动时应该显示到屏幕的信息写入到/var/log/boot.log文件中。

上面的第四行关于mail的记录中,在记录的文件 /var/log/maillog前面还有个减号【-】是干什么用的?由于邮件所产生的信息比较多,因此我们希望邮件产生的信息先存储在速度较快的内容缓冲区中(buffer),等到了数据量大了才一次性地将所有数据都写入磁盘,这样将有助于日志文件的读取性能。只不过由于信息是暂存在内存中的,因此若不正常关机导致登录信息未回写到日志文件中,可能会造成部分数据的丢失。

此外,每个Linux发行版的rsyslog.conf 设置差异是颇大的,如果你想要找到对应的登录信息时,要查看一下 /etc/rsyslog.conf这个文件才行,否则可能会分析到错误的信息。

自行增加日志文件文件功能

如果你想要将【所有的信息】都额外写入到/var/log/admin.log这个文件时,你该怎么做呢?

  1. 先设置好所需添加的参数
[root@localhost ~]# vim /etc/rsyslog.conf
# Add by localhost 2023/5/17            # 自己修改时加入一些说明
*.info    /var/log/admin.log
  1. 重新启动rsyslogd
[root@localhost ~]# systemctl restart rsyslog.service
[root@localhost ~]# ll /var/log/admin.log 
-rw-------. 1 root root 816 517 10:18 /var/log/admin.log
# 可以看到已经建立了日志文件

如此一来,所有信息都会写入 /var/log/admin.log

日志文件的安全性设置

上面说了rsyslog.conf的重要性,所以,如果你幻想你是一个很厉害的黑客,想利用他人的计算机干坏事,然后又不想留下证据,你可以在离开的时候所以可能的信息都给它抹掉,所以第一个动脑筋的地方就是日志文件的清除工作,如果你的日志文件不见了该怎么办?

怎么防止日志文件被删除?或是被root自己不小心修改?我们可以通过一个隐藏的属性来设置你的日志文件,成为【只可以增加数据,但是不能删除】的状态,那么或许可以达到些许的保护。不过,如果你的root账号被破解,那么下面的设置还是无法保护的,因为你要记得【root是可以在系统上面进行任何事情的】,因此请将你的root这个账号密码设置得安全一点。

当你修改完rsyslog.conf文件时使用:wq来退出vim的环境,但是rsyslogd的日志文件只要【被编辑过】就无法继续记录,所以才会导致不能记录问题,此时你要改变使用vim的习惯,重新启动rsyslog.service让它继续提供服务。

既然如此,那么我们就可以使用隐藏属性了!之前前写过的一篇博客:Linux文件与目录的默认权限与隐藏权限(chattr,lsattr) 我们可以使用chattr设置 i 这个属性,那么该文件来连root都不能删除,而且也不能新增数据,很安全。但是,如此一来日志文件岂不是消失了?因为没法写入。所以,我们要使用的是 a 这个属性,你的日志文件如果设置了这个属性,那么它将只能被增加,而不能被删除,这个属性就非常符合我们对日志文件的需求

[root@localhost ~]# chattr +a /var/log/admin.log 
[root@localhost ~]# lsattr /var/log/admin.log 
-----a---------- /var/log/admin.log

加入了这个属性之后,你的 /var/log/admin.log 日志文件从此就仅能被增加,而不能被删除,直到root以【chattr -a /var/log/admin.log】取消这个 a 的参数之后,才能被删除或移动。

这个标识最大的用处除了在保护你的日志文件的数据外,它还可以帮助你避免不小心写入日志文件的状况。要注意的是,当【你不小心“手动”修改过日志文件后,例如 /var/log/messages 你不小心用vi打开它,离开却执行:wq参数,那么该文件未来将不会继续进行记录操作】,这个问题经常发生。由于你以vi 存储了日志文件,则rsyslogd会误判未该文件已被修改过了。将导致rsyslogd不在写入新内容到该文件。

要让日志文件可以继续写入,你只要重新启动 rsyslogd.service 即可,不过,总是比较麻烦。所以,如果你针对日志文件执行 chattr +a 参数,未来你就不需要害怕不小心修改到该文件了。因为无法写入,除了可以新增之外。

不过应为这个 +a 的属性让该文件无法被删除与修改,所以,当我们进行日志文件轮循(logrotate),将无法重命名日志文件,所以会造成很大的困扰。所以还是将日志文件的 +a拿掉

[root@localhost ~]# chattr -a /var/log/admin.log 
[root@localhost ~]# lsattr /var/log/admin.log 
---------------- /var/log/admin.log
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。