用Python从SSH日志中读取日期

0 投票
2 回答
928 浏览
提问于 2025-04-17 21:10

我想把每一行的日期和一个给定的日期进行比较。

# 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)。

撰写回答