2015-09-04 57 views
0

我找得到通过后缀创建的maillog的日志文件的过去一小时的有效途径的最后一个小时。我想在python或bash中做到这一点。的Python - 后缀日志

到目前为止,我已经提取了一个月,并且保存在后缀数天:

now_m = today.ctime().split()[1] 
now_d = int(today.ctime().split()[2]) 

,但我坚持在这里了,需要一些新鲜的想法。

任何帮助将不胜感激。

代码例如:

Apr 2 11:53:15 server01 postfix/bounce[9177]: 62A347FB99: sender non-delivery notification: 6F4B67FB97 
Apr 2 11:53:15 server01 postfix/qmgr[8140]: 5E9B07FB95: removed 
Apr 2 11:53:15 server01 postfix/qmgr[8140]: 62A347FB99: removed 
Apr 2 11:53:15 server01 postfix/qmgr[8140]: 6F5837FB98: from=<>, size=4054, nrcpt=1 (queue active) 
Apr 2 11:53:15 server01 postfix/bounce[9182]: 652D67FB9D: sender non-delivery notification: 6F5837FB98 
Apr 2 11:53:15 server01 postfix/qmgr[8140]: 652D67FB9D: removed 
Apr 2 11:53:15 server01 postfix/qmgr[8140]: 6EE717FB92: from=<>, size=4926, nrcpt=1 (queue active) 
Apr 2 11:53:15 server01 postfix/qmgr[8140]: 6F4B67FB97: from=<>, size=3448, nrcpt=1 (queue active) 
Apr 2 11:53:15 server01 postfix/smtpd[9163]: disconnect from unknown[10.0.0.4] 

和另一个例子:

Aug 30 09:00:56 server01 postfix/qmgr[2321]: 1654A7FB86: removed 
Aug 30 09:01:57 server01 postfix/smtpd[4320]: connect from unknown[10.0.0.0] 
Aug 30 09:01:57 server01 postfix/smtpd[4320]: disconnect from unknown[10.0.0.0] 
Aug 30 09:02:16 server01 postfix/smtpd[4320]: connect from unknown[10.0.0.0] 
Aug 30 09:02:16 server01 postfix/smtpd[4320]: 21F077FB86: client=unknown[10.0.0.0] 
+0

如果您不需要确切的最后一小时,你可以只用一天+小时'grep' - 像'grep的“10年9月4日:” mail.log'。如果你需要确切的小时,你可以编写一个python脚本来生成一个涵盖过去一小时的正则表达式(它可能包含不同日期或月份的值) –

+1

如果你包含一个日志样本,你可能会得到更多的帮助文件。另外,除非您将此作为练习,否则您是否在寻找现有工具?像[Postfix Contribs](http://jimsun.linxnet.com/postfix_contrib.html)(你必须喜欢一个有Lynx用户注释的页面)。 –

+0

了'.ctime()'在你的代码示例来电建议,你应该用最简单的*工作*解决方案启动('的ctime()'是不是从Python中的日期以获得一个月的样子,日) - 如果你不知道如何; [问](http://stackoverflow.com/questions/ask)。一旦你有一些工作,衡量它有多快,并设定一个目标有多快,你会喜欢它 - [更新你的问题与此信息](http://stackoverflow.com/posts/32401222/edit)。 – jfs

回答

1

很简单:

NOW=`date +%s`; THEN=`expr $NOW - 3600`; until (("$THEN" > "$NOW")); do DATE=`date -d @\$THEN +'%b %e %k:%M:%S'`; grep -e "^$DATE" /var/log/maillog && sed -n -e "/^$DATE/,\$p" /var/log/maillog && break; THEN=`expr $THEN + 1`; done 

换句话说:

1)获取当前时间$现在

2)得到的时间一小时前$ THEN

3)如果有一行以$ THEN开始,打印该行及其后的所有内容(并打破循环)

4)增加$ THEN一秒,重复直到$ NOW(或直到你找到东西)

这不是非常有效,不是很快,但可能会为你服务。

+0

这是一个老大哥 – Peter

0

基本轨道是读取每一行,并解析它的时间标记到datetime.datetime对象。有几种选择,例如使用其.fromtimestamp(静态)方法。或者更一般的解析器(见效用值)

然后使用datetime.datetime.now()并减去datetime.timedelta(mins=60);结果可以与解析的时间戳进行比较。

它的那样简单! 不需要做任何手动工作。

PS添加日志文件/行下一次的例子。在我们可以给具体的示例代码

+0

这里是一个例子 - 编辑主要问题 – Peter