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

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

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

#同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类用来测试,代码如下:

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 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文件

    

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

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值