Python - 从系统日志文件中检索信息
Posted
技术标签:
【中文标题】Python - 从系统日志文件中检索信息【英文标题】:Python - retrieving info from a syslog file 【发布时间】:2010-03-20 14:40:38 【问题描述】:我被要求使用 python 编写一个程序来完成作业。
我得到了一个系统日志文件,我必须找出它的相关信息
我如何知道尝试登录 root 帐户的次数?
任何建议都将受到高度赞赏,因为我对 python 非常陌生并且完全迷失了!
【问题讨论】:
不仅问题重复,而且帐号重复?这个[小猪][1]写了一个问题,这个[小猪][2]写了同样的问题,这两个小猪都叫约翰尼... [1]:***.com/users/298077/johnny[2]:***.com/users/298037/johnny 【参考方案1】:你想要/var/log/auth.log
,而不是系统日志。
它将包含像这样的行:
Mar 20 10:47:24 Opus su[15918]: pam_unix(su:auth): authentication failure; logname=lfaraone uid=1000 euid=0 tty=/dev/pts/25 ruser=lfaraone rhost= user=root
完成该问题的基本、幼稚的代码如下:
loginattempts = "root": 0,
"someuser": 0, # Usernames you want to check
with open('/var/log/auth.log', 'r') as authlog:
for line in authlog:
if "authentication failure" in line:
username = line.split('=')[-1] # split the string into an array,
# using '=' as the delimiter
if username in loginattempts: # is the username one we care about?
loginattempts[username] += 1
就像用户 crashh 建议的那样,长期使用正则表达式进行解析可能会更好,但如果您还不了解它们,那么学习起来可能并非易事。
【讨论】:
关于/var/log/auth.log
位,这高度依赖于系统;例如,在 Solaris 上没有这样的文件。语法也可能因操作系统而异。【参考方案2】:
类似的东西
#open the file , can be /var/log/messages, /var/log/maillog etc as defined in your system
f=open("mysyslogfile")
count=0
#go through the file
for line in f:
if "<unique pattern for checking root account login>" in line:
count+=1
#close the file
f.close()
print "total count: " ,count
【讨论】:
不要指望close
被手动调用。 始终尽可能使用上下文管理器 (with open("mysyslogfile") as f:
)。
是的,尽可能这样做。但是我的解决方案在没有“with”支持的情况下适用于旧版本的 Python。 :)
@ghostdog,不,您的解决方案容易出错。在 2.5 之前的 Python 中,您应该始终在 finally 块中调用 close。
如果你想这样做,那很好,但是没有,没有必要。【参考方案3】:
您可能需要读取文件,解析每一行。当您找到与您感兴趣的内容匹配的行(例如,失败的 root 登录)时,您会增加一个计数器。
看看how to read files,可能还有how to use regular expressions。
如果您要针对“实时”日志文件执行此检查,例如每五分钟一次,您需要跟踪您已经处理了多少文件,这样您就不会每次都读取它。这稍微复杂一些,因为您需要记住执行之间的状态(文件大小)。在这种情况下,请查看shelve
模块。
【讨论】:
以上是关于Python - 从系统日志文件中检索信息的主要内容,如果未能解决你的问题,请参考以下文章