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

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

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

7187 次点击
所在节点    PHP
50 条回复
changePro
2020-05-04 21:41:26 +08:00
典型的错误案例,怎么解决都是错。
vk42
2020-05-04 22:23:49 +08:00
@frozenway 控制 log 文件大小不是 logrotate 的事,为啥要自己瞎搞? OS 的文件设计模型就是不适合从头部和中间删内容,不然 ftruncate 为啥不直接提供接口。如果你 log 文件本身上 G,你的这个解决方案真的是嫌 server 闲得没事干……
hallDrawnel
2020-05-04 22:27:45 +08:00
典型的 XY Problem 例子,还好第一个回帖的就把方向带回来了。
tozp
2020-05-04 22:32:54 +08:00
你实现了也不可取,实时操作 IO 占用太多资源,不如全放内存,周期性再写入文件。
xuanbg
2020-05-04 23:09:17 +08:00
日志的打开方式只有两种。一种是结构化后进行各种指标统计,你可以想象为一个监控大屏。另一种是用一个或若干个关键词搜索出相关的日志,你可以想象为系统出了问题通过日志排查错误。

楼主你这种日志的打开方式说不好听点纯粹是没事干……
sparkmlib
2020-05-04 23:40:39 +08:00
logstash + ES + kinba
roychan
2020-05-05 06:22:40 +08:00
@cholerae 可以用 FALLOC_FL_COLLAPSE_RANGE,这样文件中间就没有洞了。
CoderGeek
2020-05-05 10:03:28 +08:00
可以将文件分段存储 1 天一个分为大小或后缀的多个文件 nginx 也可以设置 再用 shell 直接读取都可以的 你这个删除在写入的思路不太合适
fensou
2020-05-05 11:45:09 +08:00
@sparkmlib logstash 换 filebeat+nginx module,连 dash 都自带了
fensou
2020-05-05 11:45:52 +08:00
graylog 其实更方便

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

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

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

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

© 2021 V2EX