godtrue

一:试验环境

OS:win7

JDK:jdk7

Log4j:1.2.17(好尴尬,原本是想试验下log4j2的,结果阴差阳错用了这个版本,不过幸好,试验也不白试验,试验的作用是一样的)

二:先看两个简单的栗子然后在谈为什么吧!

(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;
    }
}

 

三:看完栗子后的感想

(1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候;我们的应用出现了问题,我们分析、定位、解决问题的时候;我们想将某些日志信息作为离线的业务数据分析的时候等等

(2)最简单的打印日志的方式就是使用系统本身的输出语句,不过对于大多数需求这种方式都是不能满足的

(3)于是我们的目光可能会向编写一个专门打印日志信息的工具类转移,不过有人更近了一步,写出了一个日志框架供我们使用

(4)使用日志框架的好处显而易见,方便、自在、功能强大能够满足各种需求,不好的地方也是有的,比如:如果你也进行了试验你会发现,程序变慢了,需要一定的时间和精力作为学习的成本

(5)日志框架都是能控制什么哪?那我们需要打印的日志都能满足什么样的需求哪?通常我们希望一个日志框架能够灵活的做到以下三点:

       5-1:能够控制日志信息想往哪里打就往哪里打,比如:控制台、文件、邮箱、数据库等等

       5-2:能够控制日志信息想怎么打就怎么打,比如:我想要打印时间、程序的名称、程序的方法名、程序的行号、线程的名称等等

       5-3:能够控制日志信息想打什么打什么,不想打的就不打,日志信息是分级别的,有时候我只想看错误的信息或者警告的信息,有时候我想看到所有的信息我想调试程序等等

(6)如果有这么个框架,不是太难使用我也是非常乐意玩玩的,尤其是当程序出现问题的时候,项目负责人让你赶紧解决问题,这时候有一份日志文件可供分析就好了!

 

四:log4j是这样的一个框架吗(很明显它是,要不然我不就白玩了嘛!)?

      log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

      此外,通过log4j其他的语言接口,您可以在C、C++、.Net、PL/SQL程序中使用log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

 

五:记录日志信息的作用(通俗的解释上面已经讲了,不过下面的讲法显得更专业一些)

      1)监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;

      2)跟踪代码运行时轨迹,作为日后审计的依据;

      3)担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

 

六:参考

使用Log4j进行日志操作

 

posted on 2017-02-25 17:21  godtrue  阅读(38124)  评论(6编辑  收藏  举报