社区
Linux/Unix社区
帖子详情
150分相送,请问如何截断一个log文件前面一半,谁有效率高的好办法!!!
bekars
2006-01-12 09:33:02
syslog产生的log文件,现在我要做的是在这个log文件的大小超过2M的时候将文件前面1M去掉,并且要恰好截到一条日志结束的位置,不然读取就有问题了。
在这个过程中还要允许日志继续往里面写,不然新的日志会丢失。
请问有什么好的方法,效率高的方法!
...全文
445
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条记录之类的项目,所以日志信息最好不能丢。
x86
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'),查找出临近的换行符,认为是一条日志的结束,不知道行不。
如果想在截的同时还往里面插,相当于两个进程同时操作一个文件,恐怕会导致不一致。我认为可以考虑分开来,插的时候就不截,截的时候就不插。
在截的过程中加一个写锁,然后在插入中捕捉不能写的错误码,适当延时。
插入的过程中也加一个写锁,类似。
x86
2006-01-12
打赏
举报
回复
sed '1,10d' filename
可以简单的删除文件的前10行
如果要实现同时还要写log,你可以自己写程序,
1、需要锁定log文件,你的进程在发现log文件被锁时需要等候
2、从log文件尾向前seek 1M,往后搜索'\n',之后的内容读到内存
3、读出的内容写回log文件。为了安全,最好先写临时文件。
x86
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重起
x86
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 TRUNCATE TABLE语句快速有效地从表中删除所有数据。文章包括使用方法、操作技巧、实例演示及注意事项等内容。
oracle
截断
数据库,Oracle
截断
表
本文介绍如何使用 Oracle TRUNCATE TABLE 语句
高
效删除表中的所有数据。包括基本用法、级联删除及存储选项等关键特性,并提供实例演示。
压缩数据库和日志
文件
本文介绍如何使用Transact-SQL命令管理数据库
文件
,包括数据
文件
和日志
文件
的收缩、
截断
及清空操作。
OpenAI API成本优化:Prompt压缩、上下文裁剪与流式
截断
实战
本文聚焦OpenAI API的token级成本优化,提出Prompt压缩、动态上下文裁剪与流式响应
截断
三大可落地技术方案。通过结构化系统提示词(降幅71%)、语义感知历史折叠(token降73%)及基于终止信号的实时流
截断
(输出节省11.4%),在不降模型、不损质量前提下实现月成本下降86.7%。所有方法均基于OpenAI官方API,规避缓存合规风险,强调token透明性与可控性。
log
1p为什么是工业级数据预处理的默认选择
本文深入剖析
log
1p在工业级数据预处理中的不可替代性,重点阐述其解决零值、负值与浮点精度问题的工程优势。对比
log
(x+ε)、Box-Cox和Yeo-Johnson,突出
log
1p在稳定性、可解释性与生产鲁棒性上的本质差异。结合电商销量预测实战,说明
log
1p需配合零值指示器应对零膨胀场景,并总结安全落地的七条军规及五大独家技巧,强调其适用边界与业务语义基础。
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章