所谓日志(Log)是指系统所指定对象的某些操作和其操作结果按时间有序的集合。每个日志文件由日志记录组成,每条日志记录描述了一次单独的系统事件
通常情况下,系统日志是用户可以直接阅读的文本文件,其中包含了一个时间戳和一个信息或者子系统所特有的其他信息。日志文件为服务器、工作站、防火墙和应用软件等IT资源相关活动记录必要的、有价值的信息,这对系统监控、查询、报表和安全审计是十分重要的。
日志文件中的记录可提供以下用途:监控系统资源;审计用户行为;对可疑行为进行告警;确定入侵行为的范围;为恢复系统提供帮助;生成调查报告;为打击计算机犯罪提供证据来源
linux主机在后台有相当多的daemons同时在工作,这些工作中的进程总是会显示一些信息,这些重要信息最终会被记录到日志文件中。日志文件可以记录系统在什么时间、哪个主机、哪个服务、出现了什么信息等内容,这些信息也包括用户识别数据。系统故障排除须知等信息,善于利用这些日志信息,当系统出现出现错误时,可以从日志信息定位问题找到解决方案。
日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。这些信息有些非常敏感,所以在 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服务的日志目录 |
要注意的是,如果任凭日志文件持续记录的话,由于系统产生的信息天天都有,那么日志文件的容量将会越来越大,如果日志文件容量太大时,可能会导致系统空间不足,以及大文件读写效率不佳等问题
针对日志文件的服务与程序有:
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 来查看各个不同服务的日志文件
一般来说,系统产生的信息并记录下来的内容中,每条信息均会记录下面几项重要内容:
这些信息的内容是可以进行更改的,而且,这些信息可以作为系统除错之用。
rsyslog是一个快速处理收集系统日志的开源程序,提供了高性能、安全功能和模块化设计。
rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地, rsyslog被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。
对于包括Linux系统,Windows服务器,路由器,交换机及其它主机能在网络上发送日志信息的这类设备,日志服务器都可以用作于它们在网络上的重要日志监控点。通过日志服务器,你能从不同的主机及设备过滤和合并日志信息于一个单一的位置,所以你能很容易的查看及存档日志信息。
rsyslog 作为标准的 syslog 守护进程,预装在了大多数的 Linux 发行版中。在客户端/服务器架构的配置下,rsyslog 同时扮演了两种角色:
一种是配置成日志收集服务器,rsyslog进程可以从网络中收集其它主机上的日志数据,这些主机会将日志配置为发送到另外的远程服务器;
另一种是配置为客户端,用来过滤和发送内部日志消息并保存到本地目录中(如/var/log)或一台可以路由到的远程rsyslog服务器上。
rsyslog特性:
==主配置文件:/etc/rsyslog.conf 自定义配置文件:/etc/rsyslog.d/*.conf ==
为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行日志文件的管理,所以,将各种类别服务的日志文件记录在不同的文件里面,就是/etc/rsyslog.conf所要做的规范了
主配置文件 /etc/rsyslog.conf 大概分为三个部分:MODULES、GLOBAL DIRECTIVES、RULES
用来配置要加载的模块,这个部分是针对接收配置的,主要是指定接收日志的协议和端口。 若要配置日志服务器,则需要将相应的配置项去掉注释。
#### 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
全局配置,配置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】中配置日志采集格式
全局指令必须以 $ 开头
内部变量需要使用 一对百分号 括起来
日志采集格式:$template myFORMAT,“%timegenerated% %FROMHOST-IP% %syslogtag% %msg%\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日志服务器的配置,因为日志服务器要接收很多主机的日志信息,这样定义便可根据不同主机和不同时间来建立相应的目录存放对应的日志信息
以上第一种和第二种使用方法可以同时配置,不会影响
每条规则规定了【(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支持的服务类型主要有以下这些:
相对序号 | 服务类别 | 说明 |
---|---|---|
0 | kern (kernel) | 内核产生的信息,大部分都是硬件检测以及内核功能的启用 |
1 | user | 在用户层级所产生的信息 |
2 | 只要与邮件收发有关的信息记录都属于这个 | |
3 | daemon | 主要是系统的服务所产生的信息,例如systemd |
4 | auth | 主要与认证/授权有关的机制,例如login、ssh、su等需要帐号/密码的 |
5 | syslog | 就是由syslog相关协议产生的信息,其实就是rsyslogd这个程序本身产生的信息 |
6 | lpr | 打印相关的信息 |
7 | news | 与新闻组服务器有关的 |
8 | uucp | 全名为UNIX to UNIX COPY Protocol ,早期用于UNIX系统间的程序数据交换 |
9 | cron | 计划任务cron、at等产生信息记录的地方 |
10 | authpriv | 与auth类似,但记录较多账号的私人信息,包括pam模块的运行等 |
11 | ftp | 与FTP通讯协议有关的信息输出 |
16~23 | local0~local7 | 保留给本机用户使用的一些日志文件信息,较常与终端互动 |
* | 代表所有服务 |
上述都是Linux内核的syslog函数自行制订的服务名名称,软件开发商可以通过调用上述的服务名称记录他们的软件。
举例来说,sendmail与postfix及dovecot都是与邮件有关的软件,这些软件在设计日志文件记录时,都会主动调用syslog内的mail服务名称。
● priority
同一个服务所产生的信息也是有差别的,有启动时仅通知系统而已的一般信息(information),有出现还不至于影响到正常运行的警告信息(warn),还有系统硬件发生严重错误时,所产生的重大问题信息(error)。基本上,Linux内核的syslog将信息分为8个主要的等级,根据syslog.h的定义,信息名称与数值的对应如下:
等级数值 | 等级名称 | 说明 |
---|---|---|
7 | debug | 用来debug(除错)时产生的数据 |
6 | info | 仅是一些基本的信息说明而已 |
5 | notice | 虽然是正常信息,但比info还需要被注意到的一些信息内容 |
4 | warning (warn) | 警示的信息,可能有问题,但是还不至于影响到某个daemon运行的信息。基本上,Info、notice、warn这三个信息等级都是在告知一些基本信息而已,应该还不至于造成一些系统运行困扰 |
3 | err (error) | 一些重大的错误信息,例如配置文件的某些设置值造成该服务无无法启动的信息说明,通常借由err的错误告知,应该可以了解到该服务无法启动的问题 |
2 | crit | 比err还要严重的错误信息,这个crit是临界点(critical)的缩写,这个错误已经很严重了 |
1 | alert | 警告,已经很有问题的等级,比crit还要严重 |
0 | emerge (panic) | 疼痛等级,意指系统已经几乎要宕机的状态,很严重的错误等级。通常大概只有硬件出现问题,导致整个内核无法顺利运行,就会出现这样的等级的信息 |
基本上在0(emerge)~6(info)的等级之间,等级数值越高代表越正常,登记靠近0则代表系统出现致命问题。除了0到6之外还有两个比较特殊的等级,那就是debug(错误检测等级)与none(不需要登陆等级)两个,当我们想要做一些错误检测,或是忽略掉某些服务的信息时,就用这两个等级
级别越低产生的日志明细越多,级别越高产生的日志越少但都是危险信息
● 信息等级之前的连接符:
. 代表【比后面还要严重的等级(含该等级)都被记录下来】的意思,例如mail.info 代表只要是mail的信息,而且该信息等级严重于info(含info本身)时,就会被记录下来的意思
.= 代表所需要的等级就是后面接的等级,其它的不需要
.! 代表不等于,亦即是除了该等级外的其他等级都记录
.* 代表所有级别;若为此则其后无需接日志信息等级
.none 代表没有级别,即忽略、不记录;若为此则其后也无需接日志信息等级
一般来说,我们比较常使用的是 . 这个连接符号
● action
action指定了对符合规则的信息的处理方式。总的来说,消息内容可以被写到日志文件中,但也可以执行其他动作,比如写到数据库表中或转发到其他主机。
# 静态文件
*.* /var/log/file.log # 绝对路径
# 动态文件
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log" # 定义存放日志文件的名称
*.* ?DynamicFile
# 发送给用户(需要在线才能收到)
*.* root
*.* root,kadefor,up01 # 使用,号分隔多个用户
*.* * # *号表示所有在线用户
# 客户端日志转发到远程日志服务器
*.* @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 级压缩
#执行脚本
local3.* ^/tmp/test.sh # ^号后跟可执行脚本或程序的绝对路径
local3.* ~ # 忽略所有local3类型的所有级别的日志
& ~ # 忽略所有的日志
*.* /dev/pts/0
测试:logger -p local3.info ‘this is a test for logger ‘ #logger 命令用于产生日志
:模块名:ip地址,数据库名,数据库用户名,登陆密码
# 将用户层所产生的notice及以上级别的日志写入本地mysql数据库(数据库名为Rsyslog,数据库用户名为rsysloguser,登录密码为syspass)
user.notice :ommysql:127.0.0.1,Rsyslog,rsysloguser,syspass
# 用法:过滤日志, 由:号开头
: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
以上八行的说明:
自定义日志文件
如果有需要,可以自行在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将一个Linux服务器配置为一个中心日志服务器,其他主机配置为日志服务器的客户端。
rsyslog服务器 | rsyslog客户端 | |
---|---|---|
IP | 192.168.126.08 | 192.168.126.10 |
HOSTNAME | server | client |
第一步:配置中心日志服务器
① 打开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/目录下,会产生以各个客户端主机名命名的目录,目录下会存放客户端的各种日志文件。
系统的日志文件会随着使用天数和发生事件的增加在自动增长,对于服务器来说,如果没有一种机制限制这种增长,那么会有大部分的硬盘被消耗掉。
日志维护的最主要的工作就是把旧的日志文件删除,从而腾出空间保存新的日志文件。这项工作如果靠管理员手工来完成,那其实是非常烦琐的,而且也容易忘记。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.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.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的具体写法为:
如果在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 [OPTION...]
选项:
查看logrotate日志轮询操作流程,同时可以检查配置文件中的语法问题
logrotate -v /etc/logrotate.conf
logrotate 命令在使用“-f”选项之后,就会不管日志是否符合轮替条件,而强制把所有的日志都进行轮替。
logrotate -vf /etc/logrotate.conf
过去只有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 可以检索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 也省略了, 那么相当于"-b -0", 除非本次启动不是最后一次启动(例如用 --directory 指定了另外一台主机上的日志目录)。
如果指定了32字符的 ID , 那么表示以此 ID 所代表的那次启动为基准 计算偏移量(±offset), 计算方法同上。 换句话说, 省略 ID 表示以本次启动为基准 计算偏移量(±offset)。
--list-boots
列出每次启动的 序号(也就是相对于本次启动的偏移量)、32字符的ID、 第一条日志的时间戳、最后一条日志的时间戳。
-k, --dmesg
仅显示内核日志。隐含了 -b 选项以及 "_TRANSPORT=kernel" 匹配项。
-t, --identifier=SYSLOG_IDENTIFIER
仅显示 syslog 识别符为 SYSLOG_IDENTIFIER 的日志项。
可以多次使用该选项以指定多个识别符。
-u, --unit=UNIT|PATTERN
仅显示属于特定单元的日志。 也就是单元名称正好等于 UNIT 或者符合 PATTERN 模式的单元。 这相当于添加了一个 "_SYSTEMD_UNIT=UNIT" 匹配项(对于 UNIT 来说), 或一组匹配项(对于 PATTERN 来说)。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
--user-unit=
仅显示属于特定用户会话单元的日志。 相当于同时添加了 "_SYSTEMD_USER_UNIT=" 与 "_UID=" 两个匹配条件。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
-c, --cursor=
从指定的游标(cursor)开始显示日志。 [提示]每条日志都有一个"__CURSOR"字段,类似于该条日志的指纹。
--after-cursor=
从指定的游标(cursor)之后开始显示日志。 如果使用了 --show-cursor 选项, 则也会显示游标本身。
--show-cursor
在最后一条日志之后显示游标, 类似下面这样,以"--"开头:
-- cursor: s=0639...
游标的具体格式是私有的(也就是没有公开的规范), 并且会变化。
-S, --since=, -U, --until=
显示晚于指定时间(--since=)的日志、显示早于指定时间(--until=)的日志。 参数的格式类似 "2012-10-30 18:17:16" 这样。 如果省略了"时:分:秒"部分, 则相当于设为 "00:00:00" 。 如果仅省略了"秒"的部分则相当于设为 ":00" 。 如果省略了"年-月-日"部分, 则相当于设为当前日期。 除了"年-月-日 时:分:秒"格式, 参数还可以进行如下设置: (1)设为 "yesterday", "today", "tomorrow" 以表示那一天的零点(00:00:00)。 (2)设为 "now" 以表示当前时间。 (3)可以在"年-月-日 时:分:秒"前加上 "-"(前移) 或 "+"(后移) 前缀以表示相对于当前时间的偏移。
-F, --field=
显示所有日志中某个字段的所有可能值。 [译者注]类似于SQL语句:"SELECT DISTINCT 某字段 FROM 全部日志"
-N, --fields
输出所有日志字段的名称
--system, --user
仅显示系统服务与内核的日志(--system)、 仅显示当前用户的日志(--user)。 如果两个选项都未指定,则显示当前用户的所有可见日志。
-M, --machine=
显示来自于正在运行的、特定名称的本地容器的日志。 参数必须是一个本地容器的名称。
-D DIR, --directory=DIR
仅显示来自于特定目录中的日志, 而不是默认的运行时和系统日志目录中的日志。
--file=GLOB
GLOB 是一个可以包含"?"与"*"的文件路径匹配模式。 表示仅显示来自与指定的 GLOB 模式匹配的文件中的日志, 而不是默认的运行时和系统日志目录中的日志。 可以多次使用此选项以指定多个匹配模式(多个模式之间用"OR"逻辑连接)。
--root=ROOT
在对日志进行操作时, 将 ROOT 视为系统的根目录。 例如 --update-catalog 将会创建 ROOT/var/lib/systemd/catalog/database
--new-id128
此选项并不用于显示日志内容, 而是用于重新生成一个标识日志分类的 128-bit ID 。 此选项的目的在于 帮助开发者生成易于辨别的日志消息, 以方便调试。
--header
此选项并不用于显示日志内容, 而是用于显示日志文件内部的头信息(类似于元数据)。
--disk-usage
此选项并不用于显示日志内容, 而是用于显示所有日志文件(归档文件与活动文件)的磁盘占用总量。
--vacuum-size=, --vacuum-time=, --vacuum-files=
这些选项并不用于显示日志内容, 而是用于清理日志归档文件(并不清理活动的日志文件), 以释放磁盘空间。 --vacuum-size= 可用于限制归档文件的最大磁盘使用量 (可以使用 "K", "M", "G", "T" 后缀); --vacuum-time= 可用于清除指定时间之前的归档 (可以使用 "s", "m", "h", "days", "weeks", "months", "years" 后缀); --vacuum-files= 可用于限制日志归档文件的最大数量。 注意,--vacuum-size= 对 --disk-usage 的输出仅有间接效果, 因为 --disk-usage 输出的是归档日志与活动日志的总量。 同样,--vacuum-files= 也未必一定会减少日志文件的总数, 因为它同样仅作用于归档文件而不会删除活动的日志文件。 此三个选项可以同时使用,以同时从三个维度去限制归档文件。 若将某选项设为零,则表示取消此选项的限制。
--list-catalog [128-bit-ID...]
简要列出日志分类信息, 其中包括对分类信息的简要描述。
如果明确指定了分类ID(128-bit-ID), 那么仅显示指定的分类。
--dump-catalog [128-bit-ID...]
详细列出日志分类信息 (格式与 .catalog 文件相同)。
如果明确指定了分类ID(128-bit-ID), 那么仅显示指定的分类。
--update-catalog
更新日志分类索引二进制文件。 每当安装、删除、更新了分类文件,都需要执行一次此动作。
--setup-keys
此选项并不用于显示日志内容, 而是用于生成一个新的FSS(Forward Secure Sealing)密钥对。 此密钥对包含一个"sealing key"与一个"verification key"。 "sealing key"保存在本地日志目录中, 而"verification key"则必须保存在其他地方。
--force
与 --setup-keys 连用, 表示即使已经配置了FSS(Forward Secure Sealing)密钥对, 也要强制重新生成。
--interval=
与 --setup-keys 连用,指定"sealing key"的变化间隔。 较短的时间间隔会导致占用更多的CPU资源, 但是能够减少未检测的日志变化时间。 默认值是 15min
--verify
检查日志文件的内在一致性。 如果日志文件在生成时开启了FSS特性, 并且使用 --verify-key= 指定了FSS的"verification key", 那么,同时还将验证日志文件的真实性。
--verify-key=
与 --verify 选项连用, 指定FSS的"verification key"
--sync
要求日志守护进程将所有未写入磁盘的日志数据刷写到磁盘上, 并且一直阻塞到刷写操作实际完成之后才返回。 因此该命令可以保证当它返回的时候, 所有在调用此命令的时间点之前的日志, 已经全部安全的刷写到了磁盘中。
--flush
要求日志守护进程 将 /run/log/journal 中的日志数据 刷写到 /var/log/journal 中 (如果持久存储设备当前可用的话)。 此操作会一直阻塞到操作完成之后才会返回, 因此可以确保在该命令返回时, 数据转移确实已经完成。 注意,此命令仅执行一个单独的、一次性的转移动作, 若没有数据需要转移, 则此命令什么也不做, 并且也会返回一个表示操作已正确完成的返回值。
--rotate
要求日志守护进程滚动日志文件。 此命令会一直阻塞到滚动完成之后才会返回。
--no-pager
不将程序的输出内容管道(pipe)给分页程序。
退出状态: 返回值为 0 表示成功, 非零返回值表示失败代码
【例 】
journalctl
# 仅显示出2020/2/1整天以及仅今天及昨天的日志数据内容
journalctl --since "2021-2-1 00:00:00" --until "2021-2-2 00:00:00"
# 仅显示今天的日志数据
journalctl --since today
# 仅显示昨天的日志数据
journalctl --since yesterday --until today
journalctl _SYSTEMD_UNIT=cron.service -n 10
journalctl _COMM=su _COMM=login
journalctl -p err
journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097
journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service
journalctl /usr/bin/dbus-daemon
journalctl -k -b -1
journalctl -f -u apache
systemd-journald.service的信息是不会放到下一次开启启动后的,所以,重新启动后,之前的记录会丢失。但是也可以将 journald 每次产生的日志数据保存下来
systemd-journald.service的配置文件为 /etc/systemd/journald.conf。默认情况下,配置文件的内容已经符合基本需求
如果想要保存journalctl所读取的日志文件,那么就得建立一个 /var/log/journal 的目录,并且设置该目录的权限。这样,未来重新启动 systemd-journald.service 之后,日志文件就会主动地复制一份到 /var/log/journal 目录下。
[root@server ~]# mkdir /var/log/journal
[root@server ~]# chown root:systemd-journal /var/log/journal
[root@server ~]# chmod 2775 /var/log/journal
[root@server ~]# systemctl restart systemd-journald.service
[root@server ~]# ll /var/log/journal/
drwxr-sr-x 2 root systemd-journal 28 2月 1 15:51 6c15426f46ec4891b2db554b88d4a241
要注意的是:日志文件的容量会持续增长,防止文件过大占用磁盘空间。此外,未来在/run/log下面就没有相关的日志可以查看了,因为移动到了/var/log/journal下面
logger 用于往系统中写入日志,他提供一个shell命令接口到syslog系统模块
语法:
logger [options] [messages]
选项:
-d, --udp
使用数据报(UDP)而不是使用默认的流连接(TCP)
-i, --id
逐行记录每一次logger的进程ID
-f, --file file_name
记录特定的文件
-h, --help
显示帮助文本并退出
-n, --server
写入指定的远程syslog服务器,使用UDP代替内装式syslog的例程
-P, --port port_num
使用指定的UDP端口。默认的端口号是514
-p, --priority priority_level
指定输入消息的优先级,优先级可以是数字或者指定为 " facility.level" 的格式。比如:" -p local3.info " local3 这个设备的消息级别为 info。默认级别是 "user.notice"
-s, --stderr
输出标准错误到系统日志。
-t, --tag tag
指定标记记录
-u, --socket socket
写入指定的socket,而不是到内置系统日志例程。
日志级别:
facility:
auth: 用户授权
authpriv: 授权和安全
cron: 计划任务
daemon: 系统守护进程
kern: 与内核有关的信息
lpr 与打印服务有关的信息
mail 与电子邮件有关的信息
news 来自新闻服务器的信息
syslog 由syslog生成的信息
user 用户的程序生成的信息,默认
uucp 由uucp生成的信息
local0~7 用来定义本地策略
level:
alert 需要立即采取动作
crit 临界状态
debug 调试
emerg 系统不可用
err 错误状态
error 错误状态
info 正常消息
notice 正常但是要注意
【例 】
[root@server ~]# logger -p user.info "I am checking logger command "
[root@server ~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at 一 2021-02-01 22:08:43 CST, end at 一 2021-02-01 22:12:25 CST. --
2月 01 22:12:25 server root[1286]: I am checking logger command