当前位置: 技术问答>linux和unix
150分相送,请问如何截断一个log文件前面一半,谁有效率高的好办法!!!
来源: 互联网 发布时间:2015-11-06
本文导语: syslog产生的log文件,现在我要做的是在这个log文件的大小超过2M的时候将文件前面1M去掉,并且要恰好截到一条日志结束的位置,不然读取就有问题了。 在这个过程中还要允许日志继续往里面写,不然新的日志会丢失...
syslog产生的log文件,现在我要做的是在这个log文件的大小超过2M的时候将文件前面1M去掉,并且要恰好截到一条日志结束的位置,不然读取就有问题了。
在这个过程中还要允许日志继续往里面写,不然新的日志会丢失。
请问有什么好的方法,效率高的方法!
在这个过程中还要允许日志继续往里面写,不然新的日志会丢失。
请问有什么好的方法,效率高的方法!
|
可以用logrotate或者类似的工具.
logrotate是一个log维护工具, 当你的log太大的时候, 可以自动压缩备份并清空当前log文件.
也许这个功能就能满足你的需求, 但是如果它的功能不只于此, 实际上它是一个cron, 也就是定期执行的程序, 你可以修改它的配置文件来调用你自己的文件.
配置文件在/etc/logrotate.conf和/etc/logrotate.d/*
比如说对/var/log/messages的配置是
/var/log/messages {
rotate 5
weekly
postrotate
/sbin/killall -HUP syslogd
endscript
}
logrotate是一个log维护工具, 当你的log太大的时候, 可以自动压缩备份并清空当前log文件.
也许这个功能就能满足你的需求, 但是如果它的功能不只于此, 实际上它是一个cron, 也就是定期执行的程序, 你可以修改它的配置文件来调用你自己的文件.
配置文件在/etc/logrotate.conf和/etc/logrotate.d/*
比如说对/var/log/messages的配置是
/var/log/messages {
rotate 5
weekly
postrotate
/sbin/killall -HUP syslogd
endscript
}
|
可以将log文件复制一份进行处理, 处理完后发信号给你的程序, 程序自己去合并日志.
这个办法我觉的可以,就是不知道你的log写的频率有多高
这个办法我觉的可以,就是不知道你的log写的频率有多高
|
截1M,可以考虑下,先在将指针偏移1M,然后利用strstr(p, 'n'),查找出临近的换行符,认为是一条日志的结束,不知道行不。
如果想在截的同时还往里面插,相当于两个进程同时操作一个文件,恐怕会导致不一致。我认为可以考虑分开来,插的时候就不截,截的时候就不插。
在截的过程中加一个写锁,然后在插入中捕捉不能写的错误码,适当延时。
插入的过程中也加一个写锁,类似。
如果想在截的同时还往里面插,相当于两个进程同时操作一个文件,恐怕会导致不一致。我认为可以考虑分开来,插的时候就不截,截的时候就不插。
在截的过程中加一个写锁,然后在插入中捕捉不能写的错误码,适当延时。
插入的过程中也加一个写锁,类似。
|
如果限定用文件,我觉得没什么好办法。插入记录的是syslogd,它是否会管文件锁?如果设置为强制锁,syslogd会怎么反应?所有这些问题都与syslogd的实现有关。
一个办法是象syslog现在的实现,改名(移动)文件。不知道楼主的要求为什么还要保留1M,不需要那么复杂吧。
另一个办法是用Named Pipe,让syslogd往里写,自己写个进程往外读,愿意怎么样就怎么样。
一个办法是象syslog现在的实现,改名(移动)文件。不知道楼主的要求为什么还要保留1M,不需要那么复杂吧。
另一个办法是用Named Pipe,让syslogd往里写,自己写个进程往外读,愿意怎么样就怎么样。