聊聊日志这件小事情

写应用不写日志,只会在撞板后也不知道为何撞板。线上的问题永远不会知道为何会发生,只会出现事故之后身处茫然之中。

1、哪怕用 print 也要输出关键数据

新手会经常在调试的时候使用 print,不论这种方式的优劣,反正关键位置数据哪怕用 print 输出都比没有好。在 linux 系统,nohup 启动进程的时候,可以把 print 输出的内容导到一个文件。只要有 print,就多了一条路子来定位数据。

2、记录日志请用成熟的框架

真心不推荐用 print 来记录日志,为什么呢?因为成熟的框架往往可以设置日志的存储方式和随意控制存储哪种级别日志内容。

我们记录日志,大部分时候是不会翻阅的,但是我们很多时候又需要从日志挖掘一些数据。例如每天请求某个接口多少次,然后有哪些接口请求耗时超过1秒的等诸如此类。

如果日志需要用于分析,我们存在于文本,就需要编写繁琐的代码来获取结果。假如我们用了 mysql 或者 mongodb 等数据库存储日志,我们就可以简单调用API来统计数据。

我们再看看这些主流的日志框架(例如 java 的 log4j,python 的标准库 logging),他们往往提供若干个记录日志的方法。例如 debug,info,warn,error 等。为什么日志要分等级呢?

当我们在开发过程中,我们往往想看每一个中间的运算过程的结果,但是在线上环境我们却无需关注中间结果。如果我们有一个开关决定记录哪种等级日志,不是不用繁琐修改代码么。

再者,各种等级日志默认有一个标识字符串,方便我们随时查阅各种级别的日志,例如我们关注 error 而很多时候忽视 warning。

3、日志分割

我们总不能把日志只存储在一个文件或者一个数据表里面,一个原因是一些日志时间久了就可以丢弃,以便节省存储空间。另一个原因是,单文件单表在数据量不断加大的情况下,查询效率会不断下降。

分割日志,我们往往会采用两种分割方法。

  • 按时间分割
  • 当数据量达到一定量的时候分割

当然,两种方案都有自己的好处。不过个人比较推崇使用第一种分割方式,这种方法在统计的时候,处理难度相对较少。

4、我的日志应该存放在哪里?

让我们来看看,一般日志的存储方式。

  • 文件
  • mysql
  • mongodb
  • hbase
  • PostgreSQL

除了上面那些存储方案,还有很多,无法一一列出。

在应用的萌芽阶段,用文件存储日志是利大于弊的。一者,使用简单,无需复杂的配置,也无需额外的依赖。再者,一开始查错都可以用 linux 的命令直接定位所需要的信息。

随着应用的不断发展,我们一个应用可能运行在多台服务器上。如果我们依旧采用文件这种日志存储方案,我们想查阅日志,还得一个一个服务器的找呢。这个时候,采用 mysql 这种存储方案就很有必要性了。因为可以把日志统一存在一个 mysql 数据库里面。

但是mysql没法方便应对日志数据项不断变更的情况下,而 mongodb 由于是非关系型数据库,数据结构可以随时变动,并且写效率比较高。

hbase在很多日志分析框架中都作为存储,应对海量数据还是不错的,由于没怎么用过,就不好评论了。

5、我们需要一个统一的日志平台

当我们手头有几个应用在线上的时候,如果我们为每一个应用开一个数据库来存储,那么还需要开若干个日志分析面板来翻阅日志呢。

这个时候,我们需要一个统一的接口,一个平台来管理所有应用的日志。当然,我也自己造了一个轮子,代码开源放在 https://github.com/yubang/ilog

6、实时日志分析ELK平台

这里不是讲解这套流行的日志分析平台的使用,而是看看它的工作原理。ELK其实是三个软件,其中一个用于收集各台服务器上的数据,然后一个是提供搜索分析服务的,一个就是可视化展示。

我们来看看收集日志的东西:logstash,它是实时增量的把日志同步到elasticsearch。对于收集日志来说,难点就在增量和实时这两个点。我所想到的方法是,记录上一次读取到的日志行数,再次读取用 seek 直接定位位置。实时可以监听文件变化而触发,系统有对应的API。

7、业务日志

上面说的日志都是用于线上发现BUG或者异常,用于系统分析。还有一类日志,就是记录一些特别的业务信息。例如一个用户的余额系统,我们要记录用户什么时候,在哪里,用什么途径,充值了多少金额,充值前余额是多少,充值后余额是多少等。用户在消费的时候同样要记录一堆信息。

8、日志与代码耦合问题

日志的好处说了一大堆,但是当我们为应用添加日志的时候,往往需要在代码里面添加一行又一行的代码串。就像整洁光滑的墙壁,嵌入一颗一颗钉子,画面没有一丝违和感。

两种可行的解决方案:

  • 使用钩子函数
  • 无埋点日志

使用钩子函数很容易理解,以 flask 框架为例,可以挂载函数在一个请求前执行,也可以挂载函数在请求后执行。

无埋点日志就比较复杂了,代码不能直接写在代码里面,那么就是要在代码运行的时候注入记录日志的代码。一些现有的技术,例如百度统计的js,只需引入一个js就可以拿到一堆数据用于分析网站。

时间: 2024-11-13 11:10:02

聊聊日志这件小事情的相关文章

关于哲哲跳舞这件小事儿

前言 诗人 Stanis?aw_Jerzy_Lec 说过一句话:雪崩的时候,没有一片雪花是无辜的.哲哲的成长和每一位亲人都密切相关,今天我想谈谈关于哲哲跳舞这件小事儿. 初心 我们常常说一句话,叫做不忘初心,方得始终.做一件事情不要忘记了最初的目的是什么,既然叫做舞蹈兴趣学习班,那么重点就在"兴趣"和"学习",培养兴趣爱好作为一项软技能,让孩子感受到学习的乐趣,同时能够锻炼身体和开发智力,这是我们的初心.而一旦这种活动让孩子产生了逆反心理甚至是厌恶,那么这就和原来的

UI 控件小知识

>在storyboard 中添加控件 UIimageview 中 是不能拖进任何控件,但是手动代码可以 >在BUtton 中 添加图片: 如果不想改变图片的拉伸,就在image中添加,如果在backbround 中添加,图片会随着按钮的frame被拉伸:填充小图片用image,大图片 用background: >若果需要为 TextField 添加图片,需要在BorderStyle中 选中 没有形状的: >在tableview.backgroundColor 和tableView.

Qt自定义控件之日志控件

摘要 一般的应用程序都需要在界面上显示日志信息, glog是google的轻量级日志库,本文结合glog,实现了一个简单的线程安全的日志控件. 正文 关于glog的使用,网上有好多介绍的资料,本文参考里面列出了一些,这里就不介绍了.下面列出日志控件的实现要点: 1.日志控件继承自google::LogSink,重新实现其virtual send()函数,自定义日志处理逻辑. 2.调用google::AddLogSink(this),将日志控件添加到glog的转发容器中: 3.日志控件使用Qpla

软件职业:聊聊学习这件事!

1 最近老徐测试团队一直在补充成员 每天收到n多测试简历 满意者寥寥无几 2 老徐之前写过n多关于测试职业学习成长的文章 今天继续来聊聊学习这件小事 希望对所有测试职业从业者或者其他同行从业者有点参考意义 当然,觉得自己很厉害的,不需要学习的.不想听老徐闲扯的朋友 忽略此文 3 核心观点: 测试职业是一个终身学习的职业 需要你学习.掌握的技能太多 4 什么时候学.什么方式学呢? 老徐认为,工作中学习才是最快.最有成效! 当然,平时的基本功练习也是非常重要 否则,真要哪天需要某个知识点.某个技能

记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题

记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题 前端开发中会经常涉及清理缓存的事情. 在一次开发后, 需要清理缓存,一个哥们怎么清理都不生效, 于是向我求救. 在我看了下后, 发现他的清理界面类似这个样子, 默认的是 ==过去一小时== 我感觉不对, 让他选择清理所有时间的, 清理后运行成功 后记: 虽然是一个很小的细节, 但是确浪费了这个哥们一整个上午的时间, 找了个中原因, 环境, 代码, 机器, 甚至开始怀疑人生.在此记录一下, 避免后来人遇到. 原文地址:ht

一些让我开心的小事情

一些让我开心的小事情 收到朋友寄来的信件 走着走着想到好笑的事情偷偷笑出来 下雨时穿着雨靴踩出的水花 做了一个好梦 一抬头就看到的满天繁星 翻到高中时候的摘抄本 回家经常去宏生源吃的小火锅 屏幕亮起她的姓名 下雨被困好朋友来送伞 西瓜最中间的那一口 穿着自己特别喜欢的衣服走在街上 吃完了药 逛超市不用排队 父母尚在,儿孙满堂 月月的猫 她在看我 在老家找到我出生时候的照片 楼梯转角你的微笑 有我的快递 写出的代码没bug 在茶馆听到自己喜欢的音乐 微凉的晚上一个人走在街上 雨天穿着长衣长袖看窗外

一件关于数据库日志log的无聊事情

为何说是无聊的记录呢? 因为事先把问题想复杂了,事后发现的时候觉得更是无聊的行为.还是写下来,毕竟很少弄这么无聊的事情. 事情起因是需要给服务器做性能基数(baseline),用sqldiag 提取了大量的log信息,当然这里的数据库日志并不是指ldf文件.当我打开SQL 2005或2008的对象资源管理器-->管理-->SQL Server 日志察看发现日志大约有百万行,当然原因我就不说了. 日志log数据太大怎么办? 先查看日志log如何被调用的,在TSQL中执行 [python] vie

小事情大道理

最近一直在头脑风暴,从刚开始的不懂,也逐渐进入状态,更逐渐的发现问题,剖析自己. 今天上午10点半我们9.10期一部分人在小会议室头脑风暴,中间出了个小插曲:关于开空调.米老师您遇到多次了吧?空调打开了,顿时凉爽了.师姐抛出一个问题:我坐在这边不热,都还穿着褂子,那边热为什么都挤在那,不坐过来呢? 1.潜意识为自己辩解,保护自己.师姐一问,我立刻反驳,提出自己的观点.人都有一种保护欲,一旦自己的想法做法被否决,他会极力为自己辩解. 有人说:极力的争辩是不成熟的表现.--智者不辩,辩者不智. 2.

WinForm控件小知识

1.DataGridView控件显示自定义表 //造个数据表 DataTable dt = new DataTable(); dt.Columns.Add("DEcode", System.Type.GetType("System.String")); dt.Columns.Add("DEname", System.Type.GetType("System.String")); dt.Columns.Add("DEu