社区
Linux/Unix社区
帖子详情
150分相送,请问如何截断一个log文件前面一半,谁有效率高的好办法!!!
bekars
2006-01-12 09:33:02
syslog产生的log文件,现在我要做的是在这个log文件的大小超过2M的时候将文件前面1M去掉,并且要恰好截到一条日志结束的位置,不然读取就有问题了。
在这个过程中还要允许日志继续往里面写,不然新的日志会丢失。
请问有什么好的方法,效率高的方法!
...全文
450
18
打赏
收藏
150分相送,请问如何截断一个log文件前面一半,谁有效率高的好办法!!!
syslog产生的log文件,现在我要做的是在这个log文件的大小超过2M的时候将文件前面1M去掉,并且要恰好截到一条日志结束的位置,不然读取就有问题了。 在这个过程中还要允许日志继续往里面写,不然新的日志会丢失。 请问有什么好的方法,效率高的方法!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fierygnu
2006-01-17
打赏
举报
回复
自己写还是syslog写?我怎么越看越糊涂?
bekars
2006-01-17
打赏
举报
回复
谢谢大家的回复,问题解决了,借鉴了Oracle写日志的方式,我现在用两个文件记录日志,当一个文件超过1M,就拷贝为另一个文件,然后清空继续写。
做法很简单,就是修改了写日志程序,用一个10多行的程序就搞定了,而且不会丢掉日志。
/**
* when fw.log size > 1M, cp fw.log to fw.log.old and zero fw.log
*/
static int
truncate_log(void)
{
struct stat statebuf;
char cmdbuf[100];
if (stat(fwlog_file, &statebuf) < 0) {
/* can't stat fw.log */
return -1;
}
if ((unsigned int)statebuf.st_size > max_log_size) {
sprintf(cmdbuf, "cp %s %s", fwlog_file, fwlogold_file);
system(cmdbuf);
/* zero fw.log size */
truncate(fwlog_file, 0);
}
return 0;
}
alaiyeshi
2006-01-17
打赏
举报
回复
那么我觉的x86的第二个方法是可以的
首先数据量还好,不是特别大
其次,频率高了点,要想不丢日志,就得快,或者用备份来做
bekars
2006-01-15
打赏
举报
回复
这个日志文件记录所有防火墙数据包所过的规则的信息,在测评防火墙的时候可能测试发送10000个包,看看你的日志是否有10000条记录之类的项目,所以日志信息最好不能丢。
字与码
2006-01-13
打赏
举报
回复
有一个肯定保险的办法, 不过理论上可行,实际上没什么实用性:
开一块共享内存用于写log, 在来一个进程刷新log.
按照这个思路也可以用一个文件代替共享内存.
还有一种想法, 可以将log文件复制一份进行处理, 处理完后发信号给你的程序, 程序自己去合并日志.
再一种办法, 假设程序里只有一个地方写日志(如果有多个线程或进程写,就加上进程同步), 那么日志截短处理就在写日志的时候做好了, 2M的文件也不会太慢.
cwwhy
2006-01-13
打赏
举报
回复
[在这个过程中还要允许日志继续往里面写,不然新的日志会丢失。]
不知道该怎么实现这个功能,对文件进行操作的时候还有允许别的进程写文件。
如果你对文件进行加锁,那么别的进程写文件就会失败,除非程序中判断加锁就等待。
搂主的这种功能通常都是在程序里面做的,现在要拿到外面作,我觉得有点不太现实吧。
两个不相关的进程能同时操作文件?读可以,要写就麻烦了吧!
我思路都没有,各位有什么好的意见。
fierygnu
2006-01-13
打赏
举报
回复
???
“另一个办法是用Named Pipe,让syslogd往里写,自己写个进程往外读,愿意怎么样就怎么样。”
在syslogd.conf里配置就可以让syslogd写往mkfifo创建的管道。你的应用打开管道读就行了。
bekars
2006-01-13
打赏
举报
回复
想来想去,还是用管道更安全方便。
管道怎么做,版主给个思路。
fierygnu
2006-01-13
打赏
举报
回复
想来想去,还是用管道更安全方便。
alaiyeshi
2006-01-13
打赏
举报
回复
可以将log文件复制一份进行处理, 处理完后发信号给你的程序, 程序自己去合并日志.
这个办法我觉的可以,就是不知道你的log写的频率有多高
fierygnu
2006-01-12
打赏
举报
回复
如果限定用文件,我觉得没什么好办法。插入记录的是syslogd,它是否会管文件锁?如果设置为强制锁,syslogd会怎么反应?所有这些问题都与syslogd的实现有关。
一个办法是象syslog现在的实现,改名(移动)文件。不知道楼主的要求为什么还要保留1M,不需要那么复杂吧。
另一个办法是用Named Pipe,让syslogd往里写,自己写个进程往外读,愿意怎么样就怎么样。
YanDong_8212
2006-01-12
打赏
举报
回复
截1M,可以考虑下,先在将指针偏移1M,然后利用strstr(p, '\n'),查找出临近的换行符,认为是一条日志的结束,不知道行不。
如果想在截的同时还往里面插,相当于两个进程同时操作一个文件,恐怕会导致不一致。我认为可以考虑分开来,插的时候就不截,截的时候就不插。
在截的过程中加一个写锁,然后在插入中捕捉不能写的错误码,适当延时。
插入的过程中也加一个写锁,类似。
字与码
2006-01-12
打赏
举报
回复
sed '1,10d' filename
可以简单的删除文件的前10行
如果要实现同时还要写log,你可以自己写程序,
1、需要锁定log文件,你的进程在发现log文件被锁时需要等候
2、从log文件尾向前seek 1M,往后搜索'\n',之后的内容读到内存
3、读出的内容写回log文件。为了安全,最好先写临时文件。
字与码
2006-01-12
打赏
举报
回复
再比如:
"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5
size=100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}
意思是最多生成5个log文件(/var/log/httpd/access.log.*)
当前文件最大100k, 超过100k就清空并备份成/var/log/httpd/access.log.1
备份后发HUP信号给httpd重起
字与码
2006-01-12
打赏
举报
回复
可以用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
}
bekars
2006-01-12
打赏
举报
回复
楼上的,思路是对的
但是有时候实现和思路不能百分百的相同。
SemenTsing
2006-01-12
打赏
举报
回复
提个思路不知道正确不很久不在linux下写程序了!
在知道文件的大小的情况下,通过设置偏移将文件的指针直接定位到你想要的位置(一半,1M),然后顺序查找到你文件中下一记录的开始位置,前面部分扔掉就可以了,不知道可行不?欢迎斧正!
bekars
2006-01-12
打赏
举报
回复
保留1M是要日志文件不至于一下子就没有了,因为在网络大流量的情况下,2M很快就满了,如果以下就没有用户会感觉很奇怪。
可以考虑修改syslogd的实现,还没有看代码,不太清楚具体怎么做的。
oracle sql被
截断
,Oracle
截断
表
本篇文章帮大家学习Oracle
截断
表,包含了Oracle
截断
表使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。在本教程中,您将学习如何使用Oracle TRUNCATE TABLE语句更快更有效地从表中删除所有数据(也叫
截断
表)。Oracle TRUNCATE TABLE语句简介如果要从表中删除所有数据,可以使用不带WHERE子句的DELETE语句,如下所示:DELET...
oracle
截断
数据库,Oracle
截断
表
在本教程中,您将学习如何使用Oracle TRUNCATE TABLE语句更快更有效地从表中删除所有数据(也叫
截断
表)。Oracle TRUNCATE TABLE语句简介如果要从表中删除所有数据,可以使用不带WHERE子句的DELETE语句,如下所示:DELETE FROM table_name;对于有少量行记录的表,DELETE语句做得很好。 但是,当拥有大量行记录的表时,使用DELETE语句删...
OpenAI API成本优化:Prompt压缩、上下文裁剪与流式
截断
实战
OpenAI API按token计费,而token并非仅对应用户可见回答——系统提示词、冗余会话历史、未用尽的max_tokens及重试机制共同构成大量‘无效token’消耗。理解token生成原理与计费逻辑,是实现
高
效调用的前提;通过结构化Prompt工程、语义感知的上下文动态压缩、以及基于终止信号的流式响应主动
截断
,可在不降模型、不损质量前提下显著提升token利用效率。该方法适用于所有已接入GPT-4 Turbo等官方API的SaaS、客服、合规类应用,尤其适合面临账单激增却缺乏细粒度成本监控的工程团
Agent会话持久化:从上下文
截断
到事件日志架构
Agent 会话管理是大模型应用落地的核心瓶颈,其本质是解决状态可靠性问题——当传统方案将完整对话堆入模型上下文导致
截断
失真时,'Session as Event
Log
' 架构应运而生。该模式通过解耦会话、执行器与沙箱,实现持久化、可审计、可回放的结构化事件流,显著提升 debug 能力与系统韧性。它不仅支撑多步骤工具调用与断点续跑,更成为合规审计、trace 分析与垂直 agent 开发的基础设施底座。当前主流平台如 Anthropic Managed Agents 和 AWS AgentCore 均已
压缩数据库和日志
文件
Transact-SQL USE UserDB; GO DBCC SHRINKFILE (DataFile1, 7); GO B. 将日志
文件
收缩
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章