1.删除文件命令:
find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;
实例命令:
find /usr/local/logs/ -mtime +15 -type f -name "*.log" -exec rm -f '{}' \;
说明:
将/usr/local/logs/目录下所有15天前带".log"的文件删除。具体参数说明如下:
find:linux的查找命令,用户查找指定条件的文件;
/usr/local/logs/:想要进行清理的任意目录;
-mtime:标准语句写法;
+15:查找15天前的文件,这里用数字代表天数;
"*.log":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;
-exec:固定写法;
rm -rf:强制删除文件,包括目录;
{} \; :固定写法,一对大括号+空格+\+;

2.计划任务:
若嫌每次手动执行语句太麻烦,可以将这小语句写到一个可执行shell脚本文件中,再设置cron调度执行,那就可以让系统自动去清理相关文件。

2.1创建shell:
touch /usr/local/logs/log.sh
chmod +x /usr/local/logs/log.sh
新建一个可执行文件log.sh,并分配可运行权限

2.2编辑shell脚本:
vi log.sh
编辑log.sh文件如下:

#/bin/bash
find /usr/local/logs/ -mtime +15 -type f -name "*.log" -exec rm -f '{}' \;


find /srv/osale/osale-im/logs/* -mtime +15 -type d -name "*" | xargs rm -rf
cd /tmp
log='find -name '*.log''     #多文件的查找的时候需要增加单引号
for file in $log
do
 cat /dev/null > $file
done

cd /tmp
log=$(find -name '*.log')    #多文件的查找的时候需要增加单引号
for file in $log
do
 cat /dev/null > $file
done

ok,保存退出(:wq)。
要用定时任务删除for里面的变量必须是具体的某一个循环值否则cron不执行,in后面要是具体变量,不能把搜索条件放在for的代码里面,多文件的查找的时候需要增加单引号
2.3计划任务:
#crontab -e
将log.sh执行脚本加入到系统计划任务,到点自动执行
输入:
10 6 * * * /usr/local/logs/log.sh >/dev/null 2>&1
11 6 * * * cat /dev/null > `find /tmp -name *.log`  
这里的设置是每天凌晨6点10分执行log.sh文件进行数据清理任务了。

00 02 * * * echo " " >/tmp/a.log
然后保存退出就可以了。这段内容意思是,每天凌晨2点自动清空a.log内容。
上面的那个日志清除测试删除目录会成功但是有报错误,所以采用xargs删除日志
find /srv/osale/osale-jfb/logs/ -mtime +15 -type d -name "*" | xargs rm -rf
删除文件日志
find /srv/osale/osale-jfb/logs/ -mtime +15 -type f -name "*.log" | xargs rm -rf

cat /dev/null > rdc_deploy_command_1649328972466.log #清理正在写入的日志,不影响正常写入

touch -mt  201909052248  test.log         #创建一个过期文件,执行脚本看能否删除

sh -x log.sh

#!/bin/bash

cd /tmp
log=$(find -name '*.log')    
for file in $log
do
 cat /dev/null > $file
done

find /srv/daudit/daudit-*/logs/* -mtime +30 -type d -name "*" | xargs rm -rf



0 0 * * * /home/log.sh >/dev/null 2>&1

Linux中清理/var/log/journal/垃圾日志

清空 /var/log/journal 文件的方法

1、用echo命令,将空字符串内容重定向到指定文件中
echo "" > system.journal
说明:此方法只会清空一次,一段时间后还要再次手动清空很麻烦,这里可以用以下命令让journalctl 自动维护空间

2、journalctl 命令自动维护文件大小
1)只保留近一周的日志

journalctl --vacuum-time=1w
2)只保留500MB的日志

journalctl --vacuum-size=500M
3)直接删除 /var/log/journal/ 目录下的日志文件

rm -rf /var/log/journal/f9d400c5e1e8c3a8209e990d887d4ac1
问题与分析解决
执行 journalctl 命令时报错:Error was encountered while opening journal files: Input/output error

[root@iZbp153yczpm4pp9pjs0u3Z /]# journalctl --vacuum-time=1w
Error was encountered while opening journal files: Input/output error
问题分析:日志文件损坏

解决方法:删除之前的日志,并重启 journalctl 服务

mv journal/f9d400c5e1e8c3a8209e990d887d4ac1 journal/f9d400c5e1e8c3a8209e990d887d4ac1_bk_20190122
systemctl restart systemd-journald.service
查看 /var/log/journal/ 日志目录如下:

[root@iZbp153yczpm4pp9pjs0u3Z /]# ll /var/log/journal/
drwxr-sr-x  2 root systemd-journal  4096 Jan 22 11:26 f9d400c5e1e8c3a8209e990d887d4ac1
drwxr-sr-x+ 2 root systemd-journal 12288 Jan 14 15:37 f9d400c5e1e8c3a8209e990d887d4ac1_bk_20190122
然后,再执行 journalctl 限制日志的命令:

[root@iZbp153yczpm4pp9pjs0u3Z /]# journalctl --vacuum-time=1w
Vacuuming done, freed 0B of archived journals on disk.
[root@iZbp153yczpm4pp9pjs0u3Z /]# journalctl --vacuum-size=500M
Vacuuming done, freed 0B of archived journals on disk.

虽然日志持久化很有用,但如果不加以管理,日志文件可能会占用大量磁盘空间。我们可以通过配置/etc/systemd/journald.conf文件来限制日志文件的大小。
[Journal]
# 日志文件最大占用空间
SystemMaxUse=500M
# 重新启动服务
systemctl restart systemd-journald

centos7系统日志保留时间修改

/var/log/messages 日志默认保留4周,结果系统盘满了,所以要修改/etc/logrotate.conf配置文件将4周改为1周

 systemctl restart rsyslog 重启或者强制执行生效logrotate -f /etc/logrotate.conf

docker日志过大问题解决

 1.问题

docker容器日志导致主机磁盘空间满了。docker logs -f container_name噼里啪啦一大堆,很占用空间,不用的日志可以清理掉了。

2. 解决方法

2.1 找出Docker容器日志

在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以json.log结尾的文件(业务日志)很大,查看各个日志文件大小的脚本docker_log_size.sh,内容如下:

#!/bin/sh
echo "======== docker containers logs file size ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
ls -lh $log
done

chmod +x docker_log_size.sh
./docker_log_size.sh
2.2 清理Docker容器日志(治标)

如果docker容器正在运行,那么使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。接下来,提供一个日志清理脚本clean_docker_log.sh,内容如下:

#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"


chmod +x clean_docker_log.sh
./clean_docker_log.sh

但是,这样清理之后,随着时间的推移,容器日志会像杂草一样,卷土重来,可以加个定时任务每周自动清理一次
0 0 * * 6 /home/clean_docker_log.sh >/dev/null 2>&1

2.3 设置Docker容器日志大小(治本)

设置一个容器服务的日志大小上限
上述方法,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器服务的日志大小上限。这个通过配置容器docker-compose的max-size选项来实现

nginx:
image: nginx:1.12.1
restart: always
logging:
driver: “json-file”
options:
max-size: “5g”
重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了。

全局设置

新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:

# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://yhu8ih4x.mirror.aliyuncs.com"]
}
{
  "log-driver":"json-file",
  "log-opts": {"max-size":"50m", "max-file":"3"}
}

max-size=500m,意味着一个容器日志大小上限是500M,

max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

// 重启docker守护进程
# systemctl daemon-reload
# systemctl restart docker

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐