zoukankan      html  css  js  c++  java
  • Log4J学习笔记

    我这儿有两个程序,一个是普通的java程序,实现了一个“九九表”;另一个是servlet。我这儿用的tomcat是4.1.12,J2SE是1.3.1,log4j的版本是1.2.8.

    一、九九表。
    环境设置:需要将log4j-1.2.8.jar放入CLASSPATH变量中。
    Hello.java文件的内容如下:

    import org.apache.log4j.*;
    public class Hello{
    static Logger logger = Logger.getLogger(Hello.class);
    public static void main(String[] args) {
    int i,j;
    // BasicConfigurator.configure();
    PropertyConfigurator.configure(args[0]);

    logger.info("Entering application.");
    for(i=1;i<10;i++){
    logger.debug(""+i);
    for (j=1;j<=i;j++){
    logger.warn(""+j);
    System.out.print(i*j);
    System.out.print("\t");
    }
    System.out.println("");
    }
    logger.info("Exiting application.");
    }

    log4j的配置文件log4j.inf的内容如下:
    log4j.rootLogger=WARN, stdout, R

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    # Pattern to output the caller's file name and line number.
    #log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    # Print the date in ISO 8601 format
    log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log

    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=1

    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

    # Print only messages of level WARN or above in the package com.foo.
    log4j.logger.com.foo=WARN

    运行:
    javac Hello.java
    java Hello log4j.inf

    结果会在屏幕上显示,并在example.log文件中记录。

    二、servlet
    环境设置:将log4j-1.2.8.jar及servlet.jar放入环境变量CLASSPATH中,并且要将log4j-1.2.8复制到$TOMCAT_HOME/common/lib目录下。
    假定,有一个布署到tomcat的应用叫myweb。
    servlet程序Log4jInit.java的位置在$TOMCAT_HOME/webapps/myweb/WEB-INF/classes/com/hedong/learning/log4j/目录下,内容如下:

    package com.hedong.learning.log4j;
    import org.apache.log4j.*;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Log4jInit extends HttpServlet {
    public void init() {
    String prefix = getServletContext().getRealPath("/");
    String file = getInitParameter("log4j");
    // if the log4j-init-file is not set, then no point in trying
    System.out.println("................log4j start");
    if(file != null) {
    PropertyConfigurator.configure(prefix+file);
    }
    }
    public void doGet(HttpServletRequest req, HttpServletResponse res) {
    }
    }

    在Log4jInit.java所在目录下编译它:
    javac Log4jInit.java

    myweb的设置文件web.xml在$TOMCAT_HOME/webapps/myweb/WEB-INF/目录下,增加如下红色部分。
    </web-app>
    ...........
    <servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>com.hedong.learning.log4j.Log4jInit</servlet-class>
    <init-param>
    <param-name>log4j</param-name>
    <param-value>WEB-INF/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>

    </web-app>

    同时,在这个目录下建一个文件名叫log4j.properties,内容如下:
    log4j.rootLogger=INFO, A1 , R
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=$TOMCAT_HOME/webapps/dbweb/logs/log4j.log<----将$TOMCAT_HOME换成tomcat的安装目录
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=1
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

    记住,别忘了创建目录$TOMCAT_HOME/webapps/dbweb/logs/,如果它不存在的话。
    创建目录$TOMCAT_HOME/webapps/dbweb/test/,然后在这个目录下新建一个文件test.jsp,内容如下:
    <%@ page contentType="text/html; charset=GB2312" %>
    <%@ page import="org.apache.log4j.*" %>
    <%
    Logger logger = Logger.getLogger("test.jsp");
    logger.info("befor say hi");
    %>
    <h1> Hi</h1>
    <%
    logger.info("after say hi");
    %>

    然后,重新启动tomcat,通过浏览器访问这个jsp页面,如http://yourdomain.com:8080/myweb/test/test.jsp,如果一切正常,会看到一个大大的HI。然后,在服务器上的$TOMCAT_HOME/webapps/dbweb/logs/log4j.log文件中看到如下的信息:
    INFO HttpProcessor[8080][4] test.jsp - befor say hi
    INFO HttpProcessor[8080][4] test.jsp - after say hi
    。在默认的情况下,tomcat的屏幕输出被重定向到$TOMCAT_HOME/logs/catalina.out文件中,在文件的最后也应看到上述的输出。





    前面主要记了一些原理,今天是实务。

    1、研究发现,一个系统中4%的代码是用来作logging的。
    2、Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
      Log4J运行时,不对环境做任何假定,尤其是没有默认的存放器。
    3、有几种方式可以配置Log4J
    1)在程序中调用BasicConfigurator.configure()方法;
    2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
    3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
    4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。
    看下面的例子:

    import com.foo.Bar;
    // Import log4j classes.
    import org.apache.log4j.Logger;
    import org.apache.log4j.BasicConfigurator;
    public class MyApp {
    // Define a static logger variable so that it references the
    // Logger instance named "MyApp".
    static Logger logger = Logger.getLogger(MyApp.class);
    public static void main(String[] args) {
    // Set up a simple configuration that logs on the console.
    BasicConfigurator.configure();
    logger.info("Entering application.");
    Bar bar = new Bar();
    bar.doIt();
    logger.info("Exiting application.");
    }
    }

     package com.foo;
    import org.apache.log4j.Logger;

    public class Bar {
    static Logger logger = Logger.getLogger(Bar.class);
    public void doIt() {
    logger.debug("Did it again!");
    }
    }


      BasicConfigurator.configure给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG.
      记录器之间的关系如下图:
      
    log4jexample.gif

      输出结果如下:
    0 [main] INFO MyApp - Entering application.
    36 [main] DEBUG com.foo.Bar - Did it again!
    51 [main] INFO MyApp - Exiting application.

      下面的代码结合配置信息,会得到与上述程序一样的结果。
    import com.foo.Bar;
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    public class MyApp {
    static Logger logger = Logger.getLogger(MyApp.class.getName());
    public static void main(String[] args) {
    // BasicConfigurator replaced with PropertyConfigurator.
    PropertyConfigurator.configure(args[0]);
    logger.info("Entering application.");
    Bar bar = new Bar();
    bar.doIt();
    logger.info("Exiting application.");
    }
    }
    配置文件的内容如下:
    # Set root logger level to DEBUG and its only appender to A1.
    log4j.rootLogger=DEBUG, A1

    # A1 is set to be a ConsoleAppender.
    log4j.appender.A1=org.apache.log4j.ConsoleAppender

    # A1 uses PatternLayout.
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

    利用配置文件,可以很方便地修改配置。如下例
    log4j.rootLogger=debug, stdout, R

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    # Pattern to output the caller's file name and line number.
    #log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    # Print the date in ISO 8601 format
    log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log

    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=1

    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

    # Print only messages of level WARN or above in the package com.foo.
    log4j.logger.com.foo=WARN


    对于tomcat4,利用环境变量传递参数的,可参见以下几个例子

    unix设置
    export CATALINA_OPTS ="-Dlog4j.configuration=foobar.txt"<===用PropertyConfigurator解析
    export CATALINA_OPTS ="-Dlog4j.debug -Dlog4j.configuration=foobar.xml"<===用DOMConfigurator解析
    以下是windows设置
    set CATALINA_OPTS =-Dlog4j.configuration=foobar.lcf -Dlog4j.configuratorClass=com.foo.BarConfigurator<===用com.foo.BarConfigurator解析
    set CATALINA_OPTS =-Dlog4j.configuration=file:/c:/foobar.lcf
    配置文件位置如果没有明确指明,则要放在WEB-INF/classes目录下。
    4、用servlet配置log4j
    以下都是参考冰之火的文章,抄来放在这儿,并做了一些必要的修改。需要说明的是,下面的代码需要自己写并发布,下的jar中没有这个类。待我以后写一个,也放上来。我也写了两个,在笔记(三)中。
    在Application目录下的web.xml文件加入以后代码
      <servlet>
    <servlet-name>log4jlog4j-init</servlet-name>
    <servlet-class>com.apache.jakarta.log4j.Log4jInit</servlet-class>
    <init-param>
    <param-name>log4j</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>

    这段代码的意思是说,在Tomcat启动时加载com.apache.jakarta.log4j.Log4jInit这个名叫Log4jInit.class这个类文件。
    其中Log4jInit.class的源代码如下
     
    package com.apache.jakarta.log4j;
    import org.apache.log4j.PropertyConfigurator;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Log4jInit extends HttpServlet {

    public void init() {
    String prefix = getServletContext().getRealPath("/");
    String file = getInitParameter("log4j");
    // if the log4j-init-file is not set, then no point in trying
    System.out.println("................log4j start");
    if(file != null) {
    PropertyConfigurator.configure(prefix+file);
    }
    }
    public void doGet(HttpServletRequest req, HttpServletResponse res) {
    }
    }


    在加载的过程中,程序会读取/WEB-INF/log4j.properties这个文件。
    配置文件讲解如下:
    # Set root logger level to DEBUG and its only appender to A1
    #log4j中有五级logger
    #FATAL 0
    #ERROR 3
    #WARN 4
    #INFO 6
    #DEBUG 7
    #配置根Logger,其语法为:
    #log4j.rootLogger = [ level ] , appenderName, appenderName, …
    log4j.rootLogger=INFO, A1 ,R
    #这一句设置以为着所有的log都输出
    #如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL
    #被输出,DEBUG,INFO将被屏蔽掉.
    # A1 is set to be a ConsoleAppender.
    #log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
    #ConsoleAppender输出到控制台
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    # A1 使用的输出布局,其中log4j提供4种布局. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    #org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
    #org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
    #org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    #灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout
    #d 时间 ....
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
    #R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    #日志文件的名称
    log4j.appender.R.File=log4j.log
    #日志文件的大小
    log4j.appender.R.MaxFileSize=100KB
    # 保存一个备份文件
    log4j.appender.R.MaxBackupIndex=1

    log4j.appender.R.layout=org.apache.log4j.TTCCLayout
    #log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n


    配置根Logger,其语法为:
    log4j.rootLogger = [ level ] , appenderName, appenderName, ...

    level 是日志记录的优先级
    appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。

    配置日志信息输出目的地Appender,其语法为

    log4j.appender.appenderName = fully.qualified.name.of.appender.class
    log4j.appender.appenderName.option1 = value1
    ...
    log4j.appender.appenderName.option = valueN

    Log4j提供的appender有以下几种:
    org.apache.log4j.ConsoleAppender(控制台),
    org.apache.log4j.FileAppender(文件),
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    配置日志信息的格式(布局),其语法为:

    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
    log4j.appender.appenderName.layout.option1 = value1
    ....
    log4j.appender.appenderName.layout.option = valueN

    Log4j提供的layout有以下几种:
    org.apache.log4j.HTMLLayout(以HTML表格形式布局),
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


    相关资料:

    http://www-128.ibm.com/developerworks/cn/java/l-log4j/index.html
  • 相关阅读:
    xml ui
    xml ui
    xml ui
    debug
    centOS7 mini配置linux服务器(一)安装centOs7
    数据结构之__链表
    数据结构之__队列
    数据结构之__栈
    在树莓派上使用 SSD1306 OLED 屏幕
    git官方手册
  • 原文地址:https://www.cnblogs.com/goody9807/p/790848.html
Copyright © 2011-2022 走看看