文章 GitHub 地址 :运维常用应用的日志分割

一 、Nginx-Tomcat 等常用服务日志分析

在实际生产中,我们知道哪些应用的日志会自动分割吗?哪些应用日志需要我们通过服务进行定时分割?接下来我们来看看。

对比的标准

  • 是否会自动切割 ?
  • 重启是否会自动分割 ?

Nginx 日志

日志名称 日志描述 是否自动切割 是否需要定时切割
access.log Nginx 访问日志
error.log Nginx 错误日志

如果需要单独配置网站日志的话需要在 server 模块添加access_log logs/djx.log ;

Tomcat日志

日志名称 日志描述 是否自动切割 是否需要定时切割
catalina.out Tomcat 运行时日志和输出到控制台日志(应用)
catalina.2019-04-28.log Tomcat本身运行的日志,主要是启动和暂停的。
localhost_access_log.2019-04-28.txt 访问 Tomcat 的日志,请求时间和资源,状态码都有记录
localhost.2019-04-28.log 应用初始化(listener, filter, servlet)未处理的异常最后被 Tomcat 捕获而输出的日志
host-manager.2019-04-28.log 放 Tomcat 的自带的 Host Manager项目的日志信息的
manager.2019-04-28.log Tomcat 自带 Manager项目专有的日志文件

Tomcat 的日志比较特别和有意思,我也是认真看了看才发现其中的奥秘。

画重点了

Tomcat 的 catalina.out 日志是 不会自动切割的,所以我们需要对它进行定时切割,重启 Tomcat 也是不会自动切割的。

其它的日志 Tomcat 是会进行自动切割的,但是会遵循这样的一个规则:日志隔天切割,有日志才切割,重启会切割:

  • 日志隔天切割 :含义是 日志在24.00分才会进行切割,如果 00:00:10 产生了当天的第一条日志,那么就进行切割。
  • 有日志才切割 :含义是 如果满足了隔天的要求,但是第二天一直没有产生日志,那么就会直到第二天第一条日志产生时才进行切割。
  • 重启切割 : 含义是 如果上面的条件都不满足,就是到了第二天,但是一条日志一直都没有产生,那么在重启Tomcat 时是会进行切割的。

上面内容有点绕,我们举几个示例理解下。

示例1:

	Tomcat 在 2019 年 4 月28号15.30分启动的,有日志文件 catalina.2019-04-28.log 等。2019 年 4月29号的第一条日志在 2019 年 4月29号9.30分。那么日志切割在什么时候?

​		日志切割是在  2019 年 4月29号9.30分。

示例2:

		Tomcat 在 2019 年 4 月28号10.30分启动的,有日志文件 catalina.2019-04-28.log 等。在 2019 年 4月29号3.30分重启了 Tomcat  ,但是在重启前,Tomcat 在2019 年 4月29号3.30分当天是没有产生日志的,但在  2019 年 4月29号 3.50 产生了日志。问在什么时候切割了日志?

​		Tomcat   重启时就进行了切割。

MongoDB 日志

MongoDB 的日志我们平时是关注的比较少,但是我们这边还是做下记录。

MongoDB 的日志是否切割取决于 MongoDB 的配置参数。

logRotate= rename/reopen
#3.0.0版中的新功能。可以取值为 rename 或 reopen:
rename 重命名日志文件。每次重启都会重命名日志文件。
reopen 按照典型的 Linux/Unix 日志循环行为关闭并重新打开日志文件。使用 reopen 使用的 Linux/Unix logrotate的工具时,以避免日志的丢失。
如果指定 reopen,则还必须使用 logappend
logappend= true # 当 MongoDB 实例重新启动时,将新的日志内容添加到现有日志文件的末尾。如果没有此选项,MongoDB 将备份现有日志并创建新文件。

但是,MongoDB 的日志默认是不会进行切割的(如果不重启的话)。

MongoDB 日志切割 见文章 :MongoDB 日志切割三种方式

Redis 日志

Redis 日志默认也是不切割的, 重启也不切割。 Redis 日志在实际环境中我们也是建议进行切割的,切割频率可以降低。我看到有的 Redis 日志达到 1G,运行了2年,那么我们进行查找日志就比较不方便的,所以建议 Redis 的日志也进行切割。

二 、日志切割服务 logrotate

我们通常会去寻找对应的日志切割服务,但是我们不知道系统默认已经默认带了一个日志的切割服务 logrotate。像我们系统的日志 /var/log/cron/var/log/maillog/var/log/messages等等这些都是通过 logrotate 来进行切割的,我们可以在文件 /etc/logrotate.d/syslog 看到具体的配置。logrotate 可以每天或者每个月按周期对日志进行自动切割和压缩,以及通过邮件发送。logrotate 的自动切割是 通过 crond 来运行任务的。

logrotate 官方链接

logrotate 命令以及选项

logrotate [OPTION...] <configfile>
-d, --debug # 仅仅是测试,并不做任何东西。在测试配置文件是否正确的时候可以使用。
-f, --force # 指定配置文件
-m, --mail=command # 指定发送邮件的命令,替代 /bin/mail
-s, --state=statefile # 指定状态文件的路径 ,默认路径是 /var/lib/logrotate.status 。
-v, --verbose # 显示 logrotate 分割信息
-l, --log=STRING # 指定日志文件的路径
--version # 显示版本信息

logrotate 配置文件路径

logrotate 配置文件的位置 位于/etc/logrotate.conf

logrotate 用户配置文件位于 /etc/logrotate.d/

logrotate 的执行状态文件/var/lib/logrotate.status

logrotate 配置文件的参数:

su djx  djx  # 指定切割用户和用户组,默认为root。一定要加 用户组 ,否则会报错。
compress # 是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行
compresscmd # 指定压缩的命令,默认 gzip
uncompresscmd # 用于解压缩的日志文件的命令 默认是 gunzip
compressext # 启用压缩的扩展名,默认 gzip 的扩展名就是 .gz。
copy # 制作日志文件的副本,与create选项互斥。
copytruncate # 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。与create选项互斥。
create mode owner group # 在切割后,创建新的日志文件,并指定数据的权限和所有者和所属组。
dateext # 这个参数很重要!就是切割后的日志文件以当前日期YYYYMMDD为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
dateformat format_string # 指定日志文件后缀日期格式
ifempty # 表示即使是空文件也要选择,该选项是默认值。与 notifempty 相反
notifempty # 当日志文件为空时,不进行轮转,与 ifempty 相反
mailfirst # 当配置了邮件地址,指定发送最新的文件
maillast # 当配置了邮件地址,指定发送最旧的文件,(默认设置)
rotate count # 日志保留的次数, 如果该参数不写的话,默认就是删除之前所有的文件日志。比如切割了200次,那么只保留最新的180次日志,并删除旧的20次日志。如果配置文件指定的是 daily,那每天切割一次日志,就意味着保留180天日志。
maxage count # 删除早于 count 天的日志,如果配置了 mail 则通过邮件发送。
daily # 每天 切割
weekly # 每周运行一次,通常在每周的第一天。
monthly # 每月运行一次切割,通常会在该月的第一天。
yearly # 如果当前年份与上一次年份不相同,就会进行切割
nocompress # 不进行压缩。
size size # 日志文件达到多大就切割
olddir dir # 切割后存放的目录
start count # 当没有指定日期后缀,将数字作为后缀内容,默认是从 1 开始 。可以指定其他数字开始。
missingok # 如果日志丢失,不报错继续滚动下一个日志
mail 112@163.com # 该参数与 rotate 是有关联的,当超过 rotate 指定次数,文件不是删除,而是通过邮件发送到指定位置。
prerotate # 在logrotate转储之前需要执行的指令
postrotate # 在logrotate转储之后需要执行的指令 ### 3.85 版本增加每个小时切割
hourly # 每个小时切割

示例配置

#  文件路径,可以使用通配符。
/opt/tomcat/logs/catalina.out{
compress
compressext .gz
copytruncate
dateext
notifempty
maillast
rotate 180
daily
size 10M
olddir /opt/logs/tomcat
missingok
mail 888888@qq.com # 如果我们本地没有配置好发送邮件配置的话是发送不了邮件的。
}

常用命令

logrotate -d -f /etc/logrotate.d/tomcat  # 测试配置文件是否配置正常
logrotate -f /etc/logrotate.d/tomcat # 立刻切割文件,可以将该命令放到定时任务中实现定时切割

注意事项:

  • 当我们设置好日志按日进行切割的时候,具体的执行时间是在什么时候呢?我们不要以为是会在 24.00 的时候进行切割的,它进行切割的时间是随机的。这个随机值取决于 crond 服务的,最终会取决于文件 /etc/anacrontab

    [root@localhost ~]# cat /etc/anacrontab
    # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    # the maximal random delay added to the base delay of the jobs # 延迟时间
    RANDOM_DELAY=45
    # the jobs will be started during the following hours only 执行时间段
    START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command
    1 5 cron.daily nice run-parts /etc/cron.daily
    7 25 cron.weekly nice run-parts /etc/cron.weekly
    @monthly 45 cron.monthly nice run-parts /etc/cron.monthly

    我们可以发现 定时任务是会在 3-22点的5分-45分里面进行日志切割。

  • 生产环境中该如何定时日志分割

    我们在实际的生产环境中,我们通常会进行按日进行日志分割,也就是我们希望在 24.00 进行前一天的日志分割,我们可以通过 crond 服务进行定时切割 (logrotate -f /etc/logrotate.d/tomcat ), 但是我们通常在很多应用中会有定时任务在 24.00进行执行,那个时间段也就会产生大量的日志,如果我们在此时切割,那么我们可能会导致比较多的重要的日志丢失(并且此时任务多,资源消耗多,切割也慢),那么我们建议先咨询开发,24.00 是否有大量定时任务,我们可以在 24.00之前几分钟或者之后几分钟 进行切割。这样就避免大量的日志丢失。

三、日志切割示例

Nginx 切一切

示例:Nginx 日志保存在 /opt/nginx/logs/,包含日志 access.logerror.log

/opt/nginx/logs/* {
compress
compressext .gz
copytruncate
dateext
notifempty
maillast
rotate 180
daily
size 10M
olddir /opt/logs/nginx
missingok
mail 888888@qq.com # 如果我们本地没有配置好发送邮件配置的话是发送不了邮件的。
}

Tomcat 切一切

示例:Tomcat 日志保存在 /opt/tomcat/logs/,包含日志 catalina.out,其他日志会自动切割。

/opt/tomcat/logs/catalina.out{
compress
compressext .gz
copytruncate
dateext
notifempty
maillast
rotate 180
daily
size 10M
olddir /opt/logs/tomcat
missingok
mail 888888@qq.com # 如果我们本地没有配置好发送邮件配置的话是发送不了邮件的。
}

Nginx-Tomcat 等运维常用服务的日志分割-logrotate的更多相关文章

  1. 盘点Linux运维常用工具(一)-web篇之httpd

    #前言:想把自己学的各种服务进行分类归档起来,于是就写了盘点Linux运维常用工具,Linux方面使用到的web应用服务有httpd(apache).nginx.tomcat.lighttpd,先了解 ...

  2. Linux运维-常用操作-培训用例

    一.服务器环境 Centos 7.9 二.常用连接工具(免费) 1.Finalshell 2.MobaXterm 3.Putty + WinSCP 三.Linux  系统目录结构 /bin :是 Bi ...

  3. 运维架构服务监控Open-Falcon

    一. 介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题.监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择.当公司刚 ...

  4. Hadoop集群-HDFS集群中大数据运维常用的命令总结

    Hadoop集群-HDFS集群中大数据运维常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客会简单涉及到滚动编辑,融合镜像文件,目录的空间配额等运维操作简介.话 ...

  5. centos 7 查看系统/硬件信息及运维常用命令+联想Y430P无线网卡驱动安装

     centos 7 查看系统/硬件信息及运维常用命令 当前环境:联想Y430P  CentOS 7.3 [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的Li ...

  6. Zookeeper运维常用四字命令

    Zookeeper运维常用四字命令 echo stat|nc 127.0.0.1 2181 查看哪个节点被选择作为follower或者leader 使用echo ruok|nc 127.0.0.1 2 ...

  7. Linux运维常用150个命令

    Linux运维常用150个命令 转载自:www.cnblogs.com/bananaaa/p/7774467.html 命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更 ...

  8. Linux运维常用的几个命令介绍【转】

    Linux运维常用的几个命令介绍 1. 查看系统内核版本​ [root@funsion geekxa]# cat /etc/issue CentOS release 6.5 (Final) Kerne ...

  9. 14-redis运维常用命令

    一:运维常用的server端命令    TIME 查看时间戳与微秒数 DBSIZE 查看当前库中的key数量 BGREWRITEAOF 后台进程重写AOF BGSAVE       后台保存rdb快照 ...

随机推荐

  1. ios--NavigationViewController跳转、返回传值

      使用NavigationViewController进行页面跳转时,应该使用pushViewController方法来跳转至下一页面,这样的话,下一页面同样在NavigationViewContr ...

  2. Scrum冲刺博客

    一.各个成员在Alpha阶段认领的任务 已完成 二.各个成员的任务安排 三.整个项目期的任务量 按实际考试情况以及开发情况决定,初始计划是完成登录以及个人目标版块的完整功能,其它版块共进,保证最终能够 ...

  3. Fundebug 微信小游戏异常监控插件更新至 0.5.0,支持监控 HTTP 慢请求

    摘要: 支持监控 HTTP 慢请求,同时修复了记录的 HTTP 响应时间偏小的 BUG. Fundebug是专业微信小游戏 BUG 监控服务,可以第一时间捕获线上环境中小游戏的异常.错误或者 BUG, ...

  4. foreachRDD

    需求: 将统计结果写入到MySQL create table wordcount( word varchar(50) default null, wordcount int(10) default n ...

  5. python 自带模块 os模块

    os模块 首先可以打开cmd输入python进入交互界面  然后输入 dir(os) 就可以看到os的全部用法了  我们简单的举几个例子就行了. 写入os.getcwd()  可以查看当前所在路径 i ...

  6. 使用策略组禁止win10某个程序运行

    打开策略组:win+R----gpedit.msc 一.计算机配置——windows设置——安全设置——软件限制策略——其他规则——空白处右键,新建哈希规则 点击浏览,并不安全级别设置为不允许,选中程 ...

  7. Linux(Centos7)搭建LAMP(Apache+PHP+Mysql环境)

    目录 Linux搭建LAMP(Apache+PHP+Mysql环境)Centos7 一. 检查系统环境 1.确认centos版本 2.检查是否安装过apache 3.检查是否安装过Mysql 4.清理 ...

  8. 每次都能让人头大的 Shader -- 从整合说起

    之前也说过引擎能不能提供一个一般化的开发环境给使用者, 这样使用者只需要指定他要的开发环境, 就能用它最熟悉的方式去写Shader了. 从提供者的角度来看, 因为有太多的应用场景无法确定, 所以提供无 ...

  9. 剖析linux内核中的宏-----------offsetof

    offsetof用于计算TYPE结构体中MEMBER成员的偏移位置. #ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t) &((T ...

  10. seq命令的使用

    标题:seq命令的使用 作用:seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式.宽度.分割符号进行控制 语法: [1] seq [选项] ...