log4j的使用与java中properties配置文件加载

xiaoxiao2021-02-27  201

日志是我们在写代码中经常会用到的,程序出错了我们也需要去查看日志来调错,对于像我们这一些新人来说,怎么去使用日志就比较陌生,下面我将我学习的过程分享一下:

1.需要找到一个log4j包,我使用的是log4j-1.2.15.jar。放在工程lib文件夹下

2.新建一个peoperties配置文件,一般取名为:log4j.properties,最好放在src文件夹下,配置文件详解如下:

[plain] view plain copy # 将等级为debug的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名  log4j.rootLogger = debug, stdout,R    # 定义stdout的输出端是哪种类型,可以是ConsoleAppender(控制台),FileAppender(文件)等  log4j.appender.stdout=org.apache.log4j.ConsoleAppender    #指定输出端的layout(布局)是哪种类型  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout    #以PatternLayout布局,就是设置输出格式  log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n    #同stdout  log4j.appender.R=org.apache.log4j.RollingFileAppender  #定义以文件类型输出的问津路径及文件名  log4j.appender.R.File=D:\\nepalon\\classes\\TestLog4j\\example.log    # Archive log files (one backup file here)  #设置保存一个备份文件  log4j.appender.R.MaxBackupIndex=1    #以下都同stdout  log4j.appender.R.layout=org.apache.log4j.PatternLayout  log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n  

3.新建Java类用来测试,代码如下:

[java] view plain copy package com.xmh.log1;    import org.apache.log4j.Logger;  import org.apache.log4j.Priority;  import org.apache.log4j.PropertyConfigurator;    public class TestLog4j {      //获取logger对象,参数为需要使用Logger的相关类      static Logger logger = Logger.getLogger(TestLog4j.class.getName()); //(2)      public TestLog4j(){}      public static void main(String[] args)      {          System.out.println("TestLog4j:"+TestLog4j.class);          System.out.println("TestLog4j:"+TestLog4j.class.getName());          //同时输出到控制台和一个文件的实例并实现了Logger的继承   [java] view plain copy //加载配置文件,建议放在src下面  PropertyConfigurator.configure("<a target=_blank href="file://\\log4j.properties">\\log4j.properties</a>");   [java] view plain copy //下面是用logger的5个等级分别输出日志  logger.debug("Start of the main() in TestLog4j");  logger.info("Just testing a log message with priority set to INFO");  logger.warn("Just testing a log message with priority set to WARN");  logger.error("Just testing a log message with priority set to ERROR");  logger.fatal("Just testing a log message with priority set to FATAL");  logger.log(Priority.WARN, "Testing a log message use a alternate form");  logger.debug(TestLog4j.class.getName());   [java] view plain copy         //调用另一文件的testLog()方法          TestLog4 testLog4j2 = new TestLog4();          testLog4j2.testLog();      }  }   [java] view plain copy package com.xmh.log1;    import java.io.IOException;  import java.util.Properties;    import org.apache.log4j.Logger;  import org.apache.log4j.Priority;  import org.apache.log4j.PropertyConfigurator;  import com.xmh.servlet.Log4j.Log4jInit;    public class TestLog4 {      static Logger logger = Logger.getLogger(TestLog4.class.getName());      public TestLog4(){}      public void testLog()      {             //同时输出到控制台和一个文件的实例          /* 用log4包加载配置文件 */          //PropertyConfigurator.configure("\\log4j.properties");          /* 用java自带peoperties加载配置文件  */          Properties props=new Properties();          try {              System.out.println("++++++properties++++++++");              props.load(Log4jInit.class                      .getClassLoader()                      .getResourceAsStream("log4j.properties")                      );          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }          logger.debug("2Start of the main()");          logger.info("2Just testing a log message with priority set to INFO");          logger.warn("2Just testing a log message with priority set to WARN");          logger.error("2Just testing a log message with priority set to ERROR");          logger.fatal("2Just testing a log message with priority set to FATAL");          logger.log(Priority.DEBUG, "Testing a log message use a alternate form");          logger.debug("2End of the main()");      }  }  

4.在java的web项目中初始化Logger,这样在项目中就不用每次加载,只要在需要用到的类中生成logger对象。

  a.配置web.xml文件

    

[html] view plain copy     <servlet>      <servlet-name>log4j-init</servlet-name>      <servlet-class>com.xmh.servlet.Log4j.Log4jInit</servlet-class>      <init-param>          <param-name>log4j-init-file</param-name>          <param-value>log4j.properties</param-value>      </init-param>      <load-on-startup>1</load-on-startup>  </servlet>  

  b.新建一个servlet,重写init方法,注意不要重写带参数的init方法,否则会有问题。

[java] view plain copy package com.xmh.servlet.Log4j;    import java.io.IOException;  import java.io.InputStream;  import java.util.Properties;    import javax.servlet.ServletConfig;  import javax.servlet.ServletException;  import javax.servlet.annotation.WebServlet;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;    import org.apache.log4j.Logger;  import org.apache.log4j.PropertyConfigurator;    /**  * Servlet implementation class Log4jInit  */  @WebServlet("/Log4jInit")  public class Log4jInit extends HttpServlet {      private static final long serialVersionUID = 1L;      /**      * @see Servlet#init(ServletConfig)      */      static Logger logger = Logger.getLogger(Log4jInit.class.getName());      public void init() throws ServletException {          System.out.println("logger初始化......");          // TODO Auto-generated method stub          //通过web.xml来动态取得配置文件          String file = getInitParameter("log4j-init-file");          System.out.println("file:"+file);          // 如果没有给出相应的配置文件,则不进行初始化          if(file != null)          {              System.out.println("----------start init------------------");              PropertyConfigurator.configure("/" + file);              logger.error("Start of the main() in TestLog4j");          }else{              System.out.println("===========没有初始化配置文件!==============");          }      }  }  

5.遇到的问题:

在自学的过程中,肯定会遇到一些问题,有些人不重视,可能这才是我们真正需要学习的。

像log4的用法,在网上也有很多资料,很容易找到解释,但我在加载配置文件的时候就遇到了一些不理解的地方,

我开始向网上的方法一样,用的

[java] view plain copy String prefix = this.getServletContext().getRealPath("/");  

但这取到的是绝对物理路径,这样会导致部署后有可能读取错误。(我刚开始在这里就报错,如果不报错可能也不能学习到这个知识点了)

我后来又在网上找了其他方法,基本上都不行。

后来请教以前的老师,和我简单说了一下,我和大家分享一下:

"在web应用程序中,想要加载一个文件,路径直接以 / 开头,然后看看当前读取的位置,决定是回到了应用名之前,还是应用名之后。在拼凑一个目标文件的位置就行了。不要读取getRealPath这样的绝对物理路径,这样会导致部署后有可能读取错误。

注意的地方,就是把配置文件要放在src里面,保证部署的时候能够部署到服务器中,然后看读取文件的servlet的位置和要读取的文件之间的路径相差多远,想办法从当前位置出发凑一个能到达目标文件的路径,然后读取试试看。总之避免读取绝对路径。"     总之,遇到问题,解决问题,才能学的更多。
转载请注明原文地址: https://www.6miu.com/read-12249.html

最新回复(0)