Linux日志(rsyslog、logrotate、journalctl、logger) - Go语言中文社区

Linux日志(rsyslog、logrotate、journalctl、logger)


一、日志文件

所谓日志(Log)是指系统所指定对象的某些操作和其操作结果按时间有序的集合。每个日志文件由日志记录组成,每条日志记录描述了一次单独的系统事件

通常情况下,系统日志是用户可以直接阅读的文本文件,其中包含了一个时间戳和一个信息或者子系统所特有的其他信息。日志文件为服务器、工作站、防火墙和应用软件等IT资源相关活动记录必要的、有价值的信息,这对系统监控、查询、报表和安全审计是十分重要的。

日志文件中的记录可提供以下用途:监控系统资源;审计用户行为;对可疑行为进行告警;确定入侵行为的范围;为恢复系统提供帮助;生成调查报告;为打击计算机犯罪提供证据来源

linux主机在后台有相当多的daemons同时在工作,这些工作中的进程总是会显示一些信息,这些重要信息最终会被记录到日志文件中。日志文件可以记录系统在什么时间、哪个主机、哪个服务、出现了什么信息等内容,这些信息也包括用户识别数据。系统故障排除须知等信息,善于利用这些日志信息,当系统出现出现错误时,可以从日志信息定位问题找到解决方案。

(一)Linux常见的日志文件

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

系统日志文件保存在/var/log/目录下,它是用来保存系统的动态数据

  • /var/log/boot.log

    开机启动的时候系统内核会去检测与启动硬件,然后开始启动各种内核支持的功能。这些流程都会记录到该文件中,不过只会存储本次开机启动的信息,之前的启动信息并不会保留下来

  • /var/log/cron

    记录计划任务crontab有没有被执行、执行过程中的错误、以及/etc/crontab是否编写正确等

  • /var/log/dmesg

    记录系统在开机的时候内核检测过程所产生的各项信息

  • /var/log/maillog或/var/log/mail/*

    记录邮件的往来信息。主要是记录postfix(SMTP协议提供者)与dovecat(POP3协议提供者)所产生的信息

  • /var/log/messages

    这个文件相当重要,几乎系统发生的错误信息(或重要信息)都会记录到这个文件中

  • /var/log/secure

    只要涉及到需要帐号密码登录的情况,那么当登陆时(无论登陆正确或错误)都会记录到该文件中。包括系统的login程序,图形用户界面模式登录所使用的gdm、su、sudo等程序,还有网络连接的ssh、telnet等程序,登录信息都会被记录到这里

  • /var/log/wtmp、/var/log/faillog

    这两个文件可以记录正确登录系统者的账户信息(wtmp)与错误登录时所使用的账户信息(faillog)

  • 其他服务的日志文件

除系统默认的日志之外,采用 RPM 包方式安装的系统服务也会默认把日志记录在 /var/log/ 目录中(源码包安装的服务日志存放在源码包指定的目录中)

不过这些日志不是由 rsyslogd 服务来记录和管理的,而是各个服务使用自己的日志管理文档来记录自身的日志。以下介绍的日志目录在你的 Linux 上不一定存在,只有安装了相应的服务,日志才会出现。服务日志如下表 所示:

日志文件说明
/var/log/httpd/RPM包安装的apache服务的默认日志目录
/var/log/mail/RPM包安装的邮件服务的额外日志目录
/var/log/samba/RPM包安装的Samba服务的日志目录
/var/log/sssd/守护进程安全服务目录
/var/log/httpd/RPM包安装的httpd服务的日志目录
/var/log/nginx/RPM包安装的nginx服务的日志目录

(二)日志文件的产生

  1. 由软件开发商自行定义写入的日志文件与相关格式。
  2. 由Linux发行版本自行提供的日志文件管理服务来统一管理。只要将信息丢给这个服务后,它就会自己分门别类地将各种信息放置到相关的日志文件中,Centos提供rsyslog.service这个服务来统一管理日志文件

要注意的是,如果任凭日志文件持续记录的话,由于系统产生的信息天天都有,那么日志文件的容量将会越来越大,如果日志文件容量太大时,可能会导致系统空间不足,以及大文件读写效率不佳等问题

针对日志文件的服务与程序有:

  • systemd-journald.service :最主要的信息记录者,由systemd提供
  • rsyslog.service:主要收集登录系统与网络等服务的信息
  • logrotate:主要在进行日志文件的轮循功能

CenTOS 7.x 使用systemd提供的journalctl日志管理

CenTOS7.x除了既有的rsyslog.service之外,其实最上层还使用了systemd自己的日志文件管理功能,它使用的是systemd-journald.service这个服务。 基本上,系统由systemd所管理,那所有经由systemd启动的服务,如果再启动或结束的过程中发生一些问题或是正常的信息,就会将该信息由systemd-journald.service以二进制的方式记录下来,之后再将这些信息发送给rsyslog.service做进一步的记录。
systemd-journald.service的记录主要放置在内存中,因此在读取方面性能比较好。可以通过journalctl以及systemctl status unit.service 来查看各个不同服务的日志文件

(三)日志文件内容的一般格式

一般来说,系统产生的信息并记录下来的内容中,每条信息均会记录下面几项重要内容:

  1. 事件发生的日期和时间
  2. 发生此事件的主机名
  3. 启动此事件的服务名称(如systemd、crond等)或命令与函数名称(如su、login…)
  4. 该信息的实际内容

这些信息的内容是可以进行更改的,而且,这些信息可以作为系统除错之用。

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

(一)概述

rsyslog是一个快速处理收集系统日志的开源程序,提供了高性能、安全功能和模块化设计。

rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地, rsyslog被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。

对于包括Linux系统,Windows服务器,路由器,交换机及其它主机能在网络上发送日志信息的这类设备,日志服务器都可以用作于它们在网络上的重要日志监控点。通过日志服务器,你能从不同的主机及设备过滤和合并日志信息于一个单一的位置,所以你能很容易的查看及存档日志信息。

rsyslog 作为标准的 syslog 守护进程,预装在了大多数的 Linux 发行版中。在客户端/服务器架构的配置下,rsyslog 同时扮演了两种角色:

  • 一种是配置成日志收集服务器,rsyslog进程可以从网络中收集其它主机上的日志数据,这些主机会将日志配置为发送到另外的远程服务器;
    在这里插入图片描述
    在这里插入图片描述

  • 另一种是配置为客户端,用来过滤和发送内部日志消息并保存到本地目录中(如/var/log)或一台可以路由到的远程rsyslog服务器上。

rsyslog特性:

  1. 支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB,ElasticSearch,等等;
  2. 通过 RELP + TCP 实现数据的可靠传输(基于此结合丰富的过滤条件可以建立一种 可靠的数据传输通道供其他应用来使用);
  3. 精细的输出格式控制以及对消息的强大 过滤能力;
  4. 高精度时间戳;队列操作(内存,磁盘以及混合模式等); 支持数据的加密和压缩传输等。

(二)rsyslog.service的配置文件

==主配置文件:/etc/rsyslog.conf 自定义配置文件:/etc/rsyslog.d/*.conf ==

为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行日志文件的管理,所以,将各种类别服务的日志文件记录在不同的文件里面,就是/etc/rsyslog.conf所要做的规范了

主配置文件 /etc/rsyslog.conf 大概分为三个部分:MODULES、GLOBAL DIRECTIVES、RULES

1. MODULES

用来配置要加载的模块,这个部分是针对接收配置的,主要是指定接收日志的协议和端口。 若要配置日志服务器,则需要将相应的配置项去掉注释。

#### MODULES ####  --->启动/sbin/rsyslogd要加载的模块
格式:$ModLoad module-name #注释
            $ModLoad 是关键字(/sbin/rsyslogd程序中定义的变量名)
            module-name:出现在/lib64/rsyslog/ 中的模块名称,记住不带.so

#### MODULES ####             #定义模块的相关信息,这个部分是针对接收配置的,主要是指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项去掉注释。

$ModLoad imuxsock             #imuxsock模块,支持本地系统日志的模块
$ModLoad imjournal            #imjournal模块,支持对系统日志的访问(此模块与上一模块默认启用)
#$ModLoad imklog              #imklog模块,支持内核日志的模块
#$ModLoad immark              #immark模块,支持日志标记

# Provides UDP syslog reception    #提供远程rsyslog日志的udp协议的接收支持
# $ModLoad imudp                   #imudp模块,用于支持udp协议
# $UDPServerRun 514                #允许通过514端口接收使用udp协议的远程日志(如果要修改为非514的端口, 需要设置selinux)
# Provides TCP syslog reception    #提供远程rsyslog日志的tcp协议的接收支持(如果要修改为非514的端口, 需要设置selinux)
# $ModLoad imtcp                   #imtcp模块,用于支持tcp协议
# $InputTCPServerRun 514           #允许通过514端口接收使用tcp协议的远程日志

模块:

[root@server /lib64/rsyslog]# ls
imdiag.so      lmnsd_ptcp.so  omprog.so
imfile.so      lmregexp.so    omruleset.so
imjournal.so   lmstrmsrv.so   omstdout.so
imklog.so      lmtcpclt.so    omtesting.so
immark.so      lmtcpsrv.so    omuxsock.so
impstats.so    lmzlibw.so     pmaixforwardedfrom.so
imptcp.so      mmanon.so      pmcisconames.so
imtcp.so       mmcount.so     pmlastmsg.so
imudp.so       mmexternal.so  pmrfc3164sd.so
imuxsock.so    mmutf8fix.so   pmsnare.so
lmnet.so       omjournal.so
lmnetstrms.so  ommail.so

2. GLOBAL DIRECTIVES

全局配置,配置ryslog守护进程的全局属性,比如定义日志格式默认模板(日志采集格式)、工作目录

#### GLOBAL DIRECTIVES #### ----->全局规则设定
     格式:
           #注释
           规则内容
      例如:
         # Include all config files in /etc/rsyslog.d/
         $IncludeConfig /etc/rsyslog.d/*.conf		 含义为启动时要读取/etc/rsyslog.d/中所有以.conf为结尾的文件
         $WorkDirectory /var/lib/rsyslog 			 指定工作目录
         
 #### GLOBAL DIRECTIVES ####    #定义全局日志格式的指令;主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog       #工作目录

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat   #定义日志格式默认模板(可以自行设定日志记录格式)

# $ActionFileEnableSync on                             #文件同步功能,很少用,默认禁止

# Include all conifig files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf                   #需要引入的自定义配置文件的路径

$OmitLocalLogging on                                      #关闭通过本地日志接口接收消息,现使用imjournal模块作为替代

# File to store the position in the journal
$IMJournalStateFile imjournal.state                   #将文件存储在日志中

用户可根据需求自定义要记录的日志内容和格式等

模板(templates)

模板允许指定日志信息的内容和格式,也可用于生成动态文件名,在规则中使用

定义如下:

$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]

# 其中TEMPLATE_NAME是模板的名字(自行定义),PROPERTY是rsyslog本身支持的一些属性参数。

系统默认格式为:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

自定义默认的日志格式举例:

第一种: 在【GLOBAL DIRECTIVES】中配置日志采集格式

  1. 全局指令必须以 $ 开头

  2. 内部变量需要使用 一对百分号 括起来

  3. 日志采集格式:$template myFORMAT,“%timegenerated% %FROMHOST-IP% %syslogtag% %msg%n”

    • $template 采集格式定义
    • myFROMAT 模块名,可随意命名
    • %timegenerated% 显示日志时间
    • %FROMHOST-IP% 显示主机IP
    • %syslogtag% 日志记录目标
    • %msg% 日志内容,或者%rawmsg%
    • n 换行符
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# 在配置文件的【GLOBAL DIRECTIVES】区域添加以下一行
$template myFORMAT,“%timegenerated% %FROMHOST-IP% %syslogtag% %msg%n”

如果像以上这样配置,那么要想采用默认的日志格式(即RSYSLOG_TraditionalFileFormat), 则在每条规则后不需要做其他任何设置;对于需要使用自定义日志格式(模块)的规则就需要在日志文件后添加自定义的模板名, 并用;号分隔

authpriv.*      /var/log/secure;myFROMAT
*.*      /var/log/test;myFROMAT

第二种: 用于生成动态文件名(主要用于rsyslog日志服务器中的配置)

$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"	 # 定义存放日志文件的名称
$template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log"

*.info ?DailyPerHostLogs  #将所有服务info及以上级别的日志信息写入到DailyPerHostLogs所指定的文件中
*.* ?DynamicFile

对于动态文件的引用要使用 ? 号

该用法更多的是用于rsyslog日志服务器的配置,因为日志服务器要接收很多主机的日志信息,这样定义便可根据不同主机和不同时间来建立相应的目录存放对应的日志信息

以上第一种和第二种使用方法可以同时配置,不会影响

3. RULES

每条规则规定了【(1)什么服务(2)的什么等级(3)需要执行的操作 】这三个东西

语法:

facility[连接符]priority  action

#facility:可理解为“产生的日志对象”或某些服务;连接符:表示后面日志等级的范围; priority:指定的是日志信息等级;action:表示对符合规则的日志所要采取的措施

# 以mail这个服务产生的info等级为例
mail.info       /var/log/maillog_info
# 此行说明:mail服务产生的大于等于info等级的信息,都记录到/var/log/maillog_info文件中

facility

rsyslog主要还是通过Linux内核提供的syslog相关规范来设置数据的分类,Linux的syslog本身有规范一些服务的信息,可以通过这些服务来存储系统的信息。Linux内核的syslog支持的服务类型主要有以下这些:

相对序号服务类别说明
0kern (kernel)内核产生的信息,大部分都是硬件检测以及内核功能的启用
1user在用户层级所产生的信息
2mail只要与邮件收发有关的信息记录都属于这个
3daemon主要是系统的服务所产生的信息,例如systemd
4auth主要与认证/授权有关的机制,例如login、ssh、su等需要帐号/密码的
5syslog就是由syslog相关协议产生的信息,其实就是rsyslogd这个程序本身产生的信息
6lpr打印相关的信息
7news与新闻组服务器有关的
8uucp全名为UNIX to UNIX COPY Protocol ,早期用于UNIX系统间的程序数据交换
9cron计划任务cron、at等产生信息记录的地方
10authpriv与auth类似,但记录较多账号的私人信息,包括pam模块的运行等
11ftp与FTP通讯协议有关的信息输出
16~23local0~local7保留给本机用户使用的一些日志文件信息,较常与终端互动
*代表所有服务

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

举例来说,sendmail与postfix及dovecot都是与邮件有关的软件,这些软件在设计日志文件记录时,都会主动调用syslog内的mail服务名称。

priority

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

等级数值等级名称说明
7debug用来debug(除错)时产生的数据
6info仅是一些基本的信息说明而已
5notice虽然是正常信息,但比info还需要被注意到的一些信息内容
4warning (warn)警示的信息,可能有问题,但是还不至于影响到某个daemon运行的信息。基本上,Info、notice、warn这三个信息等级都是在告知一些基本信息而已,应该还不至于造成一些系统运行困扰
3err (error)一些重大的错误信息,例如配置文件的某些设置值造成该服务无无法启动的信息说明,通常借由err的错误告知,应该可以了解到该服务无法启动的问题
2crit比err还要严重的错误信息,这个crit是临界点(critical)的缩写,这个错误已经很严重了
1alert警告,已经很有问题的等级,比crit还要严重
0emerge (panic)疼痛等级,意指系统已经几乎要宕机的状态,很严重的错误等级。通常大概只有硬件出现问题,导致整个内核无法顺利运行,就会出现这样的等级的信息

基本上在0(emerge)~6(info)的等级之间,等级数值越高代表越正常,登记靠近0则代表系统出现致命问题。除了0到6之外还有两个比较特殊的等级,那就是debug(错误检测等级)与none(不需要登陆等级)两个,当我们想要做一些错误检测,或是忽略掉某些服务的信息时,就用这两个等级

级别越低产生的日志明细越多,级别越高产生的日志越少但都是危险信息

信息等级之前的连接符:

.		代表【比后面还要严重的等级(含该等级)都被记录下来】的意思,例如mail.info 代表只要是mail的信息,而且该信息等级严重于info(含info本身)时,就会被记录下来的意思
.=		代表所需要的等级就是后面接的等级,其它的不需要
.!		代表不等于,亦即是除了该等级外的其他等级都记录
.*		代表所有级别;若为此则其后无需接日志信息等级
.none	代表没有级别,即忽略、不记录;若为此则其后也无需接日志信息等级

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

action

action指定了对符合规则的信息的处理方式。总的来说,消息内容可以被写到日志文件中,但也可以执行其他动作,比如写到数据库表中或转发到其他主机。

  1. 文件路径:即将日志信息写入指定文件中,通常在/var/log/ ,文件路径前的 - 表示异步写入;文件路径既可以是静态文件也可以是动态文件。动态文件由模板前加 ? 定义。
# 静态文件
*.*     /var/log/file.log   # 绝对路径

# 动态文件
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"	 # 定义存放日志文件的名称
*.* ?DynamicFile
  1. 用户名称:将日志事件通知给指定的用户,* 表示登录的所有用户,类似wall这个命令的意义。
# 发送给用户(需要在线才能收到)
*.*   root
*.*   root,kadefor,up01     # 使用,号分隔多个用户
*.*   *     # *号表示所有在线用户
  1. 远程主机(日志服务器):@server_host ,把日志送往至指定的远程服务器记录。注意,服务器必须要监听tcp或udp的514端口上的服务。其中 @host表示使用udp的协议@@host=表示使用tcp的协议 ;z 表示使用 zlib 压缩,NUMBER 表示压缩级别。多个选项 使用 , 分隔。
# 客户端日志转发到远程日志服务器
*.* @192.168.0.1            # 使用UDP协议转发到192.168.0.1的514(默认)端口
*.* @@192.168.0.1:10514     # 使用TCP协议转发到192.168.0.1的10514(默认)端口

*.*  @(z9)[192.168.1.2:666]  # 表示使用 UDP 将日志发送到 192.168.1.2远程主机的666端口,同时启用 zlib 9 级压缩   
  1. 管道: | COMMAND,转发给其他命令处理。
  2. ^/path/*.sh: ^号后跟可执行脚本或程序的绝对路径,日志内容可以作为脚本的第一个参数,可用来触发报警
#执行脚本

local3.*    ^/tmp/test.sh      # ^号后跟可执行脚本或程序的绝对路径
  1. ~或stop :忽略或丢弃日志。如果接收日志的对象是“~”,则代表这个日志不会被记录,而被直接丢弃。
local3.*   ~    # 忽略所有local3类型的所有级别的日志
&   ~       # 忽略所有的日志
  1. 终端设备:终端可以是/dev/tty0~/dev/tty6,也可以为/dev/console或/dev/lp0打印机设备
*.*     /dev/pts/0

测试:logger -p local3.info ‘this is a test for logger ‘   #logger 命令用于产生日志
  1. 数据库:将日志写入数据库中;格式为: :模块名:ip地址,数据库名,数据库用户名,登陆密码
# 将用户层所产生的notice及以上级别的日志写入本地mysql数据库(数据库名为Rsyslog,数据库用户名为rsysloguser,登录密码为syspass)

user.notice  :ommysql:127.0.0.1,Rsyslog,rsysloguser,syspass
  1. 过滤:过滤特定的日志内容。 比如忽略(丢弃)包含某个字符串的日志;
# 用法:过滤日志, 由:号开头
:msg, contains, “error” /var/log/error.log	#将包含“error”字符串的日志信息存放到/var/log/error.log文件中
:msg, contains, “error” ~         # 忽略包含error的日志

● 服务、daemon与函数名称

服务、daemon与函数说明
syslog这个是Linux内核所提供的日志文件设计指引,所有的要求大概都写入到一个名为syslog.h的头文件中。如果想要开发与日志有关的软件,那就得依据这个syslog函数的总要求去设计才行。
rsyslogd为了要完成实际上进行信息的分类所开发的一个软件,所以,这就是最基本的daemon程序
rsyslog.service为了加入systemd的控制,因此rsyslogd的开发者设计的启动服务脚本设置

逗号和分号的说明:

# 将新闻组数据(news)及计划任务(cron)的信息都写入到名为/var/log/cronnews的文件中,但是
# 这两个程序的警告信息则额外地记录在/var/log/cronnews.warn文件中:
news.*;cron.* /var/log/cronnews
news.=warn;cron.=warn /var/log/cronnews.warn

# messages这个文件记录除过cron、mail、及news之外的所有信息:
*.*;news,cron,mail.none /var/log/messages
# 或
*.*;news.none;cron.none;mail.none /var/log/messages

# 在使用 , 分隔时,那么等级只要接在最后一个即可;如果是以 ; 来分隔的的话,那么就需要将服务与等级都写上

CentOS 7.x 默认的rsyslog.conf的内容

     1	#kern.*                                                 /dev/console
     2	*.info;mail.none;authpriv.none;cron.none                /var/log/messages
     3	authpriv.*                                              /var/log/secure
     4	mail.*                                                  -/var/log/maillog
     5	cron.*                                                  /var/log/cron
     6	*.emerg                                                 :omusrmsg:*
     7	uucp,news.crit                                          /var/log/spooler
     8	local7.*                                                /var/log/boot.log

以上八行的说明:

  1. #kern.* :只要是内核产生的信息,全部都送到console(终端)。console通常是由外部设备连接到系统而来。该项通常应该是用在系统出现严重问题而无法使用默认的屏幕观察系统时,可以通过该项来连接获取内核的信息
  2. *.info;mail.none;authpriv.none;cron.none :由于mail、authpriv、cron等类别产生的信息较多,且已经写入到下面的数个文件中,因此在/var/log/messages里面就不记录这些服务的信息,除此之外的其他信息都写入到/var/log/messages中
  3. authpriv.* :认证方面的信息都写入到/var/log/secure文件中
  4. mail.* :邮件方面的信息均写入到/var/log/maillog文件中;- 号的意思:由于邮件所产生的信息比较多,因此希望邮件所产生的信息先存储在速度较快的内存缓冲区(buffer)中,等到数据量够大了才一次性地将所有数据都写入磁盘,这样有助于日志文件的读取性能。
  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文件中

自定义日志文件

如果有需要,可以自行在rsyslog.conf文件中进行配置,将需要用到的信息记录到指定文件中

[root@server ~]# vim /etc/rsyslog.conf
# Add by user date/time
iptables.*  /var/log/iptables.log
[root@server ~]# systemctl  restart rsyslog

注意:当用vi/vim编辑器打开日志文件,离开时却执行:wq的参数(即使未作修改),或者是你对日志文件进行过修改并保存退出后,那么该文件未来将不会再继续进行记录操作。要让该日志文件可以继续写入,需要重新启动rsyslog服务

(三)rsyslog日志文件服务器的配置

通过rsyslog将一个Linux服务器配置为一个中心日志服务器,其他主机配置为日志服务器的客户端。

rsyslog服务器rsyslog客户端
IP192.168.126.08192.168.126.10
HOSTNAMEserverclient

第一步:配置中心日志服务器

① 打开rsyslog配置文件,查找到下面的两行所在的位置,通过删除其行首的#字符来取消注释。

$ModLoad imudp
$UDPServerRun 514

# 这会使得rsysolog守护进程能够在UDP端口514上接受日志消息了---UDP是一种比TCP速度快,
# 但是并不具有TCP一样的数据流的可靠性。

所以如果你需要使用可靠的TCP传送机制,就可以通过取消以下行的注释。

$ModLoad imtcp
$InputTCPServerRun 514 

# 需要注意的是,TCP和UDP可以被同时生效来监听TCP/UDP 连接

② 创建日志接收模板

为远程消息创建模板,告知rsyslog如何记录从其他客户端主机所发送到的日志。

在配置文件的【GLOBAL DIRECTIVE】区域中追加以下模板

 $template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *

说明:

$template RemoteLogs(这里“RemoteLogs” 字符串可以为任何其他的描述性的名称)定义一个名为RemoteLogs的模版,作用是使rsyslog服务将接受到的客户端的日志消息写到/var/log下的单独的本地日志文件中,其中存放对应远程客户端日志文件的目录名是基于客户端的主机名,具体日志文件名是以生成该日志的应用程序名进行命名的。

#如果想要将所有从远程客户端接受到的消息写入到一个以它们的IP地址命名的文件中,可以这样定义模板。

$template IpTemplate,"/var/log/%FROMHOST-IP%.log"


# 也可以不使用模版而是使用RULES来配置:
:fromhost-ip, isequal, “192.168.126.10″ /var/log/192.168.126.10.log

③ 设置接收到的日志信息的内容和格式(此项可以不配置即使用默认格式)

在【GLOBAL DIRECTIVES】区域添加以下内容

$template myFROMAT,"%timegenerated% %FROMHOST-IP% %syslogtag% %msg%n"

④ 配置规则

接收客户端的所有日志信息,并以指定格式写入指定目录下

 *.* ?RemoteLogs;myFROMAT
 & ~

其中第一行所配置的 RULES 意思是将RemoteLogs模板和myFROMAT模版应用到所有接收到的日志上。
第二行 “& ~” 表示了一个重定向规则,被用来告知rsyslog守护进程停止对日志消息的进一步处理,并且不要在本地写入。如果没有使用该重定向规则,那么所有的远程消息都会在写入上述描述的日志文件之外同时被写入到本地日志文件,这就意味着日志消息实际上被写了两次。使用该规则的另外一个结果就是syslog服务器本身的日志消息只会被以该机器主机名命名的专有文件中。

根据需要,也可以使用其他规则对特定的facility或priority进行记录

 [facility][连接符] ?RemoteLogs;myFROMAT

⑤编辑好配置文件之后,需要重启该服务

systemctl restart rsyslog

第二步:配置其台主机为日志服务器的客户端,将所有内部日志消息发送到远程日志服务器上

① 在rsyslog配置文件,添加以下声明到文件底部。将IP地址替换为远程rsyslog服务器的IP地址。

 *.* @192.168.126.8:514 
 # 也可以将rsyslog服务器的IP地址替换成它的主机名
 *.* @server:514 

上面的声明告诉rsyslog进程,将系统上各个设备的各种日志消息路由到远程rsyslog服务器(192.168.126.8)的UDP端口514。

如果出于某种原因,需要更为可靠的协议,如TCP,而rsyslog服务器也被配置为监听TCP连接,你必须在远程主机的IP地址前添加一个额外的@字符,像下面这样:

*.* @@192.168.126.8:514 
# 或
*.* @@server:514 

如果你只想要转发服务器上的指定设备的日志消息,比如说内核设备,那么你可以在rsyslog配置文件中使用以下声明。

kern.* @192.168.126.8:514 

② 修改配置文件后,需要重启进程以使修改生效:

 systemctl restart rsyslog.service 

配置完成,此时在服务器端的/var/log/目录下,会产生以各个客户端主机名命名的目录,目录下会存放客户端的各种日志文件。

三、日志文件的轮替(logrotate)

(一)概述

系统的日志文件会随着使用天数和发生事件的增加在自动增长,对于服务器来说,如果没有一种机制限制这种增长,那么会有大部分的硬盘被消耗掉。

日志维护的最主要的工作就是把旧的日志文件删除,从而腾出空间保存新的日志文件。这项工作如果靠管理员手工来完成,那其实是非常烦琐的,而且也容易忘记。linux系统设计了一种方式来解决这个问题:日志轮替(也叫日志转储)。

日志轮替就是使用一个程序名为/usr/sbin/logrotate程序根据配置文件的设定,使用同名的空的日志文件替换现有的日志文件,被替换掉的日志文件,被改名后放置或删除掉

logrotate本身与rsyslog无关 只是一种文件检测工具,通过cron定期检查文件的大小和创建时间 通过设置一些策略来清除或者备份日志

/etc/cron.daily/logrotate 就是来执行每天要进行的日志文件轮替的操作

[root@server ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

就是说,系统每天都会执行 /etc/cron.daily/logrotate 文件,运行这个文件中的“/usr/sbin/logrotate/etc/logrotate.conf>/dev/null 2>&1”命令。logrotate 命令会依据 /etc/logrotate.conf 配置文件的配置,来判断配置文件中的日志是否符合日志轮替的条件(比如,日志备份时间已经满一周),如果符合,日志就会进行轮替。== 所以说,日志轮替还是由 crond 服务发起的 ==

(二)logrotate 的配置文件

logrotate主要是针对日志文件来进行轮替的操作,所以,它当然必须要记录【在什么状态下才将日志文件进行轮替】的设置。

== logrotate程序的参数配置文件为:==

  • /etc/logrotate.conf
  • /etc/logrotate.d/

其中logrotate.conf才是主要的参数文件,至于logrotate.d则是一个目录,该目录里面的所有文件都会主动地读入/etc/logrotate.conf 当中来使用

另外,在/etc/logrotate.d/里面的文件中,如果没有规定到的一些详细设置,则以/etc/logrotate.conf这个文件的规定来指定为默认值

logrotate的主要功能就是将现有的日志文件重新命名以做备份,然后重新建立一个空文件来记录信息,执行结果类似如下:
在这里插入图片描述
由上图可知,当第一次执行完轮替之后,原本的messages会变成messages.1,而且会新建一个空的messages给系统来存储日志文件。而第二次执行之后,则messages.1会变成messages.2,而messages会变成messages.1,又新建一个空的messages来存储日志文件。那么如果仅设置保留3个日志文件的话,那么执行第4次时,则messages.3这个文件就会被删除,并由后面的较新的保存日志文件所替换,基本的工作流程就是这样

常用方法是在日志文件轮替后的文件名上加日期参数

logrotate.conf配置文件默认内容解析:

# 下面的设置是“logrotate的默认设置值”,如果其他配置文件设置了其它的参数,
# 则将以其他文件的设置为主,若其他文件没有设置到的参数则以这个文件的内容为默认值
[root@server ~]# cat /etc/logrotate.conf 
weekly					#默认每个星期对日志文件进行一次轮替任务
rotate 4				#指定保留几个日志文件,默认是保留4个
create					#由于每次轮替日志文件会被更名,因此建立一个新的文件继续存储
dateext					#给被轮替的日志文件的文件名加上日期
#compress				#被轮替的日志文件是否需要压缩存储,如果日志文件太大则需要考虑使用该参数
include /etc/logrotate.d		#视/etc/logrotate.d/这个目录下的所有文件为logrotate的配置文件
/var/log/wtmp {		#仅针对/var/log/wtmp所设置的参数
    monthly			#每个月一次替换每周
    create 0664 root utmp		#指定新建日志文件的权限与所属帐号/组
	minsize 1M		##日志文件最小轮替大小是1MB。也就是日志一定要超过1MB才会轮替,否则就算时间达到一个月,也不进行曰志轮替
    rotate 1		#仅保留一个,也就是只保留wtmp和wtmp.1曰志
}
/var/log/btmp {     #以下参数只对/var/log/btmp生效
    missingok		##如果日志不存在,则忽略该日志的警告信息
    monthly
    create 0600 root utmp
    rotate 1
}

# 这个wtmp可记录登录者与系统重新启动时的时间与来源主机及登陆期间的时间
# rotate 1 表示只保留一个日志文件,可根据需要进行调整
# 如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志;当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志;以此类推。

在这个配置文件中,主要分为三部分:

  • 第一部分是默认设置,如果需要转储的日志文件没有特殊配置,则遵循默认设置的参数;
  • 第二部分是读取 /etc/logrotate.d/ 目录中的日志轮替的子配置文件,也就是说,在 /etc/logrotate.d/ 目录中的所有符合语法规则的子配置文件也会进行日志轮替;
  • 第三部分是对 wtmp 和 btmp 日志文件的轮替进行设定,如果此设定和默认参数冲突,则当前设定生效(如 wtmp 的当前参数设定的轮替时间是每月,而默认参数的轮替时间是每周,则对 wtmp 这个日志文件来说,轮替时间是每月,当前的设定参数生效)。

由这个文件的设置可知 /etc/logrotate.d/ ,其实就是由 /etc/logrotate.conf 所规划出来的目录,所以,其实我们可以将所有的参数配置都写入 /etc/logrotate.conf 文件中,但是这样这个文件就过于复杂和庞大,尤其是当使用很多服务在系统上面时,每个服务都要去修改 /etc/logrotate.conf 文件 ,那么这个文件的可管理性就会非常差,不利于此文件的维护。

所以独立出来 /etc/logrotate.d/ 这个目录,就可以将各个服务的日志配置文件独立的写成一个文件,并放到该目录下。

(三)日志轮替的配置

logrotate.conf 配置文件的设置语法:

日志文件的绝对路径与文件名. . . {
	个别的参数设置值,如monthly,minsize,compress等
}

相关配置参数说明:

			dateext				使用日期作为日志轮替文件的后缀,如secure-20130605
			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  	指定转储周期为每月
			size size 	当日志文件到达指定的大小时才转储,size 可以指定 bytes (缺省)以及KB (sizek)或者MB 
			minsize 大小	日志轮替的最小值。也就是日志一定要达到这个最小值才会进行轮持,否则就算时间达到也不进行轮替
			rotate count  	指定日志文件删除之前转储的次数,0  指没有备份,5  指保留5  个备份
			missingok  		如果日志不存在,则忽略该日志的警告信息
			nomissingok   	如果日志不存在,继续下一次日志,不提示错误
			weekly  		默认每周对登录文件进行一次切割
			rotate 4   		保留多少个登录文件,默认为4个
			create			由于登录文件被更名,因此创建一个新的来继续记录

查看 /etc/logrotate.d/syslog 这个轮替rsyslog.service服务的文件:

[root@server ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler		#此配置文件是对/var/log/下的cron、mailog、messages、secure、spooler文件生效
{
    missingok			#如果日志不存在,提示错误
    sharedscripts		#如果需要调用外部命令则需要写上成对两个关键字(sharedscripts与endscript),将要执行的命令写在两个关键字之间
    postrotate			#postrotate 关键字之后写需要执行的命令,表示在logrotate执行完成之后要执行的命令;如果是要在logrotate之前执行的命令,需要写在prerotate关键在之后
	/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true # 轮替完成后,取得syslog的PID后,以kill -HUP 重新启动syslogd
    endscript
}

# 由于一些参数在此文件中未设置,所以才用logrotate.conf文件的默认值。即日志文件轮替每周一次,保留4个且轮替下来的日志文件不进行压缩

根据上面的配置,得知logrotate的具体写法为:

  • 文件名:被处理的日志文件的绝对路径文件名写在前面,可以使用空格符分割多个日志文件
  • 参数:上述文件名进行轮替的参数使用{}括起来
  • 执行脚本:可调用外部命令来进行额外的命令执行,这个设置需要与sharedscripts……endscript设置合用才行。可用的环境为:
    • prerotate:在启动logrotate之前要执行的命令,例如修改日志文件的属性等操作
    • postrotate:在做完logrotate之后要执行的命令,例如重新启动(kill -HUP)某个服务
    • prerotate与postrotate对于已加上特殊属性的日志文件处理上面,是非常重要的用法
      那么/etc/logrotate.d/syslog内设置的5个文件的轮替功能就变成了:

如果在logrotate运行之前和之后要执行某些命令,则语法为:

日志文件的绝对路径与文件名. . . {
	个别的参数设置值,如monthly,minsize,compress等
	参数设置
	...
	sharedscripts
	prerotate
		日志轮替之前要执行的命令
	endscript
	sharedscripts
	postrotate
		日志轮替之后要执行的命令
	endscript
}

# 命令也要使用绝对路径
sharedscripts在此关键宇之后的脚本只执行一次
prerotate/endscript在曰志轮替之前执行脚本命令。endscript标识prerotate脚本结束
postrolaie/endscript在日志轮替之后执行脚本命令。endscripi标识postrotate脚本结束

rerotate 和 postrotate 主要用于在日志轮替的同时执行指定的脚本,一般用于日志轮替之后重启服务。如果你的日志是写入 rsyslog 服务的配置文件的,那么把新日志加入 logrotate 后,一定要重启 rsyslog 服务,否则你会发现,虽然新日志建立了,但数据还是写入了旧的日志当中。那是因为虽然 logrotate 知道日志轮替了,但是 rsyslog 服务并不知道。

同理,如果采用源码包安装了 apache、Nginx 等服务,则需要重启 apache 或 Nginx 服务,同时还要重启 rsyslog 服务,否则日志也不能正常轮替。

不过,这里有一个典型应用就是给予特定的日志加入 chattr 的 a 属性。如果系统文件加入了 a 属性,那么这个文件就只能增加数据,而不能删除和修改已有的数据,root 用户也不例外。

因此,我们会给重要的日志文件加入 a 属性,这样就可以保护日志文件不被恶意修改。不过,一旦加入了 a 属性,那么在进行日志轮替时,这个日志文件是不能被改名的,当然也就不能进行日志轮替了。我们可以利用 prerotate 和 postrotate 参数来修改日志文件的 chattr 的 a 属性。

例如:

对于/var/log/messages这个文件已经增加了 chattr +a 的属性时,依据logrotate的工作原理,我们知道,这个/var/log/messages将会被更名为/var/log/messages.1。但是由于该文件已经加上这个 +a 的属性,所以更名是不会成功的,在需要+a属性的前提下,而且又要保证logrotate能够正常执行。那么此时就需要利用prerotate与postrotate来进行日志文件轮替前、后所需要做一些操作,那么我们需要这样修改配置文件:

[root@server ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    prerotate
    	/usr/bin/chattr -a /var/log/messages
    endscript
    sharedscripts
    postrotate
		/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
		/usr/bin/chattr +a /var/log/messages
    endscript
}

就是先给messages文件去掉 a 属性,让messages日志文件可以进行正常的轮替操作,轮替执行完成之后,再给messages文件加上 a 这个属性。值得注意的是,/bin/kill -HUP 的意义,这一行的目的在于将系统的rsyslogd重新以其参数文件(rsyslog.conf)的数据读入一次,也可以认为是根据配置文件reload(重新加载)一次。由于建立了一个新的空的日志记录文件,如果不执行此行来重新启动服务的话,那么记录的时候会发生错误。(因为前面对messages文件进行了相关操作)

(四)logrotate命令

用法::

logrotate [OPTION...] <configfile>

选项:

  • -d或–debug:详细显示指令执行过程,便于排错或了解程序执行的情况;
  • -f或–force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然;
  • -s<状态文件>或–state=<状态文件>:使用指定的状态文件;
  • -v或–version:启动显示模式,会显示logrotate的运行过程

查看logrotate日志轮询操作流程,同时可以检查配置文件中的语法问题

logrotate -v /etc/logrotate.conf

logrotate 命令在使用“-f”选项之后,就会不管日志是否符合轮替条件,而强制把所有的日志都进行轮替。

logrotate -vf /etc/logrotate.conf

四、systemd-journald.service

(一)概述

过去只有rsyslogd的年代中,由于rsyslogd必须启动完成并且执行rsyslogd这个daemon之后,日志文件才会开始记录。所以,内核还得要自己产生一个klogd的服务,才能将系统在启动过程、启动服务的过程中的信息记录下来,然后等rsyslogd启动后才传送给它来处理

现在有了systemd之后,由于它是内核唤醒的,然后又是第一个执行的软件,它可以主动调用systemd-journald来协助记录日志文件,因此在开机启动过程中的所有信息,包括启动服务与服务若启动失败的情况等,都可以直接被记录到systemd-journald里面

不过systemd-journald由于是使用于内存的日志文件记录方式,因此重新启动过后,开机启动前的日志文件信息当然就不会被记录了

为此,还是建议启动rsyslogd来协助分类记录。也就是说,systemd-journald用来管理与查询这次启动后的登录信息,而rsyslogd可以用来记录以前即现在的所有数据到磁盘文件中,方便未来进行查询。

虽然systemd-journald所记录的数据在内存中,但是系统还是利用文件的形式将它记录到/run/log/下面。/run在centos 7 其实是内存中的数据,所以重新启动后,这个/run/log/下面的数据当然就被刷新,旧的就不存在了

(二)使用journalctl查看日志信息

通过 journalctl 可以检索systemd-journald.service的日志

用法:

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

描述:

  • 如果不带任何参数直接调用此命令, 那么将显示所有日志内容(从最早一条日志记录开始)。

  • 如果指定了 [MATCHES…] 参数, 那么输出的日志将会按照 [MATCHES…] 参数进行过滤。 MATCHE 必须符合 “FIELD=VALUE” 格式 (例如 “_SYSTEMD_UNIT=httpd.service” );如果有多个不同的字段被 [MATCHES…] 参数匹配, 那么这些字段之间使用"AND"逻辑连接, 也就是,日志项必须同时满足全部字段的匹配条件才能被输出。 如果同一个字段被多个 [MATCHES…] 参数匹配, 那么这些匹配条件之间使用"OR"逻辑连接, 也就是对于同一个字段,日志项只需满足任意一个匹配条件即可输出。 最后, “+” 字符可用作 [MATCHES…] 组之间的分隔符,并被视为使用"OR"逻辑连接。 也就是,MATCHE1 MATCHE2 + MATCHE3 MATCHE4 MATCHE5 + MATCHE6 MATCHE7 相当于 ( MATCHE1 MATCHE2 ) OR ( MATCHE3 MATCHE4 MATCHE5 ) OR ( MATCHE6 MATCHE7 )

  • 使用绝对路径作为参数来过滤日志。 绝对路径可以是普通文件,也可以是软连接,但必须指向一个确实存在的文件。 如果路径指向了一个二进制可执行文件, 那么它实际上相当于是一个对 “_EXE=” 字段的匹配(仅匹配完整的绝对路径)。 如果路径指向了一个可执行脚本, 那么它实际上相当于是一个对 “_COMM=” 字段的匹配(仅匹配脚本的文件名)。 如果路径指向了一个设备节点, 那么它实际上相当于是一个对 “_KERNEL_DEVICE=” 字段的匹配(匹配该设备及其所有父设备的内核设备名称)。 在查询时,软连接会被追踪到底,内核设备名称将被合成, 父设备将按照当时的实际情况被提列出来。 因为日志项一般并不包含标记实际物理设备的字段, 所以,设备节点一般就是实际物理设备的最佳代表。 但是又因为设备节点与物理设备之间的对应关系在系统重启之后可能会发生变化, 所以,根据设备节点过滤日志仅对本次启动有意义, 除非你能确认对应关系在重启之后保持不变。

  • 可以使用 --boot, --unit= 等选项 进一步附加额外的约束条件(相当于使用"AND"逻辑连接)。

  • 最终的输出结果来自所有可访问的日志文件的综合, 无论这些日志文件是否正在滚动或者正在被写入, 也无论这些日志文件是属于系统日志还是用户日志, 只要有访问权限,就会被包括进来。

  • 用于提取日志的日志文件的集合可以使用 --user, --system, --directory, --file 选项进行筛选。

  • 每个用户都可以访问其专属的用户日志。 但是默认情况下, 只有root用户以及 “systemd-journal”, “adm”, “wheel” 组中的用户才可以访问全部的日志(系统与其他用户)。 注意,一般发行版还会给 “adm” 与 “wheel” 组一些其他额外的特权。 例如 “wheel” 组的用户一般都可以执行一些系统管理任务。

  • 默认情况下,结果会通过 less 工具进行分页输出, 并且超长行会在屏幕边缘被截断。 不过,被截掉的部分可以通过左右箭头按键查看。 如果不想分页输出,那么可以使用 --no-pager 选项

  • 如果是输出到 tty 的话,行的颜色还会根据日志的级别变化: ERROR 或更高级别为红色,NOTICE 或更高级别为高亮,其他级别则正常显示。

选项:

常用选项:

  • -n, --lines= :限制显示最新的日志行数。 --pager-end 与 --follow 隐含了此选项。 此选项的参数:若为正整数则表示最大行数; 若为 “all” 则表示不限制行数; 若不设参数则表示默认值10行。

  • -r, --reverse :反转日志行的输出顺序, 也就是最先显示最新的日志。

  • -p, --priority= :根据日志等级(包括等级范围)过滤输出结果。 日志等级数字与其名称之间的对应关系如下 : “emerg” (0), “alert” (1), “crit” (2), “err” (3), “warning” (4), “notice” (5), “info” (6), “debug” (7) 。 若设为一个单独的数字或日志等级名称, 则表示仅显示小于或等于此等级的日志 (也就是重要程度等于或高于此等级的日志)。 若使用 FROM…TO… 设置一个范围, 则表示仅显示指定的等级范围内(含两端)的日志。 此选项相当于添加了 “PRIORITY=” 匹配条件。

  • -f, --follow:只显示最新的日志项,并且不断显示新生成的日志项。 此选项隐含了 -n 选项;类似于tail -f 的功能

  • –since --until :设置开始与结束的时间,让在该期间的数据输出

  • _SYSTEMD_UNIT=unit.service:是输出unit.service的信息

  • _COMM=bash:只输出与bash有关的信息

  • _PID=pid:只输出此pid号的信息

  • _UID=uid:只输出此uid的信息

  • SYSLOG_FACILITY=[0-23]:使用syslog.h规范的服务相对序号来筛选出对应的信息

其他选项:

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

-a, --all
完整显示所有字段内容, 即使其中包含不可打印字符或者字段内容超长。

-e, --pager-end
在分页工具内立即跳转到日志的尾部。 此选项隐含了 -n1000 以确保分页工具不必缓存太多的日志行。 不过这个隐含的行数可以被明确设置的 -n 选项覆盖。 注意,此选项仅可用于 less(1) 分页器。

--no-tail
显示所有日志行, 也就是用于撤销已有的 --lines= 选项(即使与 -f 连用)。

-o, --output=
控制日志的输出格式。 可以使用如下选项:

short 
这是默认值, 其输出格式与传统的 syslog 文件的格式相似, 每条日志一行。
short-iso 
与 short 类似,只是将时间戳字段以 ISO 8601 格式显示。
short-precise 
与 short 类似,只是将时间戳字段的秒数精确到微秒级别。
short-monotonic 
与 short 类似,只是将时间戳字段的零值从内核启动时开始计算。
short-unix 
与 short 类似,只是将时间戳字段显示为从"UNIX时间原点"(1970-1-1 00:00:00 UTC)以来的秒数。 精确到微秒级别。

verbose 
以结构化的格式显示每条日志的所有字段。

export 
将日志序列化为二进制字节流(大部分依然是文本) 以适用于备份与网络传输(详见 Journal Export Format 文档)。

json 
将日志项按照JSON数据结构格式化, 每条日志一行(详见 Journal JSON Format 文档)。

json-pretty 
将日志项按照JSON数据结构格式化, 但是每个字段一行, 以便于人类阅读。

json-sse 
将日志项按照JSON数据结构格式化,每条日志一行,但是用大括号包围, 以适应 Server-Sent Events 的要求。

cat 
仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)。

--utc
以世界统一时间(UTC)表示时间

--no-hostname
不显示来源于本机的日志消息的主机名字段。 此选项仅对 short 系列输出格式(见上文)有效。

-x, --catalog
在日志的输出中增加一些解释性的短文本, 以帮助进一步说明日志的含义、 问题的解决方案、支持论坛、 开发文档、以及其他任何内容。 并非所有日志都有这些额外的帮助文本, 详见 Message Catalog Developer Documentation 文档。

注意,如果要将日志输出用于bug报告, 请不要使用此选项。

-q, --quiet
当以普通用户身份运行时, 不显示任何警告信息与提示信息。 例如:"-- Logs begin at ...", "-- Reboot --"

-m, --merge
混合显示包括远程日志在内的所有可见日志。

-b [ID][±offset], --boot=[ID][±offset]
显示特定于某次启动的日志, 这相当于添加了一个 "_BOOT_ID=" 匹配条件。
如果参数为空(也就是 ID 与 ±offset 都未指定), 则表示仅显示本次启动的日志。
如果省略了 ID , 那么当 ±offset 是正数的时候, 将从日志头开始正向查找, 否则(也就是为负数或零)将从日志尾开始反响查找。 举例来说, "-b 1"表示按时间顺序排列最早的那次启动, "-b 2"则表示在时间上第二早的那次启动; "-b -0"表示最后一次启动, "-b -1"表示在时间上第二近的那次启动, 以此类推。 如果 ±offset 也省略了, 
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_45880055/article/details/113242528
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢