日志分析代码实现(字符串切割)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

日志分析代码实现(字符串切割)

  • 思路

        不使用正则表达式处理:
            进行字符串切割
            将[]和"括起的内容特殊处理
            将每段数据转换为对应格式
            代码精简,代码效率检查

import datetime


# 目标日志
logline = '''183.60.212.153 - - [19/Feb/2013:10:23:29 +0800] \
"GET /o2o/media.html?menu=3 HTTP/1.1" 200 16691 "-" \
"Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)"'''

clean_log = logline.split() 
# list
#['183.60.212.153', '-', '-', '[19/Feb/2013:10:23:29', '+0800]',\
# '"GET', '/o2o/media.html?menu=3', 'HTTP/1.1"', '200', '16691', \
# '"-"', '"Mozilla/5.0', '(compatible;', 'EasouSpider;', '+http://www.easou.com/search/spider.html)"']


# 转换时间格式
def convert_time(time:str):
    return datetime.datetime.strptime(time, '%d/%b/%Y:%H:%M:%S %z')

# 将request字符串切分为三段
def convert_request(request:str):
    return dict(zip(('method','url','protocol'),request.split()))

# 给予对应字段名
names = [
    'remote','','','time',
    'request','status','size','',
    'useragent'
]

# 处理对应字段名的函数
operations = [
    None,None,None,convert_time,
    convert_request,int,int,None,
    None
]

# 切割字符串为合适格式
def log_clean(line:str,ret=None):
    if ret:
        ret = []
    tmp = ''
    flag = False
    for word in line.split():
        if word.startswith('[') or word.startswith('"'):
            tmp = word.strip('["')
            if word.endswith('"') or word.endswith(']'):
                ret.append(tmp)
                flag = False
                continue
            flag = True
            continue

        if flag:
            tmp += ' ' + word
            if word.endswith('"') or word.endswith(']'):
                ret.append(tmp.strip('"]'))
                flag = False
            continue
        else:
            ret.append(word)


# 遍历处理后日志,根据对应字段,进行对应处理后再保存至新字典中
ret_d = {}
log_clean(logline)
for i, field in enumerate(ret):
    key = names[i]
    if operations[i]:
        ret_d[key] = operations[i](field)
    else:
        ret_d[key] = field
print(ret_d)                                 本文转自 撒旦搞时间 51CTO博客,原文链接:http://blog.51cto.com/12074120/1980427,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
265
分享
相关文章
|
10月前
|
使用Java代码打印log日志
使用Java代码打印log日志
358 1
Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码
Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码
995 0
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
351 65
一行代码改进:Logtail的多行日志采集性能提升7倍的奥秘
一个有趣的现象引起了作者的注意:当启用行首正则表达式处理多行日志时,采集性能出现下降。究竟是什么因素导致了这种现象?本文将探索Logtail多行日志采集性能提升的秘密。
291 58
实现Python日志点击跳转到代码位置的方法
本文介绍了如何在Python日志中实现点击跳转到代码位置的功能,以提升调试效率。通过结合`logging`模块的`findCaller()`方法记录代码位置信息,并使用支持点击跳转的日志查看工具(如VS Code、PyCharm),开发者可以从日志直接点击链接定位到出错代码,加快问题排查。
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
348 0
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
|
7月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等