如何简单实现读取一个 txt 日志文件的前十行并删掉这十行,同时不能影响这个日志文件的实时写入,这个日志文件大概 1~ 2G 左右?
用 fread 先读出来,去掉再 fwrire 覆盖原来的,会不会造成期间写入文件的日志信息?
用 fread 先读出来,去掉再 fwrire 覆盖原来的,会不会造成期间写入文件的日志信息?
比如一次读 100KB,如果最后一行不完整就留着,下次读取块之后加在前面就行。
但是解决方案有很多。比如:
1 、固定文件大小,把整个文件当做一个 circular buffer 用(记满了从尾巴跳到开头再开始写,直接覆盖老的内容)。然后用一个额外的小文件记录你有效的起始指针和尾指针的文职。
2 、不要用行这么大的粒度,粗略一点。比如每 500KB 换一个文件写。文件太多了就把老的文件删掉一个。
3 、上数据库。
4 、模仿数据库,自己用 B+ 树管理每一行的精确位置,自己管理文件被废弃的部分的回收再利用,自己管理文件存储碎片。也就是自己创造一种“数据库”。
logtime=$(date “+%Y-%m-%d-%H-%M-%S”)
mv 日志路径 备份目录 /$logtime.log
touch 日志路径
nginx -s reopen
可能还有这个:
mkfifo log_seeker
cat access.log > log_seeker &
exec 3< log_seeker
head -10 log_seeker #读取前 10 个
head -10 log_seeker #读取下 10 个
head -10 log_seeker #读取下 10 个
…依此类推
完了使用
fg # 调出上面的 cat 进程 Ctrl+C 掉
exec 3<&- # 关掉用来保持 cat 进程的 reader 进程,参考: https://unix.stackexchange.com/questions/366219/prevent-automatic-eofs-to-a-named-pipe-and-send-an-eof-when-i-want-it
好好的 logrotate 不用,偏要走邪道……
主你这种日志的打开方式说不好听点纯粹是没事干……