Linux运维之日志管理

标签: Linux 分类: 未分类 创建时间:2021-01-15 08:26:29 更新时间:2024-11-15 10:49:43

有时候不注意,SpringBoot程序以及nacos文件就回产生很多的日志文件,如果不定期删除,就会出现磁盘空间被占满的情况,导致很多的程序无法运行,最近就遇到了这样的问题,被披头盖脸的骂了一顿,老板很生气,我也很生气,但是工作还是要做的啊。

主要的日志:

  • nacos的access日志

  • tomcat的catalina日志

  • springboot的logback日志

1.磁盘空间查看

出现最常见的磁盘空间沾满的情况,可以使用下面的几条命令查看磁盘空间的使用情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 查看磁盘剩余情况
df -hl

## or
df -h

## 查找全局大文件
find / -xdev -size +100M -exec ls -l {} \;

## 进入文件目录,查看文件大小
du -sh *
## 对/目录进行磁盘占用量进行排序
du -sh /* | sort -nr
## 然后进行一级一级的查看,然后就是使用rm -rf 进行清理
du -sh /var/* | sort -nr

## 使用rm 命令删除文件
rm -rf *

## 查看哪些文件超过1G大小
find / -xdev -size +1G -exec ls -l {} \;
find / -type f -size +1G -exec du -h {} \;

2.nohup不记录日志

有时候如果使用了logback进行日志文件记录,我觉得可能就不需要输出nohup.out文件了,因为使用nohup命令后台执行java程序,默认的就会产生nohup.out文件,有时候会变的很大,可以使用linux的重定向讲错误输出到 /dev/null 中。

1
2
3
4
5
## 只输出错误信息到日志文件
nohup ./program >/dev/null 2>log &

## 什么信息也不要
nohup ./program >/dev/null 2>&1 &

3.tomcat日志

tomcat的catalina.out文件也有可能变的很大,可以进行相应的精简和删除。

参考文章:
1.解决catalina.out文件过大的问题 (这篇文章是说如何才能解决tomcat的日志文件输出过大的问题,使用日志切割工具cronolog、logrotate,使用脚本进行日志切割,或者是定义日志级别的版本)
2.Tomcat清理日志文件无法立即释放磁盘空间

4.定时脚本

根据参考文章2中的脚本,我改造了相关的脚本。可以遍历directory.txt文件中指定的目录(每一个目录一行),判断最后修改时间是否比当前时间要早5天,如果是,则自动删除。

(1) 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env bash
#该脚本是获取deleteDirectory.txt文件中配置的目录,然后遍历每个目录,获取所有文件及其最后修改日期,并删除最后修改日期在15天之前的文件。
echo -e "\n\n"

#计算当前时间和要被删除的文件的最早的修改日期
today=`date +"%Y-%m-%d %H:%M:%S"`
echo -e "开始执行时间:${today}"
deleteDate=`date -d"-5 day" +%Y-%m-%d`
echo -e "要删除的日志文件的最后修改日期:${deleteDate}\n"

#进入目录,然后删除文件的方法
function enterDirectory() {
files=`ls $1`
for file in ${files} ; do
if [[ -f "$1/$file" ]]; then
## 原先的脚本无法运行
## modifyDate=`stat "$1/${file}" | awk '{print $1}' |sed -n '6p'`

## 获取文件最后的修改时间
modifyDate=`stat "$1/${file}" | grep -i Modify| awk '{print $2}'`
if [[ $(echo ${modifyDate} ${deleteDate} | awk '$1<$2 {print -1} $1==$2 {print 0} $1>$2 {print 1}') -eq -1 ]]; then
rm -f "$1/${file}"
echo -e "$1/${file} 文件被删除"
fi
else if [[ -d "$1/$file" ]]; then
enterDirectory "$1/$file"
fi
fi
done
}


#遍历指定的目录,然后将目录下所有的文件按照指定规则删除
while read -r line
do
enterDirectory ${line}
done < /cloud/crontab/clean_logs/directory.txt

(2) 其中的directory.txt

1
/usr/local/tomcat9.0.30/logs
参考文章:
1.shell脚本:遍历删除
2.linux脚本监视指定日志目录,删除目录下15天之前的日志文件 (这篇文章的脚本,我没有运行成功,好处是支持遍历文件夹)
3.linux定时删除日志脚本 (这个其实利用的是find方法,然后查找文件,执行删除任务,不好的地方就是不能遍历文件夹)
4.shell:读取文件的每一行内容并输出
5.Linux获取文件最后修改时间 (这里有一点就是 awk ‘{print $6 “-“ $7 “-“ $8 }’ 这个用法还是让我知道了如何打印某一个片段)
6.linux下查看和修改文件时间 (这里提供了一个 grep -i Modify 可以查看文件的修改时间)

(3) 定时任务

1
2
3
4
5
## 编辑定时任务
crontab -e

## 增加如下脚本,每天零点开始执行
00 00 * * * /bin/bash /cloud/crontab/clean_logs/clean_logs.sh
参考文章:
1.linux 让 crontab 每天03点00 访问一次指定的url
2.关于定时执行任务:Crontab的20个例子
3.windows服务器自动删除日志文件 (这里是windows上使用bat文件自动执行删除文件的脚本:forfiles -p “D:\Logs” -s -m *.log -d -7 -c “cmd /c del @path”,需要在系统任务计划程序中,设置定时任务)
4.Windows 2008 计划任务配置 (如何设置windows的定时计划任务)

5.Docker清理

(1) 手动清理
手动清理,也是使用docker提供的命令进行的,主要就是prune命令,执行后,会询问是否要进行清理,输入y就可以了。

1
2
3
4
5
## 这样会让你输入y
docker system prune

## or
docker system prune -a

(2) 日志文件
容器的日志 则可以通过 docker logs 命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。如果深究其日志位置,每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为 Docker 提供了更完善地日志收集方式 - Docker 日志收集驱动。

编写日志清理脚本clear_docker_logs.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
echo 'input log file size '$1
default=20
if [ -n "$1" ]
then
default=$1
fi

max=`expr 1024 \* $default`
echo 'current set file size '$max
for file in ` ls /var/lib/docker/containers/*/*-json.log `
do
#echo $file
s=`du -k $file |awk '{print $1}'`
# echo $s
if [ $s -gt $max ]
then
echo 'remove'$file
truncate -s 0 $file
echo 'removed'$file
fi
done

编辑定时任务,加入crontab 每隔半小时清理日志

1
2
3
4
5
## 赋予执行权限
chmod +x clear_docker_logs.sh

#crontab -e
*/30 * * * * /bin/sh /data/docker/docker_logs.sh 20 >> /root/mylog.log 2>&1
参考文章:
【1】./var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录 使用:docker system prune 命令进行清理。
【2】.【已解决】docker overlay2占用大量磁盘空间处理方法 通过手动或定时任务进行清除,当然这篇文章中没有介绍自动清理的方法,只是使用了:cat /dev/null > *-json.log 进行手动清理。
【3】.docker清理大杀器/docker的overlay文件占用磁盘很大??_昨天在梦里-程序员宅基地_docker overlay 方法一:docker system prune -a,方法二:安装portainer,使用portainer进行管理。
【4】.docker目录迁移及docker日志自动清理 修改了Docker 的根目录,还提供了进行自动清理日志文件的脚本,并添加了定时任务,我看脚本的内容,也是主要清理的 *-json.log 文件。
【4】.【已解決】docker overlay2佔用大量磁碟空間處理方法 處理方式1:也是清理json.log文件,方式二,就是用prune命令进行清理
【5】.docker 日志位置
【6】./var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间

6./var/log/journal/ 垃圾日志清理

1
2
3
4
5
## 只保留近一周的日志
journalctl --vacuum-time=1w

## 只保留500MB的日志
journalctl --vacuum-size=500M
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。