当前位置: 技术问答>linux和unix
## linux 下写文件的问题 ##
来源: 互联网 发布时间:2015-01-17
本文导语: 在一个软件中需写日志文件,但是要求日志文件的大小不能超过1M字节。 文件中始终保持最近的日志内容。 请问有没有什么方便而高效的实现方法? 我粗略想了一下,只想到这样的方式: 把最近1M字节内容都保存在...
在一个软件中需写日志文件,但是要求日志文件的大小不能超过1M字节。
文件中始终保持最近的日志内容。
请问有没有什么方便而高效的实现方法?
我粗略想了一下,只想到这样的方式:
把最近1M字节内容都保存在内存中,以队列的方式,
超过1M新写日志时冲掉前面的内容。
但每次都要重写整个文件,效率极其低下。
文件中始终保持最近的日志内容。
请问有没有什么方便而高效的实现方法?
我粗略想了一下,只想到这样的方式:
把最近1M字节内容都保存在内存中,以队列的方式,
超过1M新写日志时冲掉前面的内容。
但每次都要重写整个文件,效率极其低下。
|
你可以用logrotate,它是这样做的:达到一定大小后自动备份,然后将日志截为0字节。你需要在cron里面运行logrotate,根据需要可以定为一天或者一小时运行logrotate,还可以定制保存几份备份。
apache的日志就是用logrotate来限制大小的。
在/etc/logrotate.d目录下建一个文件,设置自定义的选项,比如apache就有一个httpd文件,内容是:
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}
你man一下logrotate就知道了,这里是另一个例子,保持access.log的5个备份,每个大小限制在100k,如果超过了就发邮件给www@my.org,并重起httpd(发信号给httpd,并非真正重起)
"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5
mail www@my.org
size=100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}
要注意的是logrotate并不是实时监控日志,它需要在cron运行,你可以定制运行的频率,一般一天一次就可以了。
apache的日志就是用logrotate来限制大小的。
在/etc/logrotate.d目录下建一个文件,设置自定义的选项,比如apache就有一个httpd文件,内容是:
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}
你man一下logrotate就知道了,这里是另一个例子,保持access.log的5个备份,每个大小限制在100k,如果超过了就发邮件给www@my.org,并重起httpd(发信号给httpd,并非真正重起)
"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5
mail www@my.org
size=100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}
要注意的是logrotate并不是实时监控日志,它需要在cron运行,你可以定制运行的频率,一般一天一次就可以了。