【运维心得】如何进行应用日志分析?
目录
为什么要进行分析?
什么是时序数据库?
分析结果这么用可以吗?
部分代码(python)
为什么要进行分析?
时间如梭,转眼炎热的8月份就过去了,全国4亿人都体会到了汗蒸和煎炸,这几天的凉爽,才使得我能够静下心来写一点儿东西。
如标题所示,不知道别人是怎么使用应用日志进行分析的。我们目前对于日志的分析,也主要是用来查错的,如果没有应用报错,基本上也不会去查这些应用日志。但上次看到一篇介绍时序数据库的文章,个人认为,其实应用日志也属于时序数据库的一种。
那么对于应用日志的分析,就有实际的意义了。
比如:在一个地点连续几天平均气温。在过去的几十年里,平均气温一直被用于建筑节能的主要参考因素。在任意一周里,同一地点每天的平均气温可能只是略有不同,但在同一时间内,影响环境的因素可能发生了巨大变化。相反,了解一天中每个小时的温度变化,加上这段时间的降水量、云量和风速,可以极大地提高物业建模和优化能源效率的能力。
再比如:如果我给你10元钱,银行传统的数据库会在我的账户上有一笔支出,在你的账户上有一笔收。然后,如果你给我10元钱,同样的过程反过来进行。最后,我们的银行余额看起来还是一样的,对于银行而言,这个月没什么变化。但是,有了时序数据库后,银行会感知到,这两个人一直互转10元钱,可能有更深层次的原因。
什么是时序数据库?
时序数据库(Time Series Database)并不是一个新兴的概念。追溯其历史,1999 年问世的 RRDtool 应该是最早的专用时序数据库了。在著名的数据库排行网站 DB-engines 上面,时序数据库的逐步流行起始于 2015 年,而在过去的两年,时序数据库成为流行度最高的数据库。
为了便于理解,一般都是找共同点,下面就是时序数据库的一些共同点:
1. 写入的数据几乎是新数据
2. 数据通常按时间顺序写入
3. 时间是一个主轴(时间间隔可以是规则的,也可以是不规则的)
当然,时序数据库作为数据库的一个重要分支,绝不是这几句话可以讲清楚的,有兴趣可以去查找相关的资料学习,这里就不搬砖了。
分析结果这么用可以吗?
平时更喜欢结合实际情况做一些实验,这次实验的素材就是生产上的nginx日志,虽然并不能算严格的时序数据库,但还是希望通过这些日志的分析,找到一些规律,或者发现一些未知的问题。标题用了疑问句,其实也是自己在探索。
话不多说,先上几张图,这是连续5天的日志分析后的词云图:
是不是看上去都差不多?中间的分析过程,由于涉及到隐私,就不在这里详述,只说一个纯技术的结论:
1 这些重复的词,基本7×24,包括周末也是类似的,都是拦截一些链接产生的,说明是程序在刷后台的应用接口。但是这些链接并不能带来什么有效的流量,反正是资源的一种浪费,所以建议除了拦截并记录之外,可以考虑进行一定的人类识别功能,屏蔽一些无效的请求。
2 当然,第1点是很难做到,第二种方案就是把这些流量能转换成有效流量, 变堵塞为疏导。
3 减少这些无效日志的产生,可以将日志大小缩小至少一半,对后期分析和存储都有好处,毕竟在全球缺电的大环境下,这也是低碳的一种方式。
部分代码(python)
贴一些python代码,也是学习了别人很多的代码,算是抛砖引玉吧。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
import jieba.analyse
import os
#生成词云
def create_word_cloud(filename):
text = open(filename,"r",encoding='UTF-8').read()
allow_pos = ('n','nr','ns','v','a')
wordlist = jieba.analyse.extract_tags(text,topK=30000, withWeight=False, allowPOS=allow_pos) # jieba分词
wl = " ".join(wordlist)
return wl
def show_word_cloud(wordlist):
# 设置词云
wc = WordCloud(
# 设置背景颜色
background_color="white",
# 设置最大显示的词云数
max_words=2000,
# 这种字体都在电脑字体中,一般路径
font_path='C:\Windows\Fonts\simfang.ttf',
height= 1200,
width= 1600,
# 设置字体最大值
max_font_size=100,
# 设置有多少种随机生成状态,即有多少种配色方案
random_state=30,
)
myword = wc.generate(wordlist) # 生成词云
# 展示词云图
plt.imshow(myword)
plt.axis("off")
plt.show()
wc.to_file('××××××.png') # 把词云保存下
if __name__ == '__main__':
# 设置文件遍历目录,一般当天日志会有很多文件,可以循环遍历
rootpath="X:\\目录"
for dirpath, dirnames, filenames in os.walk(rootpath):
for filename in filenames:
singleFile=os.path.join(dirpath, filename)
print(singleFile)
wl=create_word_cloud(singleFile)
show_word_cloud(wl)