sqlserver 事务日志 异常增长原因排查_小白入门学习打日志

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

记得之前写过一篇:《阿里巴巴 Java开发手册》读后感,之前自学时由于没怎么接触过打“日志”,所以《手册》中的“日志规约”我就先放一边去了。

而之前写了一篇:在公司做的项目和自己在学校做的有什么区别?中就有提到:公司的项目不会有e.printStackTrace();这种代码的存在。因为这打印出来的错误信息没有日期、等级等等,分析起来不方便。

在工作中去服务器上查日志又是一个非常非常常见的操作,所以当初我又写了一篇 工作中常用到的Linux命令,里边就谈到了查日志时常用的Linux命令。

想着,既然接触日志也有一段时间了,不妨在回看《手册》,看看有什么要注意的地方,于是就有了这篇笔记。

一、Java打日志的基础

以前自己自学的时候,排查问题只会写下面的代码:

try {
   // doSomething
} catch (Exception e) {
    e.printStackTrace();
}
----------
// 查看某个数据的值时:
System.out.println(xxxx);

去到公司就发现上面的代码全不见了,剩下的是:

LOGGER.info("begin to run Java3y:{}", id);
----
LOGGER.error("excepiton occurs when run Java3y {}, exception{}", id, e.toString());

如果使用e.printStackTrace();的话,打印在控制的信息分析不方便:

199a4a28cda4184ed37292bdffc27710.png
打印在控制的信息分析不方便

而我们将信息分等级和时间记录在服务器的磁盘上,有问题了就可以根据对应的信息去查找相关的日志(这样排查起来是十分方便的):

09683f95ea0ccb3db2882e013598041e.png
服务器上的日志信息

我们再来看一下一般的日志长什么样的:

cec6739e22d2075a68c7097fa219199f.png
日志长的是什么样的

例如:现在有人来反馈某某某用户好像收不到短信,给出发送时间和用户ID,我们就可以在日志上找出该用户在我们系统的发送状态(例如图上的:state:81,我们就认为是发送成功状态)

那么,问题来了,我们在哪打日志?《手册》上其实已经给出了答案:

谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出 info 日志;如果使

用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘

撑爆,并记得及时删除这些观察日志。

大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些

日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?

1.1什么叫做 打点 ?

打日志最常见的就是用来打印出程序执行时的相关信息,用于快速定位问题和排查问题。我一开始也是这么理解的,但是其实还可以延伸一下。

我现在搞的那个系统,我们还使用日志在系统的执行链路上打点。比如说,我现在要推送一条通知消息,通知消息其实就是下面这种:

d7c256ff46b5b8c1d72b2f208d002ebc.png
这就是通知消息

这个过程大概是如此的:

  • 首先别人调用我的RPC提供的接口(或者我自己调用自己的接口),发现这是一个通知消息。于是我组装成对应的Task,异步放到消息队列中

  • 另一个系统从消息队列中取出Task,对这个Task进行业务的处理(比如说是否夜间屏蔽,是否强制发送等等),然后调用HTTP接口把这个Task交给下游

  • 下游做的事其实也很多,整块链路很长(比如要调用SDK的库,Android和IOS又做不同的处理)

953b92ba759030c10ffb66516feac5c8.png
整块链路

而我们又希望在推送完了之后能统计出一些指标(曝光量,点击率,转化率)等等。于是乎,就需要在一些关键的位置上打一个日志(专业点叫做打点)

在整块链路都打通了以后,将这些点位(日志)收集起来,放到实时流式处理平台(storm/flink)上清洗/过滤。如果是实时需要用到的放到Redis,离线的放在Hive。

二、手册规范

2.1 使用门面模式的日志框架

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架

SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一

门面模式我之前也写过一篇笔记:三分钟学会门面模式!

其实说白了就是希望抽象出一层API,能够在切换具体日志框架的时候不需要大面积更改

这个我们可以按学JDBC的时候去理解:

无论我是接入MySQL、Oracle还是SQL Server,但我的接口永远都是那一套,切换数据库时不需要更改我的Java API

看了一下公司的项目,采用的是SLF4J+Logback

2.2 调用RPC接口使用Throwable类拦截

【强制】在调用 RPC、二方包、或动态生成类的相关方法时,捕捉异常必须使用 Throwable

类来进行拦截。

之前在排查问题的时候,有个问题死活排不出来,DeBug的时候一直没进catch模块。后来我学长就说:“要不你改成Throwable试试?

try {

} catch (Throwable e) {

}

我就很疑问,说:“为啥要改成Throwable呢?我们用Exception不就可以捕获所有的异常了么,Exception是Throwable的一个子类,但Exception已经是包含所有的Java异常了呀”

众所周知,Throwable有两个子类:

  • Error(一般我们都会把这个忽略掉…一般情况下出现了Error程序都运行不起来)

  • Exception

The  Throwable class is the superclass of all errors and exceptions in the Java language

在《手册》上也有对上面的规则进行说明:

说明:通过反射机制来调用方法,如果找不到方法,抛出 NoSuchMethodException。什么情况会抛出

NoSuchMethodError 呢?二方包在类冲突时,仲裁机制可能导致引入非预期的版本使类的方法签名不匹

配,或者在字节码修改框架(比如:ASM)动态创建或修改类时,修改了相应的方法签名。这些情况,即

使代码编译期是正确的,但在代码运行期时,会抛出 NoSuchMethodError

大概的意思就是说:调用 RPC、二方包、或动态生成类的相关方法时,可能直接抛出的是Error,而catch Exception是无法捕获得到的。

想看例子的同学可以看看这篇文章:

  • https://zhuanlan.zhihu.com/p/57950399

最后

这篇文章好像有点短…

参考资料(阿里巴巴开发手册下载地址):

  • https://github.com/alibaba/p3c

查阅资料时发现的好文:

  • https://www.cnblogs.com/chenhongliang/p/5312517.html

  • https://www.cnblogs.com/crazyacking/p/5456347.html

推荐阅读:

  • 记一次愚蠢的操作--线程安全问题

  • 最近学到的前后端分离知识

  • 在工作中常用到的SQL

  • Github上有哪些Java面试/学习相关的仓库推荐?

  • 工作中常用到的Linux命令

  • 在公司做的项目和自己在学校做的有什么区别?

  • 目录|Java3y最全目录

79744849130390c8b85bacc2a6b80061.png200多篇原创技术文章海量视频资源精美脑图面试题

长按扫码可关注获取 

欢迎关注562d9bb218e8f724852186120e5bd6d8.png点个再看7d436f16b52590b97c280bdf523e10aa.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 k8s 中部署 Prometheus 和 Grafana

部署 Prometheus 和 Grafana 到 k8sIntro上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k8s 中部署的时候就不能在使用前面讲的静态配置的方式来部署了,需要使用 Prometheus 的服务发现。部署规划Pr…

EntityFramework Core 5.0 VS SQLBulkCopy

【导读】EF Core 5.0伴随着.NET 5.0发布已有一段时日,本节我们来预估当大批量新增数据时,大概是多少区间我们应该考虑SQLBulkCopy而不是EF CoreSQLBulkCopy早出现于.NET Framework 2.0,将数据批量写入利用此类毫无疑问最佳,虽其来…

小心使用 Task.Run 续篇

关于前两天发布的文章:为什么要小心使用 Task.Run,对文中演示的示例到底会不会导致内存泄露,给很多人带来了疑惑。这点我必须向大家道歉,是我对导致内存泄漏的原因没描述和解释清楚,也没用实际的示例证实,是…

java实用教程——组件及事件处理——设置组件的位置(相对于窗口具体位置和布局)

1: 相对于窗口的具体位置 关键点: JButton组件添加到JPanel时,如果想自己位置,需要对JPanel进行如下设置,才能自定义按钮位置 需要将组件添加到画板上去,才可以设置组件的相对具体位置 button1.setBounds…

usb接口定义引脚说明_PerfDogService使用说明

令牌申请教程:https://bbs.perfdog.qq.com/article-detail.html?id55安装包下载:https://perfdog.qq.com/sdk一、 概述PerfDog性能狗服务组件,用户可基于service组件二次开发自己PerfDog性能工具或自动化服务。本文档主要对PerfDogService提…

java实用教程——组件及事件处理——布局管理(五种)

1.流式布局FlowLayout public void pack()调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。在计算首选大小之后,将会验证该Window。窗口自动适应大小,使…

个人博客前端模板_腾讯前端开发工程师,教你极速搭建一个个人博客网站

作者: bookerzhao,腾讯 CSIG web前端开发工程师Github 为开源项目提供了用于静态页面展示的 Pages 服务,很多开发者都在上面托管了自己的静态网站和博客,不少开源项目的案例和文档页面也采用了这种方式。不过由于 Pages 的 CDN 节…

云原生时代 给予.NET的机会

.NET诞生于与Java的竞争,微软当年被罚款20亿美元。Java绝不仅仅是一种语言,它是COM的替代者!而COM恰恰是Windows的编程模型。而Java编程很多时候比C编程要容易的多,更致命的是他是跨平台的。微软所推行.NET战略,并且C#…

java实用教程——组件及事件处理——布局的一个小实例

import javax.swing.*; import java.awt.*;public class BasicComponentDemo {Frame frame new Frame("这里测试基本组件");//定义一个按钮Button ok new Button("确认");//定义一个复选框组CheckboxGroup cbg new CheckboxGroup();//定义一个单选框&am…

非极大值抑制_非极大值抑制(non-maximum suppression)

摘自https://blog.csdn.net/qq_38906523/article/details/80195119摘自https://blog.csdn.net/xiexu911/article/details/80609298非极大值抑制NMS在目标检测,定位等领域是一种被广泛使用的方法。对于目标具体位置定位过程,不管是使用sliding Window还是…

TIOBE12月榜单:Java重回第二,Python有望四连冠年度语言

喜欢就关注我们吧!文|白开水TIOBE 公布了 2020 年 12 月的编程语言排行榜。TIOBE 将在下个月公布 2020 年的年度编程语言,一年内排名率增长最高的编程语言将获得这一称号。目前,Python 以 1.90% 数据遥遥领先。其次分别是 C(0.71%…

excel怎么在柱状图上加超链_如何让你的年终总结更符合领导心意,高薪员工必备的excel技能...

临近年底了,好多人都在写年终总结了,惯有的模式就是写一写这一年都做了哪些工作,有什么成绩,未来将如何完善等等......但是如何反应自己一年以来的成绩呢,如果单单是以文字的形式表述怕是不能让领导满意,甚…

java实用教程——组件及事件处理——对话框(dialog)

对话框: import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import java.awt.*; import java.awt.event.*;public class DialogDemo1 {public static void main(String[] args) {Frame frame new Frame("这里测试Dialog");Di…

Vue 凭什么成为 2020 年的一匹黑马

Vue 在前端开发中的火爆程度远超 React 和 Angular ,无论是 BAT 等大厂,还是小型初创公司,Vue 都有着广泛的应用,其相关技术原理也是面试的必考知识点。Vue 的优势太过明显:基于 HTML 的模板语法,响应式的更…

python——学习笔记1

推荐阅读: 爆肝十二万字《python从零到精通教程》 Python菜鸟教程 1.python 的输入输出: 输入:input() 输出:print() 输出不换行:print(x,end"") 数据要和字符串同时输出的时候需要将数据转化为字符串类…

开源C# Winform控件库《SunnyUI》强力推荐

本站(https://dotnet9.com)曾介绍过一款Winform开源控件库《HZHControls》,文章发布后不少朋友热情的咨询相关控件库信息,由此看来Winform在大家心中的地位还是挺高的。今天小编再分享一款新鲜出炉的 Winform 控件库库——SunnyUI,一起跟 Dot…

python——学习笔记2

python的数据结构 字符串: 字符串小写转大写: 字符串大写转小写: 删除空格: 空白是实际文本之前和/或之后的空间,通常您想删除这个空间。 strip()方法从开头或结尾删除任何空格: 替换字符串: replace()方…

庐山真面目之一 微服务的简介和技术栈

一、简介 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能、高吞吐率、高稳定性、高扩展等特性提出了更高的要求。可以说业务需求是软件架构能力的第一推动力,由于这些因素导致了软件架构思想和相关技术也在发生…

.net 读蓝牙数据_Linux内核曝严重蓝牙漏洞,影响多个版本

谷歌安全研究人员在Linux Kernel中发现了一组蓝牙漏洞(BleedingTooth),该漏洞可能允许攻击者进行零点击攻击,运行任意代码或访问敏感信息。BleedingTooth漏洞分别被命名为CVE-2020-12351,CVE-2020-12352和CVE-2020-24490。其中最严重的漏洞是…

python——学习笔记3

日期: Python 日期和时间 函数: python 传不可变对象实例