因打印日志而引发的故障

问题描述:

最近已经有两个项目因为日志打印问题而引发了故障,可以说是血的教训了。两次故障的原因也是非常的相似,都是由于其他业务系统调用了另外一个老系统的接口,但是由于传递的参数不正确,而老系统会因为参数不正确而打印日志。当错误的请求量增大,打印日志会造成当前线程阻塞,容易使机器机器负载升高,产生性能问题

排查方法:

1. 直接查看机器上日志大小

2. 还可以通过Jstack查看 占用cpu最多的线程,多查看几次,如果每次都是打印日志的线程,那基本上也可以确定是打印日志的问题

解决方案:

1. 提前校验参数,如果参数有问题应该抛出异常

2. 在logback的AsyncAppender中配置<neverBlock>true</neverBlock> 避免业务线程的阻塞

<!-- 异步输出 -->
    <appender name ="STDOUT_ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold >0</discardingThreshold>
        <queueSize>512</queueSize>
        <includeCallerData>false</includeCallerData>
        <neverBlock>true</neverBlock>
        <appender-ref ref ="stdout"/>
    </appender>

Logback的neverBlock原理:

由于logback相当于是生产者-消费者模式,当时我们在系统中ogger.info()或者ogger.error()时,是把日志信息加入到logback的队列中,默认是调用队列的put方法,而当队列满了之后,就会阻塞当前的线程。而设置了neverBlock后,则会调用offer方法,如果队列满了,则丢弃。可以查看源码:

原文地址:https://www.cnblogs.com/hello---word/p/10987006.html

时间: 2024-10-10 09:09:48

因打印日志而引发的故障的相关文章

使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置文件开始用的log4j.properties,结果控制台一直打印ERROR StatusLogger No log4j2 configuration file found.也就是Log4j2配置文件没找到的意思. 我就把log4j.properties文件名改成log4j2.properties,结果不报错了

打印日志编程

C++打印日志编程例子: int iCnt = 0; CString csMsg; CTime curTime; CMyLog mylog; CString csMylog; csMylog.Format("%d:\\CYJ\\ThreadTask%d.log",id); csMsg.Format("%s第%d客户端,第%d轮温循测试开始\r\n",curTime.Format("%Y-%m-%d %H.%M.%S"),id,iCnt); myl

打印日志

=============================================== #最普通的log打印 import logging log_file="/tmp/mylog.log" logging.basicConfig(filename=log_file,level=logging.DEBUG) def fun1(): logging.debug("This is running fun1") if __name__=="__main_

python之打印日志logging

1 import logging 2 3 4 # 简单打印日志举例 5 logging.basicConfig(level=logging.DEBUG) # 设置日志级别,WARN 6 logging.warning('Watch out!') # will print a message to the console 7 logging.info('I told you so') # will not print anything 8 9 10 # 打印日志到文件,注意要新起一个文件,否则不能

根据需要分等级的打印日志(C语言)

在程序遇到问题调试时,有时候需要打印一些中间变量,观察完调试完又需要把这些打印注释掉,感觉很麻烦.所以写了一个小程序,可以设置打印日志等级. 在主程序设置要打印的日志等级debug,就把相应的等级的日志全部打出来观察. 程序用到了va_list(在C语言中解决变参问题的一组宏),相关知识可参考http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html(注意链接文章正确的程序在评论中) . 直接上主程序:main.cpp 1 #

hive命令行不打印日志

[Author]: kwu hive命令行不打印日志,hive的命令行运行会输出mapreduce的日志,这些日志对大部分用户来说是不需要的. 如何去掉这个日志: hive -S 加上 "-S"  参数即可(-S,--silent ). 版权声明:本文为博主原创文章,未经博主允许不得转载.

iOS 打印日志的保存 (一)

当我们真机调试app的时候,作为开发人员的我们可以很方便的通过Xcode的debug area查看相关的打印信息.而测试人员在对app进行测试的时候,一旦出现了crash,这时我们就需要把相关的打印信息保存下来, 以便后面进行查看追踪crash原因.在这里我们可以将打印信息写入沙盒系统中.不多说了,直接上代码. 1 - (void)redirectNSlogToDocumentFolder 2 { 3 if (isatty(STDOUT_FILENO)) 4 { 5 NSLog(@"真机调试,无

mqtt.c打印日志

mqtt中自身就带有日志系统Log.h和Log.c,这些日志文件是在客户端调用MQTTClient_create函数是初始化的,MQTTClient_create源码如下: int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId, int persistence_type, void* persistence_context) { int rc = 0; MQTTClients *

Android中的五大布局和logcat打印日志

在android中的布局有五大类,有的时候你可能用到一种,但有的时候你也可能需要两种或者三种布局同时一起使用.这五种布局为别为:LinearLayout(线性布局),FrameLayout(框架布局),RelativeLayout(相对布局),TableLayout(表格布局),AbsoluteLayout(坐标布局): LinearLayout:被称为线性布局,分为水平和垂直,设置的垂直或水平的属性值,来排列所有的子元素.所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元