木讷大叔爱运维

查一查哪些客户端链接过Oracle数据库

Image

点击上方蓝色字体,关注我们

预计阅读时间3分钟Image

Image

    由于审计要求、安全排查、或者是性能分析等,我们会想了解哪些异常的客户端连接了Oracle数据库,这是会使用listener.log 来分析,但是由于日志量太大,无法进行有效的分析,那么我们可以借鉴这篇文章来处理。比如我希望按照日期、主机、程序和所连接数据库进行总结。在这篇博客中,我们将使用 Python 读取一个日志文件,并创建一个汇总报告,展示每个日期、主机和程序的日志数量。

完整的代码为:

import refrom collections import defaultdict
filename = '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 information date = 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 service result[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。

输出结果示例如下:Image

    如果有数据了就可以按照一定规则进行分析出图了,我借用了excel来四实现的出图分析。Image    可见通过sqlplus64 登录服务器的最多。

Image    哪个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 information            date = 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 service result[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))

    这样,我们就可以快速了解日志文件中不同日期、主机、程序和所连接数据库的日志数量了。希望这篇博客能够帮助您处理日志文件并进行汇总统计。

Image

添加好友,邀你入群,运维人的圈子,每日精彩分享,更有大咖解惑!

对的那条路,往往不是最好走的!

精彩文章合集

文章推荐

☞【合集】运维思索系列
☞【合集】运维管理系列
☞【合集】运维监控之路
☞【合集】蓝鲸之路
☞【合集】CI/CD之路
☞【合集】Ansible之路
☞【合集】K8S之路
☞【合集】数据库系列

札记:“今天的努力可能会让你汗流浃背,但明天的喝彩声一定响彻云霄。”

--《哈弗凌晨四点半》