处理nacos、tomcat、nginx日志增长过快问题(logrotate可以处理所有日志清理问题)
/etc/logrotate.d/经典配置:
# logs generated by nginx
/usr/local/nginx/logs/*.log
{
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
# logs generated by question-server.jar
/logs/access_log.*.log
{
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
在CentOS上,`logrotate`是一个用于轮转、压缩和删除旧日志文件的工具。它可以帮助您管理日志文件,以避免日志文件过大占用过多的磁盘空间。`logrotate`通常通过配置文件来设置,这些配置文件位于`/etc/logrotate.d/`目录下。
以下是一个基本的`logrotate`配置文件的示例,这段配置是用于`logrotate`工具,以管理Nginx服务产生的日志文件:
# nginx big log
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/nginx_error.log
/usr/local/nginx/logs/webaccess.log
{
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/local/nginx/sbin/nginx -s reopen
endscript
}
下面是每个选项的具体含义:
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/nginx_error.log
/usr/local/nginx/logs/webaccess.log
这3行指定了要轮转的日志文件。这里列出了三个日志文件,它们都应该按照相同的规则进行轮转。
- `daily`:
指定日志文件按天轮转。这意味着`logrotate`每天会检查一次这些日志文件,并在需要时进行轮转。
- `rotate 7`:
指定保留多少个日志文件备份。在这里,它是7个,意味着除了当前的日志文件外,还会保留6个旧的日志文件。
- `missingok`:
如果日志文件丢失,`logrotate`不会报错。这在日志文件被手动删除或者重命名时很有用。
- `notifempty`:
如果日志文件为空,`logrotate`不会轮转它。这意味着只有当日志文件有内容时,才会进行轮转。
- `compress`:
轮转后的日志文件会被压缩以节省空间。压缩使用的是`gzip`。
- `delaycompress`:
与`compress`一起使用,表示延迟压缩,直到下一次轮转时才压缩上一个轮转的日志文件。
- `sharedscripts`:
指定在所有指定的日志文件轮转后只执行一次`postrotate`和`endscript`之间的脚本。
- `postrotate`:
这是一个脚本块,它在日志文件轮转后执行。在这里,它执行`/usr/local/nginx/sbin/nginx -s reopen`命令,这个命令会告诉Nginx重新打开日志文件,以便新的日志数据可以写入新的日志文件。
- `endscript`:
标记`postrotate`脚本块的结束。
总的来说,这个配置会每天轮转Nginx的访问日志和错误日志,保留7天的备份,如果日志文件丢失或为空则不报错,轮转后的日志文件会被压缩,并且在每次轮转后执行脚本以重新打开日志文件。
# /etc/logrotate.d/tomcat
/app/web-5210/logs/catalina.out
/app/local-3310/logs/catalina.out
{
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
/app/web-5210/logs/catalina.*.log
/app/web-5210/logs/localhost.*.log
/app/web-5210/logs/localhost_access_log.*.txt
/app/web-5210/logs/manager.*.log
/app/local-3310/logs/catalina.*.log
/app/local-3310/logs/localhost.*.log
/app/local-3310/logs/localhost_access_log.*.txt
/app/local-3310/logs/manager.*.log
{
daily
rotate 7
compress
missingok
notifempty
}
`copytruncate` 是 `logrotate` 的一个配置选项,用于处理日志文件的方式之一。当 `logrotate` 在轮转日志文件时,如果使用了 `copytruncate` 选项,它会执行以下步骤:
1. **复制**:`logrotate` 会先复制当前正在使用的日志文件,通常是通过重命名它,添加一个日期或者序号作为后缀。
2. **截断**:然后,`logrotate` 会将原始的日志文件**截断**到0大小,即清空它的内容,但是保持文件本身不变(文件名和权限等不变)。
使用 `copytruncate` 的好处是,它允许日志文件在不停服务的情况下被清空,这对于那些不能重新打开日志文件的服务(比如某些守护进程)或者在设计上不允许日志文件被重命名的服务来说非常有用。
然而,使用 `copytruncate` 也存在一些缺点和风险:
- **数据丢失**:在复制和截断之间可能会有数据丢失,因为复制操作完成后,而截断操作之前,如果有新的日志数据写入,这些数据将会被丢失。
- **性能影响**:截断大文件可能会对系统性能产生短暂的影响,尤其是在高负载的情况下。
- **日志不连续**:由于日志文件被清空,新的日志条目将从0开始,这可能会导致日志不连续,特别是如果日志文件是根据时间戳或事件顺序来分析的。
通常,如果可能的话,推荐使用 `postrotate` 脚本和 `reopen` 命令(如前面的示例中所示)来代替 `copytruncate`,因为这样可以避免上述问题,并且更加安全。只有在服务不支持重新打开日志文件的情况下,才考虑使用 `copytruncate`。
1.nacos日志清理
修改nacos-logback.xml
将日志级别改为error级,减少info级日志产生量
将<maxHistory>调整为2以下,将 <totalSizeCap>调整为2GB左右
比如:
[root@iZ0jlapur4hqjezy8waee0Z logs]# ll -h
total 2.1G
-rw-r--r-- 1 root root 13K Aug 1 13:18 alipay-jraft.log
-rw-r--r-- 1 root root 0 Aug 1 13:36 cmdb-main.log
-rw-r--r-- 1 root root 519M Aug 1 13:36 config-client-request.log
-rw-r--r-- 1 root root 1.3M Aug 1 13:36 config-memory.log
-rw-r--r-- 1 root root 444M Aug 1 13:36 config-pull-check.log
-rw-r--r-- 1 root root 608M Aug 1 13:36 config-trace.log
-rw-r--r-- 1 root root 20M Aug 1 13:36 nacos.log
-rw-r--r-- 1 root root 51M Aug 1 08:36 nacos.log.2023-08-01.10
-rw-r--r-- 1 root root 51M Aug 1 09:23 nacos.log.2023-08-01.11
-rw-r--r-- 1 root root 51M Aug 1 10:10 nacos.log.2023-08-01.12
-rw-r--r-- 1 root root 51M Aug 1 10:57 nacos.log.2023-08-01.13
-rw-r--r-- 1 root root 51M Aug 1 11:44 nacos.log.2023-08-01.14
-rw-r--r-- 1 root root 51M Aug 1 12:31 nacos.log.2023-08-01.15
-rw-r--r-- 1 root root 51M Aug 1 13:18 nacos.log.2023-08-01.16
-rw-r--r-- 1 root root 51M Aug 1 06:15 nacos.log.2023-08-01.7
-rw-r--r-- 1 root root 51M Aug 1 07:02 nacos.log.2023-08-01.8
-rw-r--r-- 1 root root 51M Aug 1 07:49 nacos.log.2023-08-01.9
-rw-r--r-- 1 root root 808 Jul 31 10:29 naming-event.log
-rw-r--r-- 1 root root 236K Aug 1 13:35 naming-performance.log
-rw-r--r-- 1 root root 38K Jul 31 10:37 naming-push.log
-rw-r--r-- 1 root root 7.1K Jul 31 10:31 naming-server.log
通过ll -h命令查出config-trace.log和config-pull-check.log比较大,在nacos-logback.xml中查找相关日志的配置:

把相应的日志文件大小改小:
<appender name="traceLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-trace.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-trace.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>512MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date|%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="pullCheckFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-pull-check.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-pull-check.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>512MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
调整日志级别为error级,以减少日志产生量:
<logger name="com.alibaba.nacos.config.traceLog" additivity="false">
<level value="error"/>
<appender-ref ref="traceLog"/>
</logger>
<logger name="com.alibaba.nacos.config.pullCheckLog" additivity="false">
<level value="error"/>
<appender-ref ref="pullCheckFile"/>
</logger>
这样就能及时清理日志,减小日志占用的空间
改后重启nacos
[root@iZ0jlapur4hqjezy8waee0Z nacos]# cd bin
[root@iZ0jlapur4hqjezy8waee0Z bin]# ls
derby.log file: logPath_IS_UNDEFINED logs shutdown.cmd shutdown.sh startup.cmd startup.sh work
[root@iZ0jlapur4hqjezy8waee0Z bin]# ./shutdown.sh
The nacosServer(20623) is running...
Send shutdown request to nacosServer(20623) OK
[root@iZ0jlapur4hqjezy8waee0Z bin]# ./startup.sh (这是集群启动方式,不应该用集群方式启动)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/bin/java -Djava.ext.dirs=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/ext:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/lib/ext -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/nacos/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Xloggc:/home/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/home/nacos/plugins,/home/nacos/plugins/health,/home/nacos/plugins/cmdb,/home/nacos/plugins/selector -Dnacos.home=/home/nacos -jar /home/nacos/target/nacos-server.jar --spring.config.additional-location=file:/home/nacos/conf/ --logging.config=/home/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with cluster
nacos is starting,you can check the /home/nacos/logs/start.out
需要使用单例方式启动:
[root@iZ0jlapur4hqjezy8waee0Z bin]# ./startup.sh -m standalone
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/bin/java -Djava.ext.dirs=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/ext:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/lib/ext -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xloggc:/home/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/home/nacos/plugins,/home/nacos/plugins/health,/home/nacos/plugins/cmdb,/home/nacos/plugins/selector -Dnacos.home=/home/nacos -jar /home/nacos/target/nacos-server.jar --spring.config.additional-location=file:/home/nacos/conf/ --logging.config=/home/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /home/nacos/logs/start.out
Nacos系列(4)-Nacos各种日志太多问题的终极解决办法_nacos日志_云烟成雨TD的博客-CSDN博客
2.设置自动删除定时任务(旧方法,不推荐)
打开终端并输入 crontab -e 命令来编辑 crontab 文件。
在文件末尾添加以下行(将 /path/to/access_log 替换为您的 access_log 文件的实际路径):
0 1 * * * find /home/nacos/logs -mtime +2 -type f -delete
复制
保存并关闭文件。
这样,每天凌晨 1 点,find 命令将搜索 access_log 目录中修改时间超过 2 天的文件,并将其删除。
3.有比 crontab更好的工具 logrotate
logrotate实现日志切割和清理(清晰易懂)_Smart_Maggie的博客-CSDN博客
logrotate实现日志切割和清理(清晰易懂)_Smart_Maggie的博客-CSDN博客
使用时需配置:vim /etc/logrotate.conf
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
# nginx big log
/usr/local/nginx/logs/webaccess.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/local/nginx/sbin/nginx -s reopen
endscript
}
"/etc/logrotate.conf" 49L, 895C
无需运行logrotate,在系统的/etc/cron.daily/logrotate默认配置中,已经设定为每天执行一次。
logrotate在很多Linux发行版上都是默认安装的。系统会定时运行logrotate,一般是每天一次。系统是这么实现按天执行的。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate。在centos上脚本内容是这样的:
/etc/cron.daily/logrotate
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
logrotate机制与原理
logrotate机制与原理_wx61ee58d59725e的技术博客_51CTO博客
4.tomcat日志清理
-
创建一个logrotate配置文件来管理Tomcat日志。在/etc/logrotate.d/目录下创建一个新文件并将其命名为tomcat,例如:
Copy
sudo nano /etc/logrotate.d/tomcat
-
在文件中添加以下内容:
Copy
/path/to/tomcat/logs/catalina.out {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
其中:
-
/path/to/tomcat/logs/catalina.out 是Tomcat日志文件的路径。如果您的Tomcat配置文件中指定了不同的日志文件名,请相应地更改路径。
-
daily - 每天轮换日志文件。
-
rotate 7 - 保留7个旧日志文件。
-
compress - 压缩旧的日志文件。
-
missingok - 如果日志文件丢失,不要给出错误。
-
notifempty - 如果日志文件为空,不要轮换日志文件。
-
copytruncate - 不关闭Tomcat进程,直接拷贝并截断日志文件。
-
保存并关闭文件。
-
测试logrotate配置是否正确。使用以下命令手动运行logrotate:
Copy
sudo logrotate -vf /etc/logrotate.d/tomcat
-vf参数用于输出日志并强制执行logrotate。
[root@iZ8vb2ef68w87mgjcj9m06Z logrotate.d]# cat tomcat
/app/web-5210/logs/catalina.out {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
/app/web-5210/logs/catalina.*.log
/app/web-5210/logs/localhost.*.log
/app/web-5210/logs/localhost_access_log.*.txt
/app/web-5210/logs/manager.*.log
{
daily
rotate 7
compress
missingok
notifempty
}
5.nginx日志清理
[root@iZ8vb2ef68w87mgjcj9m06Z logrotate.d]# cat nginx
# nginx big log
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/nginx_error.log
/usr/local/nginx/logs/webaccess.log
{
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/local/nginx/sbin/nginx -s reopen
endscript
}
更多推荐
所有评论(0)