Unbutu日志简介(三)

           本文介绍了日志轮转的规则,以及如何清理log

一、Linux日志轮替(日志转储)

  • 日志是重要的系统文件,记录和保存了系统中所有的重要事件但是日志文件也需要 进行定期的维护,因为日志文件是不断增长的,如果完全不进行日志维护,而任由其 随意递增,那么用不了多久,我们的硬盘就会被写满

  • 日志维护的最主要的工作就是把旧的日志文件删除,从而腾出空间保存新的日志文 件。这项工作如果靠管理员手工来完成,那其实是非常烦琐的,而且也容易忘记。那 么 Linux 系统是否可以自动完成日志的轮替工作呢?

  • logrotate 就是用来进行日志轮替(也叫日志转储)的,也就是把旧的日志文件移动 并改名,同时创建一个新的空日志文件用来记录新日志,当旧日志文件超出保存的范 围时就删除。【比如今天(20230213)生成了一个日志文件叫boot.log,明天查看时,它就会改名叫boot-20230213.log,后面跟了一个时间戳,而这天会新产生一个日志文件boot.log,依此类推】

  • logrotate是一个日志文件管理工具。用来把旧文件轮转、压缩、删除,并且创建新 的日志文件。我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理, 一般都是通过cron计划任务来完成的 。

2. 日志文件的命名规则 

  • 日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件, 当旧日志文件超出保存的范围时就删除。那么,旧的日志文件改名之后,如何命名 呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”参数。

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

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

3.logrotate配置文件 

   日志轮状的主要配置文件是/etc/logrotate.conf,子配置文件为/etc/logrotate.d/目录下的所有文件。

      主要配置文件内容如下:  

# see "man logrotate" for details
# rotate log files weekly
weekly   //每周对日志文件进行一次轮替

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog  //syslog为root权限

# keep 4 weeks worth of backlogs
rotate 4    
#保存4个日志文件,也就是说,如果进行了5次日志轮替,就会删除第一个备份曰志

# create new (empty) log files after rotating old ones
create   
#在日志轮替时,自动创建新的日志文件

# uncomment this if you want your log files compressed
#compress   
#日志文件是否压缩。如果取消注释,则日志会在转储的同时进行压缩
#以上日志配置为默认配置,如果需要轮替的日志没有设定独立的参数,那么都会遵循以上参数
#如果轮替曰志配置了独立参数,那么独立参数的优先级更高

# packages drop log rotation information into this directory
include /etc/logrotate.d
#包含/etc/logrotate.d/目录中所有的子配置文件。也就是说,会把这个目录中所有的子
配置文件读取进来,进行日志轮替

# no packages own wtmp, or btmp -- we'll rotate them here


#wtmp一个月一轮转
/var/log/wtmp {
    missingok  /如果日志不存在,则忽略该日志的警告信患
    monthly
    create 0664 root utmp
    rotate 1
}

#btmp一个月一轮转
/var/log/btmp {
    missingok //如果日志不存在,则忽略该日志的警告信患
    monthly
    create 0660 root utmp
    rotate 1  //保留一份
}

# system-specific logs may be configured here

    配置参数的主要功能:

  当日志文件 >= log-size 的时候就转储,如果设置了size, daily, weekly,monthly 等指令无效,所以size的优先级比较高.

       子配置文件/etc/logrotate/rsyslog,以下是rsylog的配置。

/var/log/syslog
{
	rotate 7
	daily
	missingok
	notifempty
	delaycompress
	compress
	postrotate
		/usr/lib/rsyslog/rsyslog-rotate
	endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
	rotate 4   //保留4份日志
	weekly     //一周一轮询
	missingok    //日志丢失,不报错,继续记录下一份日志
	notifempty   //空文件不存储
	compress      //压缩文件
	delaycompress  //转存的日志下一次压缩
	sharedscripts //不管有多少有多少文件轮转,prerotate和postrotate代码指执行一次
	postrotate  //转换完成后执行postrotate和endscrpt之间的shell代码
		/usr/lib/rsyslog/rsyslog-rotate
	endscript  //#脚本结束
}

注意:-HUP 平滑重启 sharedscript(共享下列脚本) postrotate(日志轮转 完后执行以下共享脚本)。

4.定义自己的日志轮转

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

  • 第一种方法是直接在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略,从 而把日志加入轮替;

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

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

       设置系统的的日志轮转:

/var/log/user.log
{    
     rotate 5 //保留五份
      monthly  //一个月一轮转
      compress  //压缩
      missingok  //丢失后不报错
      notifempty //空文件不存储

}

      注意:如果搜索到该目录下面有两个地方定义这一个文件,必须要去掉,不然会报错。

启动日志轮转:

logrotate /etc/logrotate.conf

 查看日志轮转的时间

cat   /var/lib/logrotate/status

5.清理自己的log

        kern.log和syslog日志过大,怎么处理。        

echo > /var/log/syslog
echo > /var/log/syslog.1
echo > /var/log/kern.log
echo > /var/log/kern.log.1

rm -rf /var/log/kern.log.2.gz
rm -rf /var/log/kern.log.3.gz
rm -rf /var/log/kern.log.4.gz

rm -rf /var/log/syslog.2.gz
rm -rf /var/log/syslog.3.gz
rm -rf /var/log/syslog.4.gz
rm -rf /var/log/syslog.5.gz
rm -rf /var/log/syslog.6.gz
rm -rf /var/log/syslog.7.gz

 之后再syslog和kern.log加上size 100M就可以了,它的意思是到100M之后就自动开始轮转了

启动轮转: 

  logrotate /etc/logrotate.conf

       当/var/log/journal/目录下的日志太多,怎么清理了?

       1. 可以直接删除掉其中的log(短暂的,过几天又这么多,安全系数很低),对应的命令如下:         

du -sh /var/log/journal/   //查看journel日志的大小
cd  /var/log/journal/      //进入到journal日志里面
systemctl kill --kill-who=main --signal=SIGUSR2 systemd-journald.service 
//手动删除必须要采用上面的命令
rm -rf *       //删除所有文件,这个权限必须要是root权限,才可以删除里面的日志

       2. 采用journel命令的方式来删除log,安全性比较高,不会损害其他配置。

               检查当前journal使用磁盘量

                            journalctl --disk-usage

      从上面来看日志的大小占用超过928M的内存大小,该怎么来清理了?

            清理方法可以采用按照日期清理,或者按照允许保留的容量清理,只保存2天的日志,最大500M

                journalctl --vacuum-time=2d  

                journalctl --vacuum-size=500M

  3.如果想要启用日志限制持久化配置,可以修改 /etc/systemd/journald.conf

        

                        SystemMaxUse=300M   //最大使用为300M

                        ForwardToSyslog=no

然后重启rysslog服务

systemctl restart systemd-journald.service

检查journal是否运行正常以及日志文件是否完整无损坏

        journalctl --verify

      然后就来观察journel日志是否又增长超过所限制的大小。

6.rsylog的配置文件

        它的配置文件所在的路径为/etc/systemd/journald.conf,内容如下:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto  //auto 自动存储  persisent 持久存储  
#Compress=yes  //yes压缩文件gizp格式    
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K

 以下是各类参数对应的意义:

Storage在哪里存储日志文件: “volatile” 表示仅保存在内存中, 也就是仅保存在 /run/log/journal 目录中(将会被自动按需创建)。 “persistent” 表示优先保存在磁盘上, 也就优先保存在 /var/log/journal 目录中(将会被自动按需创建), 但若失败(例如在系统启动早期"/var"尚未挂载), 则转而保存在 /run/log/journal 目录中(将会被自动按需创建)。 “auto”(默认值) 与 “persistent” 类似, 但不自动创建 /var/log/journal 目录, 因此可以根据该目录的存在与否决定日志的保存位置。 “none” 表示不保存任何日志(直接丢弃所有收集到的日志), 但日志转发(见下文)不受影响。 默认值是 “auto”
Compress默认值"yes"表示: 压缩存储大于特定阈值的对象。
Seal默认值"yes"表示:如果存在一个"sealing key"(由 journalctl(1) 的 --setup-keys 命令创建), 那么就为所有持久保存的日志文件启用 FSS(Seekable Sequential Key Generators)保护, 以避免日志文件被恶意或无意的修改
SplitMode设置是否按照每个用户分割日志文件,以实现对日志的访问控制(日志守护进程会确保每个用户都能读取自己的日志文件)。 可以使用的分割策略如下: “uid” 表示每个用户都有自己专属的日志文件(无论该用户是否拥有登录会话),但系统用户的日志依然记录到系统日志中。这是默认值。 “none” 表示不对日志文件按不同用户进行分割,而是将所有日志都记录到系统日志中。这意味着非特权用户根本无法读取属于自己的日志信息。 注意,仅分割持久保存的日志(/var/log/journal), 永不分割内存中的日志(/run/log/journal)。
RateLimitIntervalSec=, RateLimitBurst=

用于限制日志的生成速度(设为零表示不作限制)。 RateLimitIntervalSec= 用于设置一个时间段长度,默认值是30秒。 RateLimitBurst= 用于设置一个正整数,表示消息条数,默认值是1000条。 表示在 RateLimitIntervalSec= 时间段内, 每个服务最多允许产生

RateLimitBurst= 数量(条数)的日志。 在同一个时间段内,超出数量限制的日志将被丢弃,直到下一个时间段才能再次开始记录。 对于所有被丢弃的日志消息,仅用一条类似"xxx条消息被丢弃"的消息来代替。 这个限制是针对每个服务的限制,一个服务超限并不会影响到另一个服务的日志记录。 RateLimitIntervalSec= 可以使用下面的时间单位:“ms”, “s”, “min”, “h”, “d

SystemMaxUse=, SystemKeepFree=, SystemMaxFileSize=, SystemMaxFiles=, RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize=, RuntimeMaxFiles=限制日志文件的大小上限。 以 “System” 开头的选项用于限制磁盘使用量, 也就是 /var/log/journal 的使用量。 以 “Runtime” 开头的选项用于限制内存使用量, 也就是 /run/log/journal 的使用量。 以 “System” 开头的选项仅在 /var/log/journal 目录确实存在且可写时才有意义。 但以 “Runtime” 开头的选项永远有意义。 也就是说, 在系统启动早期 /var 尚未挂载时、 或者系统管理员禁止在磁盘上存储日志的时候, 仅有 “Runtime” 开头的选项有意义。 journalctl 与 systemd-journald 工具会忽略日志目录中 所有后缀名不等于 “.journal” 或 “.journal~” 的文件。 换句话说, 日志目录中不应该存在后缀名不等于 “.journal” 或 “.journal~” 的文件, 因为这些文件永远不会被清理。
SystemMaxUse= 与 RuntimeMaxUse= 限制全部日志文件加在一起最多可以占用多少空间。 SystemKeepFree= 与 RuntimeKeepFree= 表示除日志文件之外,至少保留多少空间给其他用途。 systemd-journald 会同时考虑这两个因素, 并且尽量限制日志文件的总大小,以同时满足这两个限制。
SystemMaxUse= 与 RuntimeMaxUse= 的默认值是10%空间与4G空间两者中的较小者; SystemKeepFree= 与 RuntimeKeepFree= 的默认值是15%空间与4G空间两者中的较大者; 如果在 systemd-journald 启动时, 文件系统即将被填满并且已经超越了 SystemKeepFree= 或 RuntimeKeepFree= 的限制,那么日志记录将被暂停。 也就是说,如果在创建日志文件时,文件系统有充足的空闲空间, 但是后来文件系统被其他非日志文件过多占用, 那么 systemd-journald 只会立即暂停日志记录, 但不会删除已经存在的日志文件。

SystemMaxFileSize= 与 RuntimeMaxFileSize= 限制单个日志文件的最大体积, 到达此限制后日志文件将会自动滚动。 默认值是对应的 SystemMaxUse= 与 RuntimeMaxUse= 值的1/8 , 这也意味着日志滚动默认保留7个历史文件。

日志大小的值可以使用以1024为基数的 K, M, G, T, P, E 后缀, 分别对应于 1024, 1024², … 字节。

SystemMaxFiles= 与 RuntimeMaxFiles= 限制最多允许同时存在多少个日志文件, 超出此限制后, 最老的日志文件将被删除, 而当前的活动日志文件则不受影响。 默认值为100个

MaxFileSec=日志滚动的时间间隔。 通常并不需要使用基于时间的日志滚动策略, 因为由 SystemMaxFileSize= 与 RuntimeMaxFileSize= 控制的基于文件大小的日志滚动策略 已经可以确保日志文件的大小不会超标。 默认值是一个月, 设为零表示禁用基于时间的日志滚动策略。 可以使用 “year”, “month”, “week”, “day”, “h”, “m” 时间后缀, 若不使用后缀则表示以秒为单位。
MaxRetentionSec=日志文件的最大保留期限。 当日志文件的最后修改时间超过此期限后将被删除。 默认值零表示不使用基于时间的日志删除策略。 通常并不需要使用基于时间的日志删除策略,因为由 SystemMaxUse= 与 RuntimeMaxUse= 控制的基于文件大小的日志滚动策略 已经可以确保日志文件的大小不会超标。 可以使用 “year”, “month”, “week”, “day”, “h”, “m” 时间后缀, 若不使用后缀则表示以秒为单位。
SyncIntervalSec=向磁盘刷写日志文件的时间间隔,默认值是五分钟。 刷写之后,日志文件将会处于离线(OFFLINE)状态。 注意,当接收到 CRIT, ALERT, EMERG 级别的日志消息后, 将会无条件的立即刷写日志文件。 因此该设置仅对 ERR, WARNING, NOTICE, INFO, DEBUG 级别的日志消息有意义。
ForwardToSyslog=, ForwardToKMsg=, ForwardToConsole=, ForwardToWall=ForwardToSyslog= 表示是否将接收到的日志消息转发给传统的 syslog 守护进程,默认值为"no"。 如果设为"yes",但是没有任何进程监听对应的套接字,那么这种转发是无意义的。 此选项可以被内核引导选项 “systemd.journald.forward_to_syslog” 覆盖。 ForwardToKMsg= 表示是否将接收到的日志消息转发给内核日志缓冲区(kmsg),默认值为"no"。 此选项可以被内核引导选项 “systemd.journald.forward_to_kmsg” 覆盖。 ForwardToConsole= 表示是否将接收到的日志消息转发给系统控制台,默认值为"no"。 如果设为"yes",那么可以通过下面的 TTYPath= 指定转发目标。 此选项可以被内核引导选项 “systemd.journald.forward_to_console” 覆盖。 ForwardToWall= 表示是否将接收到的日志消息作为警告信息发送给所有已登录用户,默认值为"yes"。 此选项可以被内核引导选项 “systemd.journald.forward_to_wall” 覆盖。
MaxLevelStore=, MaxLevelSyslog=, MaxLevelKMsg=, MaxLevelConsole=, MaxLevelWall=MaxLevelStore= 设置记录到日志文件中的最高日志等级,默认值为"debug"; MaxLevelSyslog= 设置转发给传统的 syslog 守护进程的最高日志等级,默认值为"debug"; MaxLevelKMsg= 设置转发给内核日志缓冲区(kmsg)的最高日志等级,默认值为"notice"; MaxLevelConsole= 设置转发给系统控制台的最高日志等级,默认值为"info"; MaxLevelWall= 设置作为警告信息发送给所有已登录用户的最高日志等级,默认值为"emerg"; 这些选项既可以设为日志等级的名称, 也可以设为日志等级对应的数字: “emerg”(0), “alert”(1), “crit”(2), “err”(3), “warning”(4), “notice”(5), “info”(6), “debug”(7) 。 所有高于设定等级的日志消息都将被直接丢弃, 仅保存/转发小于等于设定等级的日志消息。 上述设置可以被如下内核引导选项覆盖: “systemd.journald.max_level_store=”, “systemd.journald.max_level_syslog=”, “systemd.journald.max_level_kmsg=”, “systemd.journald.max_level_console=”, “systemd.journald.max_level_wall=”
ReadKMsg=是否收集内核日志。 默认值 yes 表示从 /dev/kmsg 中读取内核产生的日志消息
TTYPath=指定 ForwardToConsole=yes 时所使用的控制台TTY, 默认值是 /dev/console
LineMax=在将日志流转化为日志记录时,每条日志记录最大允许的长度(字节)。 如果将单元的标准输出(STDOUT)/标准错误(STDERR)通过流套接字连接到日志中, 那么将会以换行符("\n", ASCII 10)与NUL字符("\0", ASCII 0)作为分割符, 把日志流切分成一条条独立的日志记录。 如果超过此处设置的长度之后仍然没有遇到分割符, 那么将会自动插入一个分割符,以强制将单行超长日志截断为多行。 此选项的值越大,每个日志流客户端日志守护进程占用的内存也越大(最大值等于此选项的值)。 另外,此选项的值太大也会造成与传统日志传输协议的不兼容(太长的日志无法封装在单个 AF_UNIX 或 AF_INET 报文内)。 此选项的值以字节为单位,同时也可以在数字的末尾加上 K, M, G, T 后缀(以1024为基准)。 默认值 48K 是一个足够大并且也能保持与传统日志传输协议兼容的值。 注意,不能设为小于 79 的值(将被自动提升到79)。

 

journalctl相关配置
大家可以配置自己的服务器以限定journal所能占用的最高容量。要实现这一点,我们需要编辑/etc/systemd/journald.conf文件。

以下条目可用于限定journal体积的膨胀速度:

SystemMaxUse=: 指定journal所能使用的最高持久存储容量。
SystemKeepFree=: 指定journal在添加新条目时需要保留的剩余空间。
SystemMaxFileSize=: 控制单一journal文件大小,符合要求方可被转为持久存储。
RuntimeMaxUse=: 指定易失性存储中的最大可用磁盘容量(/run文件系统之内)。
RuntimeKeepFree=: 指定向易失性存储内写入数据时为其它应用保留的空间量(/run文件系统之内)。
RuntimeMaxFileSize=: 指定单一journal文件可占用的最大易失性存储容量(/run文件系统之内)。
通过设置上述值,大家可以控制journald对服务器空间的消耗及保留方式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值