查一查哪些客户端链接过Oracle数据库
点击上方蓝色字体,关注我们
由于审计要求、安全排查、或者是性能分析等,我们会想了解哪些异常的客户端连接了Oracle数据库,这是会使用listener.log 来分析,但是由于日志量太大,无法进行有效的分析,那么我们可以借鉴这篇文章来处理。比如我希望按照日期、主机、程序和所连接数据库进行总结。在这篇博客中,我们将使用 Python 读取一个日志文件,并创建一个汇总报告,展示每个日期、主机和程序的日志数量。
完整的代码为:
import refrom collections import defaultdictfilename = 'listener.log'result = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(int))))# Regular expression pattern for matching date, host, and program informationpattern = r'(\d{2}-[A-Z]{3}-\d{4}\s\d{2}:\d{2}:\d{2}).*PROGRAM=([^)]+).*HOST=([^)]+).*establish \* ([^\*]+)'# Read the listener.log file and match each line against the patternwith open(filename) as f:for line in f:match = re.search(pattern, line)if match:# Extract date, host, and program informationdate = match.group(1)[:11]host = match.group(3)program = match.group(2)service = match.group(4)# Increment the count for this date, host, program, and serviceresult[date][host][program][service] += 1# Output the summaryfor date in result:for host in result[date]:for program in result[date][host]:for service in result[date][host][program]:count = result[date][host][program][service]print("Date: %s, Host: %s, Program: %s, Service: %s, Count: %d" % (date, host, program, service, count))
将上面的脚本编写成文件如a.py, 放入到你的listener.log 目录下,python a.py运行,即可输出数据,我这里的版本是python2.6。
输出结果示例如下:
如果有数据了就可以按照一定规则进行分析出图了,我借用了excel来四实现的出图分析。 可见通过sqlplus64 登录服务器的最多。
哪个IP曾经登录过服务器的一目了然。而且可以排查是否有人在悄悄链接你的数据库。
我下一步打算把这个逻辑放到ES中,来实现一个准实时的分析。
代码拆解:
首先,我们需要导入 Python 的 re 和 defaultdict 模块。re 模块是用来匹配正则表达式,而 defaultdict 模块则用于创建一个可嵌套的字典结构,方便我们按照多个维度进行统计。
import refrom collections import defaultdict
接下来,我们需要定义一个正则表达式模式,用于匹配日期、主机和程序信息。这个模式使用了捕获组,可以方便我们后续提取需要的信息。
pythonCopy codepattern = r'(\d{2}-[A-Z]{3}-\d{4}\s\d{2}:\d{2}:\d{2}).*PROGRAM=([^)]+).*HOST=([^)]+).*establish \* ([^\*]+)'
现在,我们可以读取日志文件并按行匹配正则表达式,提取出需要的信息,然后在字典结构中进行累加。
with open(filename) as f:for line in f:match = re.search(pattern, line)if match:# Extract date, host, and program informationdate = match.group(1)[:11]host = match.group(3)program = match.group(2)service = match.group(4)# Increment the count for this date, host, program, and serviceresult[date][host][program][service] += 1
最后,我们可以按照日志顺序输出每个日期、主机、程序和所连接数据库的日志情况。
for date in result:for host in result[date]:for program in result[date][host]:for service in result[date][host][program]:count = result[date][host][program][service]print("Date: %s, Host: %s, Program: %s, Service: %s, Count: %d" % (date, host, program, service, count))
这样,我们就可以快速了解日志文件中不同日期、主机、程序和所连接数据库的日志数量了。希望这篇博客能够帮助您处理日志文件并进行汇总统计。
添加好友,邀你入群,运维人的圈子,每日精彩分享,更有大咖解惑!
对的那条路,往往不是最好走的!
精彩文章合集
文章推荐
札记:“今天的努力可能会让你汗流浃背,但明天的喝彩声一定响彻云霄。”
--《哈弗凌晨四点半》