用Python从SSH日志中读取日期
我想把每一行的日期和一个给定的日期进行比较。
# Example dump
cat /var/log/auth.log
Mar 5 00:53:43 server012 sshd[15145]: Failed password for XX from X.X.X.X port 59113 ssh2
Mar 5 12:19:20 server012 sshd[17378]: Invalid user XX from X.X.X.X
Mar 5 12:19:20 server012 sshd[17378]: input_userauth_request: invalid user XX [preauth]
Mar 5 12:19:25 server012 sshd[17378]: Failed none for invalid user XX from X.X.X.X port 38485 ssh2
Python示例:
givenvalue = datetime.strptime("2014-01-04 14:57:33", '%Y-%m-%d %H:%M:%S')
dateFromLog = ....
if givenvalue > dateFromLog
do something
我可以顺利打开日志文件,并一行一行地读取内容。 我遇到的问题是如何用正则表达式来提取日期(例如:Mar 5 12:19:25)。谁能帮我一下?
下一个问题是日志文件里缺少年份,所以我无法“正确”比较这些日期。我之前想到的解决办法有:
- 从日志文件中读取“最后编辑”的日期,以获取(正确的)年份。(这样真的可靠么?)
- 更改日志文件的格式,添加年份。
我不知道如何实现这两个想法。有没有人有好的主意?
2 个回答
0
你可以这样使用 strptime
:
datetime.strptime(beginningOfLine, '%b %d %H:%M:%S')
这样做会生成1900年的 datetime
对象,因为没有给出年份。你可能需要自己调整这些年份。
举个例子:
>>> from datetime import datetime
>>> datetime.strptime('Mar 5 12:19:20', '%b %d %H:%M:%S')
datetime.datetime(1900, 3, 5, 12, 19, 20)
关于你提的另一个问题:“最后编辑”日期不一定和你日志中的所有条目在同一年。
0
我没有找到关于如何更改日志日期格式的信息,所以我可能有一个新的解决办法:
我写了一个小程序,它可以实时扫描原始的 log.auth 文件(就像代码示例:第5部分)。
当有新的一行出现时:把包含年份的那一行复制到一个新的日志文件里(比如叫 own_auth_with_year.log)。我不太喜欢这个办法:又多了一个服务要管理,这个解决方案真的不太方便。
如果能简单地更改时间格式就好了……
更新: 其实是可以的。打开 rsyslog.conf 文件(路径是 /etc/rsyslog.conf),然后添加你自己的模板,像这样:
# My own a template
$template MySuperAwesomeTimestamps,"%timegenerated:1:10:date-rfc3339% %timegenerated:12:19:date-rfc3339% %HOSTNAME% %syslogtag%%msg%\n"
接下来,把那一行(auth,authpriv. /var/log/auth.log*)改成:
auth,authpriv.* /var/log/auth.log;MySuperAwesomeTimestamps
之后保存你的配置,重启系统(或者重载服务),然后检查一下你新的时间格式(tail -f /var/log/auth.log)。