首页 > 代码库 > (转)log4j(一)——为什么要用log4j?
(转)log4j(一)——为什么要用log4j?
1 试验环境
OS:win7
JDK:jdk7
Log4j:1.2.17(好尴尬,原本是想试验下log4j2的,结果阴差阳错用了这个版本,不过幸好,试验也不白试验,试验的作用是一样的)
2 先看两个简单的栗子然后在谈为什么吧!
(1)当我们想打印一些信息时,估计这是最容易想到的一种方式,将我们想打印的信息,打印到控制台中
/** * Created by godtrue */public class UnLog4j { public static void main(String[]args){ //打印日志信息 System.out.println("hello log4j !"); }}
(2)这个是使用log4j日志框架,我觉得最简单的一种实现方式,好像比(1) 麻烦不少,我们好像没有必要非使用log4j日志框架的,那么再看看下面的栗子吧!
import org.apache.log4j.BasicConfigurator;import org.apache.log4j.LogManager;import org.apache.log4j.Logger;/** * Created by godtrue */public class UseLog4j { //日志记录器 private static Logger LOGGER = LogManager.getLogger(UseLog4j.class); public static void main(String[]args){ //自动快速地使用缺省Log4j环境 BasicConfigurator.configure(); //打印日志信息 LOGGER.info("hello log4j !"); }}
(3)这段日志信息,我们的需求稍微复杂了一点点,我们想区分开来打印的信息的级别,比如:哪些可能是错误的情况?哪些可能是警告的情况?以及顺便看一下不使用日志框架时程序运行的效率如何?
import test.log4j.bean.Person;public class UnLog4j { //循环次数 private static long CYCLE = 102; //程序入口——主函数 public static void main(String[]args){ long startTime = System.currentTimeMillis(); for(int i=0;i<CYCLE;i++){ if(i<100){ try{ System.out.println(new Person("godtrue",100/i,‘M‘));//打印对象的信息 }catch(Exception e){ System.out.println(i+"岁的小孩还不存在嘛!");//打印对象的信息 }finally{ System.out.println("现在大部分人的年龄都在0到100岁之间的!");//打印对象的信息 } }else{ System.out.println("我是一棵树,我今年活了"+i+"岁!哈哈,我厉害吧!");//打印对象的信息 } } System.out.println("此程序的运行时间是:"+(System.currentTimeMillis()-startTime));//打印程序运行的时间 }}
(4)这段日志信息和(3)的需求一模一样,使用日志框架好像更能满足一些我们的特殊需要啦,是的,这也是为什么我们选择使用日志框架的原因的
import org.apache.log4j.BasicConfigurator;import org.apache.log4j.LogManager;import org.apache.log4j.Logger;import test.log4j.bean.Person;public class UseLog4j { //日志记录器 private static Logger LOGGER = LogManager.getLogger(UseLog4j.class); //循环次数 private static long CYCLE = 102; //程序入口——主函数 public static void main(String[]args){ long startTime = System.currentTimeMillis(); //自动快速地使用缺省Log4j环境 BasicConfigurator.configure(); for(int i=0;i<CYCLE;i++){ if(i<100){ try{ LOGGER.info(new Person("godtrue",100/i,‘M‘));//打印对象的信息 }catch(Exception e){ LOGGER.error(i+"岁的小孩还不存在嘛!");//打印对象的信息 }finally{ LOGGER.warn("现在大部分人的年龄都在0到100岁之间的!");//打印对象的信息 } }else{ LOGGER.info("我是一棵树,我今年活了"+i+"岁!哈哈,我厉害吧!");//打印对象的信息 } } LOGGER.debug("此程序的运行时间是:"+(System.currentTimeMillis()-startTime));//打印程序运行的时间 }}
(5)这段代码平淡无奇,是用来辅助我们测试的,不过实际的开发中使用这类代码的地方可以说是到处都是
public class Person { //姓名 private String name; //性别 private char sex; //年龄 private int age; //有参构造函数 public Person(String name, int age, char sex) { this.name = name; this.age = age; this.sex = sex; } //无惨构造函数 public Person() { } @Override public String toString() { return "Person{" + "name=‘" + name + ‘\‘‘ + ", sex=" + sex + ", age=" + age + ‘}‘; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char isSex() { return sex; } public void setSex(char sex) { this.sex = sex; }}
3 看完栗子后的感想
(1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候;我们的应用出现了问题,我们分析、定位、解决问题的时候;我们想将某些日志信息作为离线的业务数据分析的时候等等
(2)最简单的打印日志的方式就是使用系统本身的输出语句,不过对于大多数需求这种方式都是不能满足的
(3)于是我们的目光可能会向编写一个专门打印日志信息的工具类转移,不过有人更近了一步,写出了一个日志框架供我们使用
(4)使用日志框架的好处显而易见,方便、自在、功能强大能够满足各种需求,不好的地方也是有的,比如:如果你也进行了试验你会发现,程序变慢了,需要一定的时间和精力作为学习的成本
(5)日志框架都是能控制什么哪?那我们需要打印的日志都能满足什么样的需求哪?通常我们希望一个日志框架能够灵活的做到以下三点:
5-1:能够控制日志信息想往哪里打就往哪里打,比如:控制台、文件、邮箱、数据库等等
5-2:能够控制日志信息想怎么打就怎么打,比如:我想要打印时间、程序的名称、程序的方法名、程序的行号、线程的名称等等
5-3:能够控制日志信息想打什么打什么,不想打的就不打,日志信息是分级别的,有时候我只想看错误的信息或者警告的信息,有时候我想看到所有的信息我想调试程序等等
(6)如果有这么个框架,不是太难使用我也是非常乐意玩玩的,尤其是当程序出现问题的时候,项目负责人让你赶紧解决问题,这时候有一份日志文件可供分析就好了!
4 log4j是这样的一个框架吗(很明显它是,要不然我不就白玩了嘛!)?
log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过log4j其他的语言接口,您可以在C、C++、.Net、PL/SQL程序中使用log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
5 记录日志信息的作用(通俗的解释上面已经讲了,不过下面的讲法显得更专业一些)
1)监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
2)跟踪代码运行时轨迹,作为日后审计的依据;
3)担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
。
(转)log4j(一)——为什么要用log4j?