Tomcat nginx log日志按天分割切割
利用 Linux 自带的 logrotate 工具来实现按天切割日志.下方已 centos 7 系统为例来实践讲解.
原理
Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。
- 每晚 cron 后台执行
/etc/cron.daily/目录下的任务 - 这会触发
/etc/cron.daily/logrotate文件,通常这在 linux 安装的时候包含了。 它会执行命令/etc/cron.daily/logrotate /etc/logrotate.conf这个配置文件包含了所有在/etc/logrotate.d/的脚本。- 这会触发我们下面写的
/etc/logrotate.d/tomcat-log-cut文件。
Tomcat 日志分割脚本(按天)
- 1.在
/etc/logrotate.d/下面新建一个文件,文件名随意,此处以 tomcat-log-cut 为例.
vim /etc/logrotate.d/tomcat-log-cut - 2.脚本内容
/opt/web/apache-tomcat/logs/catalina.out { #此处的 tomcat 路径请自行更换为你自己的
daily # 每天切割
rotate 5 # 保留 5 个备份
dateext # 这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如 xxx.log-20131216 这样,如果注释掉,切割出来是按数字递增,即 xxx.log-1 这种格式
dateformat .%Y%m%d # 配合 dateext 使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合 dateext 使用,只支持 %Y %m %d %s 这四个参数
#size 100M # 大小到达 size 开始转存
notifempty # 如果是空文件的话,不转储
missingok # 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
copytruncate # 拷贝原日志文件,并且将其变成大小为0的文件。
}
- 3.重启 tomcat 服务.
- 4.执行下面的命令测试一下.
/usr/sbin/logrotate /etc/logrotate.conf
- 5.如果没有成功,再执行下面的命令排查问题
/usr/sbin/logrotate -v -f -d /etc/logrotate.d/tomcat-log-cut
logrotate 参数说明
| 参数 | 说明 |
|---|---|
| compress | #通过gzip 压缩转储以后的日志 |
| nocompress | #不做gzip压缩处理 |
| create mode owner group | #轮转时指定创建新文件的属性,如create 0777 nobody nobody |
| nocreate | #不建立新的日志文件 |
| delaycompress | #和compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
| nodelaycompress | #覆盖 delaycompress 选项,转储同时压缩。 |
| missingok | #如果日志丢失,不报错继续滚动下一个日志 |
| ifempty | #即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 |
| notifempty | #当日志文件为空时,不进行轮转 |
| mail address | #把转储的日志文件发送到指定的E-mail 地址 |
| olddir directory | #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
| noolddir | #转储后的日志文件和当前日志文件放在同一个目录下 |
| sharedscripts | #运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 |
| prerotate | #在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 |
| postrotate | #在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 |
| daily | #指定转储周期为每天 |
| weekly | #指定转储周期为每周 |
| monthly | #指定转储周期为每月 |
| rotate count | #指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 |
| dateext | #使用当期日期作为命名格式 |
| dateformat .%s | #配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 |
| size(或minsize) log-size | #当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem). |
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M
**值得注意的一个配置是:copytruncate **
copytruncate 如果没有这个选项的话,操作方式:是将原log日志文件,移动成类似log.1的旧文件, 然后创建一个新的文件。 如果设置了,操作方式:拷贝原日志文件,并且将其变成大小为0的文件。
区别是:如果进程,比如 Tomcat 使用了一个文件写日志,没有 copytruncate 的话,切割日志时, 把旧日志 Catalina.out->Catalina.out.1 ,然后创建新日志Catalina.out。这时候 tomcat 打开的文件描述符依然时Catalina.out.1,由于没有信号通知tomcat 要换日志描述符,所以它会继续向 Catalina.out.1 写日志,这样就不符合我们的要求了。 因为我们想切割日志后,tomcat 自动会向新的 Catalina.out 文件写日志,而不是旧的 Catalina.out.1 文件.
解决方法有两个:
- 向上面的 tomcat 切割日志配置,再 postrotate 里面写个脚本
postrotate # 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
[ -s /run/tomcat.pid ] && kill -USR1 `cat /run/tomcat.pid`
endscript
这样就是发信号给tomcat ,让 tomcat 关闭旧日志文件描述符,重新打开新的日志文件描述,并写入日志
2.使用 copytruncate 参数,向上面说的,配置了它以后,操作方式是把 Catalina.out 复制一份 成为 Catalina.out.1,然后清空 log 的内容,使大小为0,那此时 log 依然时原来的旧 log,对进程(tomcat)来说,依然打开的是原来的文件描述符,可以继续往里面写日志,而不用发送信号给 tomcat
copytruncate 这种方式操作的时候, 拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate 备份日志文件不过不截断。
本文参考:https://www.cnblogs.com/276815076/p/7053640.html(主要) 与 https://blog.csdn.net/seelye/article/details/79276216.做了整理优化.
Tomcat nginx log日志按天分割切割的更多相关文章
- Nginx log日志切割shell
#!/bin/bash#此脚本用于自动分割Nginx的日志,包括access.log和error.log#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx- ...
- Nginx之——日志按日期分割的实现(基于CentOS操作系统)
Nginx自身是没有按日期切割日志的功能,可以用shell脚本实现.新建一个cut_log.sh, #!/bin/sh # Program: # Auto cut nginx log script. ...
- Nginx Log日志统计分析常用命令
IP相关统计 统计IP访问量(独立ip访问数量) awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) gr ...
- tomcat的log日志乱码解决方案
Intellij idea Tomcat输出log中文乱码 配置tomcat在VM options添加-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 重启后控 ...
- nginx log日志分割
@echo offrem 备份并根据时间重命名错误日志文件set "cmdstr=move E:\nginx\logs\error.log E:\nginx\logs\error%date: ...
- Nginx log日志参数详解
$args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符 ...
- 14 Nginx访问日志自动按天切割
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin LOG_DIR=/usr/loc ...
- 日志切割工具logrotate解决Tomcat catalina.out日志过大的问题
一.介绍日志切割logrotate 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了 ...
- Linux nginx日志按天分割实例
Linux nginx日志按天分割实例 nginx的日志有个小缺点,日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将导致日志文件非常大,不便于管理这就需要我们自己来实现了,按日期每 ...
随机推荐
- 记录一个在制作Swing程序的小怪事
在制作一个Swing程序时,出现了奇怪的事情,程序在Eclipse里执行正常,但打包后再执行那些动态执行的控件就消失不见了.截图如下: 在Eclipse里正常执行的画面: 打包执行后出现的画面: 可以 ...
- 算法笔记_105:蓝桥杯练习 算法提高 上帝造题五分钟(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 第一分钟,上帝说:要有题.于是就有了L,Y,M,C 第二分钟,LYC说:要有向量.于是就有了长度为n写满随机整数的向量 第三分钟,YUHC ...
- QueryRunner
在相继学习了JDBC和数据库操作之后,我们明显感到编写JDBC代码并非一件轻松的事儿.为了帮助我们更高效的学习工作,从JDBC的繁重代码中解脱出来,xx给我们详尽介绍了一个简化JDBC操作的组件——D ...
- mysql union和union all 的差别以及使用
Union由于要进行反复值扫描,所以效率低.假设合并没有刻意要删除反复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样.并且字段类型要"相容"(一致). ...
- UE添加鼠标右键打开
重装了下系统,有一些工具,不用重新安装还是能用的,比如UE.pl/sql,就当是绿色软件了.但是有些在鼠标右键里的功能没有了 ,比如UE的右键打开. 可以这样修改:打开UltraEdit->高级 ...
- myBatis的引出
jdbc 优点:简单易学,上手快,非常灵活构建sql,效率高. l缺点:代码繁琐,难以写出高质量的代码(资源的释放,SQL注入安全性等),开发者关注多,又要写业务逻辑,又要关注对象的创建和销毁. Hi ...
- Android App补丁更新
上一周比较忙,忙的不可开交,写的文章也就两篇,在此希望大家见谅.这周呢,突然闲下来了,有时间了,就重构了下代码,捣鼓点前卫的技术,沉淀沉淀.所以呢,今天就分享下这几天研究的东西. 移动互联网主打的就是 ...
- WCF公开服务元数据方式
一般我们使用了scvutil命令自动生成了服务的客户端代理类: 例如:svcutil http://localhost:8000/?wsdl /o:FirstServiceClient.cs 命令中h ...
- 企业信息系统集成框架(设计思路)C模式
1.客户端.h文件 #pragma once #include<stdlib.h> //A程序员定义接口形式和调用模式 //初始化句柄 typedef int(*Init_Socket)( ...
- pandas drop_duplicates
函数 : DataFrame.drop_duplicates(subset=None, keep='first', inplace=False) 参数:这个drop_duplicate方法是对Data ...