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的位置和要读取的文件之间的路径相差多远,想办法从当前位置出发凑一个能到达目标文件的路径,然后读取试试看。总之避免读取绝对路径。" 总之,遇到问题,解决问题,才能学的更多。