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

来源:互联网 发布:淘宝卖家说给补偿5元 编辑:程序博客网 时间:2024/05/16 17:47

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

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

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

# 将等级为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#同stdoutlog4j.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#以下都同stdoutlog4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n


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

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的继承
//加载配置文件,建议放在src下面PropertyConfigurator.configure("<a target=_blank href="file://\\log4j.properties">\\log4j.properties</a>");
//下面是用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());
//调用另一文件的testLog()方法TestLog4 testLog4j2 = new TestLog4();testLog4j2.testLog();}}
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 blocke.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文件

    

  <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方法,否则会有问题。

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的用法,在网上也有很多资料,很容易找到解释,但我在加载配置文件的时候就遇到了一些不理解的地方,

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

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

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

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

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

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

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

    总之,遇到问题,解决问题,才能学的更多。





0 0
原创粉丝点击