如何利用logrotate工具自动切分滚动中的日志文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

如何利用logrotate工具自动切分滚动中的日志文件

 

在很多实际项目中,应用程序会持续写日志,如果程序代码中没有调用支持自动切分(如按filesize或date切割)的日志库,则日志文件会很快增长到G级别。单机操作大文件对后续跟进日志来说非常不方便。

 

本文介绍如何利用logrotate这个工具来在应用程序外部切分日志。

 

1. logrotate是什么    
logrotate是大多数linux系统自带的日志切割工具,在shell终端输入"man logrotate"可查看其简介(部分摘出如下):    

logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing oflog files. Each log file may be handled daily, weekly, monthly, or when it grows too large.


更完整的简介可以在shell终端查看其man文档,这里不赘述。


总之,我们知道它可以用来切割仍在滚动的日志文件即可,这里的“仍在滚动”是指当前日志文件仍在被应用程序持续进行追加写操作。

 

2. logrotate的适用场景    
如果文件是静态的(即当前没有应用程序对齐进行写操作),则split是更常用的静态文件切割工具,其用法简介见这里,此处略过。


logrotate常用来切割仍在被写的“动态”文件,它支持按时间间隔或文件大小来触发文件的自动切分(automatic rotation)。具体用法下面说明。

 

3. 如何使用logrotate     
根据man logrotate的说明,logrotate用法很简单:

logrotate [-dv] [-f|--force] [-s|--state file] config_file+

 

其中[]中出现的option(s)均是可选项,我们只需提供一份配置文件即可,下面用示例对配置文件格式做说明。

# sample logrotate configuration file

compress # 全局配置项,对切分后的文件做gzip压缩

# 一个配置文件中可以包含多个相互独立的sections

# 其中,待切分文件路径 + { xxx }构成了一个独立的section,每个section可以配置针对该类文件的切分行为

# 注意:全局配置项会作用于每个section,除非在该section配置中覆盖了全局配置项的行为

# 下面section的配置表明按时间间隔(weekly)触发日志的自动切分,历史数据只保存最近的5份

# 切分完成后,通过发送-HUP信号来重启syslogd这个daemon进程。

/var/log/messages {

rotate 5

weekly

postrotate

/sbin/killall -HUP syslogd

endscript

}

# 下面的示例section表明按文件大小触发日志自动切分,大小单位除了上面所示的k外,还可以是M或G

# 待切分文件路径可以有多个,多个路径用空格隔开

"/var/log/httpd/access.log" /var/log/httpd/error.log {

rotate 5

mail www@my.org

size=100k

sharedscripts # 表明HUP信号只需在所有文件均切分完成后发送一次,若无该配置,则每完成一个文件的切分就会执行一次postrotate/endscript之间配置的命令

postrotate

/sbin/killall -HUP httpd

endscript

}

# 下面的示例section表明按时间(monthly)触发切分

# 切分后的历史文件会被保存到olddir指定的目录下(该目录需要事先mkdir出来,否则会报错)

/var/log/news/news.crit {

monthly

rotate 2

olddir /var/log/news/old

missingok # 若section起始处指定的待切分文件不存在,也不会报错(默认会报错)

postrotate

kill -HUP 'cat /var/run/inn.pid'

endscript

nocompress # 切分时不做压缩,这里改写了配置文件第1行的全局配置

}

 

上述配置文件中,"#"表示后面是注释,它可以独占一行,也可以与配置项在同一行。


配置项"rotate 5"表明切分后的历史文件最多保存最近的5份,若触发本次切分时已有5份历史文件(默认为messages.1/messages.2/messages.3/messages.4/messages.5),则文件messages.5会被物理删除,剩余文件后缀序号依次加1。    
切分的具体执行过程可以参考《鸟哥的Linux私房菜》在这里的说明。


上面的示例配置文件只是展示了logrotate配置文件的基本格式,该工具还支持其它众多配置项,具体可以参考man logrotate的说明。


下面的配置文件说明了在实际项目中如何按文件大小对不允许restart的应用程序进行日志自动切分。

# filename: logrotate.conf

/home/work/running.log {

copytruncate # 先copy running.log内容至历史文件,然后清空running.log的内容

rotate 30 # 保存30份历史日志

size=1G # 若日志文件达到1G,则触发切分

olddir /home/work/history # 指定历史日志存放目录

notifempty # 若/home/work/running.log是空文件,则不做切分

missingok # 若/home/work/running.log不存在,不报错

}

 

特别注意copytruncate这个配置项,根据其文档说明(见下面的摘录),它可能会导致部分数据丢失,在不允许日志数据丢失的应用场景下,不应该使用该配置(若日志不允许丢失,则最好在应用程序代码中支持HUP信号来实现优雅重启,这样就可以避免使用copytruncate;当然,也可以用logrotate支持的create配置来达到目的)。


copytruncate     
Truncate the original log file in place after creating a copy, instead of moving the old log file and optionally creating a new one, It can be used when some program can not be told to close its logfile and thus might continue writing (appending) to the previous log file forever. Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost. When this option is used, the createoption will have no effect, as the old log file stays in place.

 

【参考资料】    
1. man logrotate    
2. 鳥哥的Linux私房菜 - 登錄檔的輪替(logrotate)












本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1620669,如需转载请自行联系原作者




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
143
分享
相关文章
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
159 28
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
108 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
241 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
【赵渝强老师】PostgreSQL的运行日志文件
PostgreSQL的物理存储结构包括数据文件、日志文件等。运行日志默认未开启,需配置`postgresql.conf`文件中的相关参数如`log_destination`、`log_directory`等,以记录数据库状态、错误信息等。示例配置中启用了CSV格式日志,便于管理和分析。通过创建表操作,可查看生成的日志文件,了解具体日志内容。
129 3
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
111 8
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
105 4
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
132 2
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
32 5
图解MySQL【日志】——Redo Log
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1315 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。