服务端的程序通常将运行过程中的事件和错误记录到日志文件中。 在大多数情况下,系统都可以管理日志文件,以免消耗掉所有可用的硬盘空间。 然而,并不是所有的程序都可以出色的完成这个工作。
更可怕的是,许多应用程序框架都有自己的日志记录。 几乎无法管理其日志文件的滚动、删除或压缩。 在这种情况下,您应该设置日志滚动和日志备份。
Logrotate就是基于这种需求来设计的,并且它可用于大多数Linux系统。
Logrotate能做什么
Logrotate帮助我们管理日志文件。 它可以定期查阅,最小化,备份,创建新的日志文件,基本上你可以用它来做任何你想要做的事情。它通常用于帮助防止任何单个日志文件变得过大。 同时它也能用于删除旧的日志文件,以免日志文件填满服务器的硬盘。
许多应用程序为您设置Logrotate。 例如,在Ubuntu中安装Apache会添加文件/etc/logrotate.d/apache2
,这是Logrotate使用的一个配置文件来滚动所有apache访问日志和错误日志。
配置Logrotate
在Ubuntu系统上,您放入/etc/logrotate.d的任何配置文件将每天运行一次。 日志通常每天滚动一次或更少(Ubuntu中的Apache默认实际上是每周)。
Apache的默认配置:
/var/log/apache2/*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate /etc/init.d/apache2 reload > /dev/null endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript }
这将滚动/var/log/apache2中的任何以”.log”结尾的文件。 这就是为什么当我们创建一个新的Apache虚拟主机时,我们通常把日志放在/var/log/apache2中。Logrotate将自动管理这些日志文件。
一起浏览一下配置文件中的各个选项:
- weekly: 每周滚动一次日志。可用的选项是daily, weekly, monthly, and yearly
- missingok: 如果日志文件不存在,不会发出错误消息。另参见:
nomissingok
- rotate 52: 在删除旧的日志文件之前,请保留52个文件(默认为52周,或一年的日志)
- compress: 压缩(gzip)日志文件
- delaycompress: 延迟压缩直到第二次日志滚动。 因此,您将拥有一个当前日志,一个较旧的日志(未压缩),然后是一系列压缩日志。更多信息
- compresscmd: 设置用来压缩的命令,默认为gzip.
- uncompresscmd: 设置解压缩的命令,默认为gunzip.
- notifempty: 不要滚动空的日志文件
- create 640 root adm: 创建具有设置
权限/用户/用户组
的新日志文件,此示例使用用户root
和组adm
创建文件。 在许多系统中,它将用户和用户组是设置为root
- sharedscripts: 通常,prerotate和postrotate脚本运行每个日志滚动并将日志文件的绝对路径是作为第一个参数传递给脚本。这意味着当日志文件条目匹配多个文件时一个脚本会多次运行(如:/var/log/*.log)。如果指定了sharedscripts,无论有多少个日志与通配符相匹配,脚本只能运行一次,而且整个模式都被传递给它们;但是如果模式中没有一个日志需要滚动,那么脚本就不会被运行。如果脚本出现错误,则不会对任何日志执行其余操作。此选项将覆盖nosharedscripts选项,并且意味着创建选项
- postrotate: 完成日志滚动后运行的脚本。 在这种情况下,Apache被重新加载,以便它写入新创建的日志文件。 重新加载Apache可让任何当前连接完成,然后重新加载并设置要写入的新日志文件
- prerotate: 运行在日志滚动之前
Note: 更多的选项请查看这里.
这是生产中使用的PHP应用程序,它使用Mongolog来创建日志文件。
/var/www/my-app/application/logs/*.log { daily missingok rotate 7 compress delaycompress notifempty create 660 appuser www-data sharedscripts dateext dateformat -web01-%Y-%m-%d-%s postrotate /etc/init.d/apache2 reload > /dev/null /usr/bin/s3cmd sync /var/www/my-app/application/logs/*.gz s3://app_logs endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript }
请注意,我们从应用程序指定日志文件写入的目录。前面一部分已经提到了一些该文件中的配置项:
- daily: 每天做一次日志滚动,因为我们的程序有足够的访问量
- rotate 7: 在服务器上只保留最近七天的日志文件
- dateext: 默认情况下,日志将附加一个附加到其文件名的数字,此选项会添加日期
- dateformat: 附加到您想要的日志文件名的日期的格式。 这些日志还将web01,web02(等等)添加到日志文件名中,以便确认日志来自哪个Web服务器。 如果您正在登录负载平衡器后面的多个Web服务器,并将在以后做日志合并,建议使用该方法
扩展资料
- Logrotate man page, 列出了需要可用的配置参数.
- [Logrotate config for various commons] services(http://tuxers.com/main/log-rotation-for-a-good-nights-sleep/)
实际上没有明确规定,Logrotate必须是每天执行一次的定时任务。 通常可以在/etc/cron.daily/logrotate
中找到一个logrotate
脚本。 许多操作系统都带有可以定期运行的脚本,只需放在正确的目录中,例如/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weely
和/etc/cron.monthly
,比如你需要每个小时执行一次,可以将/etc/cron.daily/logrotate文件放置到/etc/cron.hourly目录下。
暂无评论