log4j(一)——为什么要使用log4j?

一:试验环境

OS:win7

JDK:jdk7

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

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

(1)当我们想打印一些信息时,估计这是最容易想到的一种方式,将我们想打印的信息,打印到控制台中

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;

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进行日志操作

时间: 2024-10-16 16:59:40

log4j(一)——为什么要使用log4j?的相关文章

struts2 log4j:WARN Please initialize the log4j system properly. 解决方法

在tomcat启动的时候,出现这个警告: log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).log4j:WARN Please initialize the log4j system properly. 解决办法: log4j.properties文件需要放到web-inf/class目录下面,在eclipse里面放到src目录下面,会自动拷贝到class目录下

Log4J学习【一】Log4J简介

Log4J简介 基本上所有的大型应用,包括我们常用的框架,比如hibernate:spring:struts等,在其内部都做了一定数量的日志信息.为什么要做这些日志信息,在系统中硬编码日志记录信息是调试系统,观察系统运行状态的一种方式.可能大部分程序员都还记得自己最开始写代码的时候,写一个方法总是出错,就喜欢使用System.out.println("1111111")之类的代码来查看程序的运行是否按照自己想要的方式在运行,其实这些sysout就是日志记录信息,但使用System.ou

log4j:WARN Please initialize the log4j system properly解决办法

log4j:WARN No appenders could be found for logger(org.springframework.context.support.ClassPathXmlApplicationContext). log4j:WARN Please initialize the log4j system properly. Spring 使用了LOG4J 这个开源框架来输出信息,要解决这个问题非常简单,建立LOG4J 的配置文件即可.在src 目录下创建配置文件,选择菜单

log4j:WARN Please initialize the log4j system properly解决的方法

要解决问题很easy,建立LOG4J 的配置文件就可以. 在src 文件夹下创建配置文件,选 一.择菜单File > New > File,文件名称输入log4j.properties,文件内容例如以下所看到的: log4j.rootLogger=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayo

【log4j:WARN Please initialize the log4j system properly.】解决办法

[问题描述] 配置日志,使用SLF4J和LOG4J搭配,数据库连接池使用c3p0,启动服务器,会出现如下警告信息: log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog). log4j:WARN Please initialize the log4j system properly. [问题原因] Spring 使用了LOG4J这个开源框架来输出信息 [解决办法] 添加LOG4J 的配置文件,由于我使

log4j:WARN Please initialize the log4j system properly. 异常解决

log4j:WARN Please initialize the log4j system properly. 这个异常很少遇到,咋一看,原来是没有配置logger4j的配置文件 问题解决方法: 传统项目,将你的log4j.properties文件放在src目录下就可以了 maven项目,将你的log4j.properties文件放在resources目录下就可以了 如果你有其他自定义配置方法就遵循项目的配置方法了 记录一下而已,hello world

log4j:ERROR A &quot;org.apache.log4j.DailyRollingFileAppender&quot; object is not assignable to a &quot;org.apache.log4j.Appender&quot; variable.

多个classloader加载log4j时需要设置当前Thread的classloader为你自己的classloader Thread.currentThread().setContextClassLoader(classLoader); //for log4j 摘自:org.apache.log4j.helpers.Loader /** * If running under JDK 1.2 load the specified class using the * <code>Thread&

使用hibernate出现log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly.问题的解决办法

问题描述: log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).log4j:WARN Please initialize the log4j system properly. 问题分析: 大概意思就是它没读到log4j的配置信息,然后让你导入它什么的(差不多是这个意思,可能是你导入了,但没配置好) 解决方法: 从原因上分析,其实它是找不到它需要的那个名为log4j.pr

log4j配置参考手册:log4j.properties和log4j.xml两种格式

log4j是Java Web开发中,最常用的日志组件之一.网上关于log4j的配置满天飞,我主要是从网上学习的配置.之前的很多年,主要使用log4j.properties这种格式.后来,项目中boss使用了log4j.xml这种配置.   关于xml配置,之前也用过,主要觉得麻烦,而且还要手动配置listener,所以基本不用.   和boss交流了下,发现xml格式的配置,语法更全面.我主要发现了2种"高端用途" :1.业务日志与系统日志相分离.(这个比较有价值)2.配置过滤器. (

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.o

上面的报错是在本地java调试(windows) hadoop集群 出现的 解决方案: 在resources文件夹下面创建一个文件log4j.properties(这个其实hadoop安装目录下的 etc/hadoop/log4j.properties 同名,我尝试拿过来用,发现还是不行报错信息如下) log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFa