- 浏览: 807904 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
huan19900606:
像haskell这些脚本语言很容易定义DSL,实现对应的词法语 ...
DSL的基本介绍(groovy来进行构建) -
express_wind:
https://yq.aliyun.com/album/130 ...
qlexpress规则引擎初探 -
readxuxuegang:
博主你好。如果groovy的代码是保存在数据库里,不是文件,这 ...
在java中使用groovy怎么搞 (java and groovy) -
express_wind:
hi,兄弟,有没有兴趣来阿里巴巴专门做这方面的研究,https ...
qlexpress规则引擎初探 -
langcaiye:
有2个问题请教:1. 这里的base32算法为什么需要以负数的 ...
【原】geohash算法详解
关于异常,在排查问题的时候,日志对于我们显的格外重要,前几天发布的时候就遇到一个悲剧的现象,发布beta测试的时候,发现有个NullPointException,但是日志中只有日志的类全名称,但是没有栈信息以及代码行号,无法定位哪一行跑出来的,于是只能重新改代码,十分之蛋疼。于是把日志相关的东西扫一下雷。
---------------------------------------------------------------------------------------------------------------------
日志系统
Log4j —— 较早出现的比较成功的日志系统是Log4j。Log4j开创的日志系统模型(Logger/Appender/Level)行之有效,并一直延用至今。
JUL(java.util.logging.*) —— JDK1.4是第一个自带日志系统的JDK,简称(JUL)。JUL并没有明显的优势来战胜Log4j,反而造成了标准的混乱 —— 采用不同日志系统的应用程序无法和谐共存。
Logback —— 是较新的日志系统。它是Log4j的作者吸取多年的经验教训以后重新做出的一套系统。它的使用更方便,功能更强,而且性能也更高。Logback不能单独使用,必须配合日志框架SLF4J来使用。
-----------------------------------------------------------------------------------------------------------------------
引用一篇文章中关于java log的描述。
为了克服多种日志系统并存所带来的混乱,就出现了“日志框架”。日志框架本身不提供记录日志的功能,它只提供了日志调用的接口。基本可以理解,log4j作为log信息的配置,就是日志打在哪里,怎么打等,然后有开源jar包提供了访问日志文件的接口,用来和具体的日志系统解耦,例如commmon-logging和slf4j,提供了LogFactory来获取具体的log对象,获取了log对象后,就可以打日志了。下面是两个常用的日志框架
(1)commons-logging,apache提供的日志门面接口,主要是为了避免程序和具体的log耦合。首先需要引入commons-logging.jar(通过maven或者其他方法皆可),然后这样使用就可以了
<!--[if !supportLists]-->1. <!--[endif]-->Log logger = LogFactory.getLog(TestCommonsLogging.class);
<!--[if !supportLists]-->2. <!--[endif]-->logger.debug(“test debug”);
(2)slf4j和commons-logging功能类似,首先要引入slf4j-api-1.6.4jar,然后比如要支持log4j,就引入slf4j-log4j12-1.6.4jar
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.debug(“test debug”);
<!--EndFragment-->-----------------------------------------------------------------------------------------------------------------------
Log4j的几个概念:
(1)layout:一行日志的格式,正则形式
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java
servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
如果需要线程信息,可以加上%t来获取这个信息
(2)appender:输出日志的位置信息
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(3)level:日志输出等级,共五级,DEBUG/INFO/WARN/ERROR/FATAL
-----------------------------------------------------------------------------------------------------------------------
日志中没有异常栈信息:
JDK5之后JVM有个优化,就是如果一个异常抛出一段时间后,为了性能考虑,后续就不会再抛出stackTrace信息,当然这个功能也可以通过JVM的启动参数来去掉:-XX:-OmitStackTraceInFastThrow.
-----------------------------------------------------------------------------------------------------------------------
关于Throwable
(1)getCause()
获取这个抛出的原因;
(2)getMessage()
获取这个抛出的描述信息,例如throw new Exception("我是抛出来的异常"),
这时候次方法会返回括号里面的文本信息
(3)getStackTrace()
获取抛出的栈信息,printStackTrace()能够打印栈信息。
logger.error("i am zhongyong",e); 输出文本信息以及异常栈信息
logger.error(e); 只是返回异常的名称信息,栈信息没有
-----------------------------------------------------------------------------------------------------------------------
异常转型在上面已经提到过了,实际上就是捕获到异常后,将异常以新的类型的异常再抛出,这样做一般为了异常的信息更直观!比如:
public void run() throws MyException{
...
try{
...
}catch(IOException e){
...
throw new MyException();
}finally{
...
}
}
在throw new MyException()时候,建议MyException(e),否则就会出现异常被吃掉的情况。
-----------------------------------------------------------------------------------------------------------------------
对于运行时异常,我们不要用try...catch来捕获处理,而是在程序开发调试阶段,尽量去避免这种异常,一旦发现该异常,正确的做法就会改进程序设计的代码和实现方式,修改程序中的错误,从而避免这种异常。捕获并处理运行时异常是好的解决办法,因为可以通过改进代码实现来避免该种异常的发生。
对于受检查异常,没说的,老老实实去按照异常处理的方法去处理,要么用try...catch捕获并解决,要么用throws抛出!
对于Error(运行时错误),不需要在程序中做任何处理,出现问题后,应该在程序在外的地方找问题,然后解决。
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
-----------------------------------------------------------------------------------------------------------------------
发表评论
-
系统分布式情况下最终一致性方案梳理
2015-09-05 19:34 40979前言 目前的应用系 ... -
Storm核心概念剖析
2015-03-20 20:42 3235最近团队中有分析的场 ... -
池和流的两种数据处理方式
2014-11-19 22:59 1410在抽象层面,想了一下,目前很多的数据处理形式,一般分为池和流 ... -
关于CodeReview(java)
2014-10-29 20:42 1917关于codereview,在平时的开发中,经常忽略的环节,参 ... -
java中各种各样的数据结构
2014-07-13 20:26 2504在java中,有非常丰富的数据结构,可能是因为大多数的软件 ... -
关于JVM的ClassLoader(笔记)
2014-07-13 12:19 1884众所周知,java是编译型的语言,写的是java文 ... -
关于事务的几个概念介绍
2014-06-06 22:22 1950啥是事务? 有一组操 ... -
开发中遇到的编码问题
2014-05-22 19:39 18911、说到编码,最大的问题就是乱码了,为啥会有乱码呢 ? 因 ... -
ThreadLocal源代码解析
2014-04-24 17:54 2416最开始的时候,理解的ThreadLocal,我的理解是这样的 ... -
关于单例模式(代码篇)
2014-04-23 10:47 2426很早的时候,转发过一篇单例模式的文章:http://iamz ... -
今天遇到的两个spring相关的两个问题
2014-04-18 21:56 2568今天在项目中写代码,遇到两个Spring的问题,记录一下。再 ... -
Activiti中的命令模式解析
2014-04-11 13:10 3207最近在看Activiti的源代码,发现是基于命令模式进行的开 ... -
关于java中的本地缓存-总结概述
2014-03-31 19:00 18385java中的本地缓存,工作后陆续用到,一直想写,一直无从下 ... -
使用guava中的EventBus构建内存级别的事件引擎
2014-03-25 19:27 6416这个EventBus是guava中比较给力的一个类,从字面 ... -
DSL的基本介绍(groovy来进行构建)
2014-03-04 23:32 17063什么是DSL? 领域特定 ... -
qlexpress规则引擎初探
2014-02-25 22:28 25143qlexpress是啥? 这个是阿里内部的一个开源的jav ... -
在java中使用groovy怎么搞 (java and groovy)
2014-01-15 23:17 10976什么是groovy? 一种基于Java虚拟机的动态语言, ... -
java中记录方法调用时间,结果按照方法的层级树状的输出
2013-12-21 17:36 4692 在java中,最常用的埋点时间的方法就 ... -
一次CMS GC问题排查过程(理解原理+读懂GC日志)
2013-12-14 22:21 41366这个是之前处理过的一个线上问题,处理过程断断续续,经历了两 ... -
令牌桶算法和漏桶算法以及流量控制浅谈
2013-11-27 23:20 20813 在双十一等大促环节,系统需要限流,外部 ...
相关推荐
在 Java 中,我们可以使用多种方法来将 Exception 信息转换为 String 字符串,包括使用 Log4j 和 StringWriter 等方法。这些方法可以帮助我们更好地处理和记录异常信息,从而提高程序的可靠性和维护性。 在实际开发...
标题提到的“异常日志捕获ExceptionLog”是一种常见的实践,旨在记录应用运行过程中的错误和异常信息,以便后续分析和调试。 在AndroidManifest.xml文件中,我们通常会在`<application>`节点下添加自定义的应用类...
"log4j日志记录对于exception的记录问题"这个话题涉及到如何有效地使用Log4j,一个广泛使用的开源日志框架,来处理异常情况。Log4j允许我们定制日志级别,格式,以及存储位置,以满足不同项目的需要。 首先,Log4j...
} catch (Exception e) { e.printStackTrace(); } ``` 2. 自定义LookAndFeel:如果需要自定义外观,可以实现UIManager.LookAndFeelInfo接口并注册到UIManager中。同时,需要覆盖组件的paint方法来绘制自己的样式。 ...
Java throw Exception实现异常转换 Java throw Exception实现异常转换是Java语言中的一种异常处理机制,它允许开发者将 checked exception 转换为 unchecked exception,从而使得异常处理变得更加灵活和便捷。本文...
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理
在这个场景中,我们使用了SLF4J(Simple Logging Facade for Java)作为日志抽象层,它为各种日志框架提供了统一的API,而SLF4J-log4j12-1.5.0.jar和slf4j-api-1.5.0.jar正是SLF4J与Log4j之间的桥梁,使得我们可以...
Java中的Log4j是一个广泛应用的日志记录框架,它为开发者提供了灵活且强大的日志记录功能。Log4j的出现使得在Java程序中管理和追踪错误、警告、信息以及其他调试信息变得非常方便。本篇文章将深入探讨Log4j的核心...
在Java代码中使用Log4j非常简单,只需要按照以下步骤操作: 1. 导入`org.apache.log4j.Logger`类。 2. 创建一个静态的`Logger`对象。 3. 使用`Logger`对象的方法(如`debug`、`info`、`warn`、`error`等)记录日志...
"Java.lang.OutOfMemoryError: Java heap space 解决方法" Java.lang.OutOfMemoryError: Java heap space 是 Java 中的一个常见错误,它发生时,Java 虚拟机 (JVM) 无法分配对象,因为堆空间不足。下面是解决该问题...
1、让系统打印某个exception的堆栈,无论此exception是否已经被吃掉都可打印 2、在某个指定类的某个方法的某一行,输出日志。 3、在某个指定类的某个方法的开始,输出日志。 4、在某个指定类的某个方法的...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中广泛使用的日志框架。SLF4J提供了一个抽象层,允许开发者在运行时插入所需的日志实现,比如Log4j、Logback等。这个"slf4j-log4j12-1.6.1.jar"文件是一个...
在众多的日志框架中,Log4j是Java开发者广泛使用的开源工具,因其强大的功能和灵活性而备受推崇。本文将深入探讨Log4j的核心概念、配置、以及实际应用。 1. **Log4j概述** Log4j是由Apache组织开发的一款用于Java...
Log4j是Apache提供的一款强大的日志处理框架,它灵活且功能强大,广泛应用于各种Java项目中。本话题将深入探讨如何使用Log4j实现多文件输出打印,以及自定义日志的配置。 首先,我们要理解Log4j的基本工作原理。Log...
Log4j是一个广泛使用的Java日志框架,它提供了灵活的日志记录功能。本篇文章将详细阐述如何配置Log4j,使其能够将日志信息发送到Apache Kafka,一个分布式流处理平台。 首先,我们需要在项目中引入相关的依赖。在`...
Log4j是Apache组织提供的一款强大的日志框架,广泛应用于各种Java项目。本教程将介绍如何在Java应用中简单使用log4j,包括其配置和API的使用。 **描述:“log4j的简单使用,提供使用步骤,有注释,有所需jar包”** ...
Log.d("TAG", "这是带有行号的Log: " + new Exception().getStackTrace()[2].getLineNumber()); ``` 这样,每次输出Log时都会附加当前行的行号。 2. 自定义Logger工具类: 为了方便使用,可以创建一个名为`...
总的来说,log4j为Java开发者提供了一套强大且灵活的日志管理系统,通过合理的配置和使用,可以有效地提升开发效率和维护质量。通过深入理解log4j的原理和API,开发者能够更好地管理和监控应用程序的运行状况。
Log4j和SLF4J(Simple Logging Facade for Java)是两个广泛使用的日志框架,它们各有优势并常被一起使用以提供更灵活的日志解决方案。本文将详细探讨如何通过SLF4J接口来使用Log4j进行日志记录,并展示一个测试代码...