如何简单实现读取一个 txt 日志文件的前十行并删掉这十行,同时不能影响这个日志文件的实时写入,这个日志文件大概 1~ 2G 左右?

2020-05-04 14:35:24 +08:00
 frozenway

用 fread 先读出来,去掉再 fwrire 覆盖原来的,会不会造成期间写入文件的日志信息?

7165 次点击
所在节点    PHP
50 条回复
miao1007
2020-05-04 15:58:27 +08:00
logstash
GrayXu
2020-05-04 16:41:38 +08:00
@frozenway “不想文件越来越大”这个需求显然是独立的。再额外做日志切割就好了……
love
2020-05-04 16:59:35 +08:00
你就不能下次从第 20 行开始读起?每读 10 行就复制一整个上 G 的文件,这个效率是嫌服务器负载太低了吗
winglight2016
2020-05-04 17:21:40 +08:00
虽然我没用过 php,但是日志分析这么基础的需求,不用再自己造轮子了吧?
julyclyde
2020-05-04 17:25:47 +08:00
这是一个很典型的
自行分析了需求然后给出错误解方案
然后上网问怎么实现这个错误方案
的案例
myqoo
2020-05-04 17:25:48 +08:00
正好写过完全相同的案例~ 每隔一段时间执行就可以:

logtime=$(date "+%Y-%m-%d-%H-%M-%S")

mv 日志路径 备份目录 /$logtime.log

touch 日志路径

nginx -s reopen
hstdt
2020-05-04 17:25:50 +08:00
要是我来做,我可能会使用 sqlite😉
ETiV
2020-05-04 17:27:27 +08:00
mkfifo ?
asilin
2020-05-04 17:43:53 +08:00
很简单,用 sed -i -c 参数就可以完成,具体参见下面的链接:
https://stackoverflow.com/questions/36930913/extra-null-characters-when-sed-edit-the-file-in-place-which-under-wirting
banxiaobu
2020-05-04 18:08:08 +08:00
我更感兴趣的是这个是什么样的背景需要这么玩
burringcat
2020-05-04 18:20:15 +08:00
直接用 shell 就行,不要再用 php 把 shell 包起来!!!
tlday
2020-05-04 18:39:28 +08:00
我没有搞懂为什么要删掉,假如不需要删掉
你可以试试这个:
head -10 access.log #读取前 10 行
head -20 access.log | tail -10 #读取 10-20 行
head -30 access.log | tail -10 #读取 20-30 行
......依此类推

可能还有这个:
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
muzuiget
2020-05-04 18:42:49 +08:00
#25 果然是 X/Y 问题。
tlday
2020-05-04 18:42:58 +08:00
我上面的例子,如果你不手动杀掉 cat 进程,或者关掉用来保持 cat 进程的 reader 进程,就可以“无论间隔多久,下一次程序运行也是读取接下来的十行”
tlday
2020-05-04 19:06:20 +08:00
不想文件越来越大是典型的 log rotation 的应用场景,你这是两个需求。
msg7086
2020-05-04 19:20:37 +08:00
你 sed 途中遇上 nginx 写入的话你就等着丢数据吧。
(丢的概率有多大呢?这么说吧,流量高的站百分百丢数据。)

好好的 logrotate 不用,偏要走邪道……
mostkia
2020-05-04 20:09:54 +08:00
php 相关的程序日志,可以存到 SQLite 里面啊,一般 Nginx+PHP 的环境都带的。操作真的方便一个数量级,虽然都带文件锁,但你写 TXT 绝对好不到哪里去。以后导入导出也方便。如果你是要存 nginx 的日志的话,直接每天分割日志不就行了,然后可以视文件大小或者日期进行旧文件管理。
ClarkAbe
2020-05-04 20:17:24 +08:00
删这 10 行用乐观锁,其他的保持原样读写
lepig
2020-05-04 20:46:20 +08:00
这好像 PHP 面试的时候 经常会问 怎么使用 PHP 处理大日志文件 擦
dreamage
2020-05-04 21:17:59 +08:00
es 不香么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX