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

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

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

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

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


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

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



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

  a.配置web.xml文件

    

  1.     <servlet>  
  2.     <servlet-name>log4j-init</servlet-name>  
  3.     <servlet-class>com.xmh.servlet.Log4j.Log4jInit</servlet-class>  
  4.     <init-param>  
  5.         <param-name>log4j-init-file</param-name>  
  6.         <param-value>log4j.properties</param-value>  
  7.     </init-param>  
  8.     <load-on-startup>1</load-on-startup>  
  9. </servlet>  

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

  1. package com.xmh.servlet.Log4j;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6.   
  7. import javax.servlet.ServletConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.annotation.WebServlet;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. import org.apache.log4j.Logger;  
  15. import org.apache.log4j.PropertyConfigurator;  
  16.   
  17. /** 
  18.  * Servlet implementation class Log4jInit 
  19.  */  
  20. @WebServlet("/Log4jInit")  
  21. public class Log4jInit extends HttpServlet {  
  22.     private static final long serialVersionUID = 1L;  
  23.     /** 
  24.      * @see Servlet#init(ServletConfig) 
  25.      */  
  26.     static Logger logger = Logger.getLogger(Log4jInit.class.getName());  
  27.     public void init() throws ServletException {  
  28.         System.out.println("logger初始化......");  
  29.         // TODO Auto-generated method stub  
  30.         //通过web.xml来动态取得配置文件  
  31.         String file = getInitParameter("log4j-init-file");  
  32.         System.out.println("file:"+file);  
  33.         // 如果没有给出相应的配置文件,则不进行初始化  
  34.         if(file != null)  
  35.         {  
  36.             System.out.println("----------start init------------------");  
  37.             PropertyConfigurator.configure("/" + file);  
  38.             logger.error("Start of the main() in TestLog4j");  
  39.         }else{  
  40.             System.out.println("===========没有初始化配置文件!==============");  
  41.         }  
  42.     }  
  43. }  


5.遇到的问题:

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

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

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

  1. String prefix = this.getServletContext().getRealPath("/");  

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

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

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

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

注意的地方,就是把配置文件要放在src里面,保证部署的时候能够部署到服务器中,然后看读取文件的servlet的位置和要读取的文件之间的路径相差多远,想办法从当前位置出发凑一个能到达目标文件的路径,然后读取试试看。总之避免读取绝对路径。"

    总之,遇到问题,解决问题,才能学的更多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值