Log4j的配置和使用

在使用CXF Webservice的IP授权校验时遇到问题,通过添加Log4j日志记录发现问题在于IP地址因路由变化。本文分享Log4j配置的详细过程,包括创建log4j.xml配置文件,以及通过Spring工具类、web.xml配置和Servlet初始化加载配置文件的三种方式。

最近用CXF Webservice写了两个接口(接口访问有IP授权校验),本地测试一点问题没有,但是部署到linux服务器上就一直说IP没有授权,一开始以为是加载ip白名单的路径有问题,定位了半天都没有解决,服务器上也不好定位,无赖之下只好加上日志把信息记录下来,最终发现是ip地址因为路由的原因发生了改变。

说起Log4j都非常熟悉,但之前都是有环境直接用,然而自己配起来发现了好多问题....

下面来分享一下遇到的问题和介绍Log4j的配置。

其实Log4j已经封装的很好了,我们要做的事情就是让它加载我们写好的log4j.xml或者log4j.properties配置文件。

首先创建一个log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">    
  	<!-- 输出日志到控制台  ConsoleAppender --> 
        <appender name="console" 
  		class="org.apache.log4j.ConsoleAppender">
  		<param name="Threshold" value="info"></param>
  		<layout class="org.apache.log4j.TTCCLayout">
  			<param name="ConversionPattern" value="TTCCLayout"></param>
  		</layout>
  	</appender>

	<!-- 输出日志到文件  每天一个文件 -->
  	<appender name="dayFile"
  		class="org.apache.log4j.DailyRollingFileAppender">
  		<param name="Threshold" value="info"></param>
  		<param name="ImmediateFlush" value="true"></param>
  		<param name="File" value="d:/logs/dayFile.log"></param>
  		<param name="DatePattern" value="'.'yyyy-MM-dd'.log'"></param>
  		<layout class="org.apache.log4j.PatternLayout">
  			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n"></param>
  		</layout>
  	</appender> 
  	
  	<!-- 输出日志到文件  文件大小到达指定尺寸的时候产生一个新的文件 -->
  	<appender name="File1" 
  		class="org.apache.log4j.RollingFileAppender">
  		<param name="File" value="d:/logs/File1.log"></param>
  		<param name="ImmediateFlush" value="true"/>
  		<param name="Threshold" value="info"></param>
  		<param name="Append" value="true"></param>
  		<param name="MaxFileSize" value="30KB"></param>
  		<param name="MaxBackupIndex" value="100"></param>
  		<layout class="org.apache.log4j.PatternLayout">
  			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n"></param>
  		</layout>
  	</appender>

  	<!-- 输出日志到文件 -->
  	<appender name="file"
  		class="org.apache.log4j.FileAppender">
  		<param name="File" value="d:/logs/file.log"></param>
  		<param name="Threshold" value="info"></param>
  		<layout class="org.apache.log4j.PatternLayout">
  			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n"></param>
  		</layout>
  	</appender>

	<!-- 
	    定义全局的日志输出级别,但是在输出目的地的配置中配置的具体输出级别优先级高于全局定义的优先级。
	    如果在railyFile中定义<param name="Threshold" value="info"></param>,那么将会把info以上级别的信息输出
	 -->
 	<root>     
		<priority value="debug" />     
		<appender-ref ref="console" />  
        <appender-ref ref="dayFile" />  
        <appender-ref ref="File1" />  
        <appender-ref ref="file" />  
 	</root>    	

</log4j:configuration> 



有几种生成日志的方式可供选择.. 有了配置文件之后就要加载,先来说一下通过spring的的工具类加载:(这种方式比较简单直接,好处是我们可以将log4j.xml配置文件放到自己想放的目录)

这里要特别强调一下,如果log4j.xml直接放在src的根目录下是不需要在web.xml中配置的,log4j会自动加载,下面的两种方式可以忽略,因为这两种方式就是针对不再src目录下的处理!(个人是比较好奇所以研究了一下)!

在web.xml加入这样的配置

	<!-- log4j 系统日志-->
	<context-param> 
	  	<param-name>log4jConfigLocation</param-name> 
	 	<param-value>/WEB-INF/classes/config/log4j.xml</param-value> 
	</context-param> 
	<listener> 
	  	<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
	</listener>

<param-name>log4jConfigLocation</param-name>注意这个是固定写法,要不然加载不到。
<param-value>/WEB-INF/classes/config/log4j.xml</param-value> 这个根据log4j.xml的路径来填写。
这种方式需要用到以下几个jar包:log4j-1.2.14.jar;commons-logging-1.1.1.jar; spring-web-3.2.6.RELEASE.jar;spring-core-3.2.6.RELEASE.jar
这样配置好了之后我们只需要在需要加入日志的类中写上
private static Logger logger = Logger.getLogger(当前类名.class);
logger.info(这里是你要记录的日志信息);


第二种方式是通过写一个sevlet在web项目启动的时候初始化加载log4j的配置文件,示例如下:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

/**
 * 
 * @author Fangtao
 * 初始化加载Log4j配置文件方法
 */
public class Log4jUtil extends HttpServlet {

	public void init() throws ServletException {
		String prefix = getServletContext().getRealPath("/");
		String file = getInitParameter("log4j");
		if (file != null) {
			// 如果配置文件是log4j.properties请使用PropertyConfigurator.configure加载
			PropertyConfigurator.configure(prefix + file);
			// 如果配置文件是log4jxml请使用DOMConfigurator.configure加载
			DOMConfigurator.configure(prefix + file);
		}
	}
}


/**
 * 对应的web.xml的配置
*/
	<servlet>  
    <servlet-name>log4j-init</servlet-name>  
    <servlet-class>com.huawei.util.Log4jUtil</servlet-class>  
    <init-param>  
        <param-name>log4j</param-name>  
        <param-value>WEB-INF/classes/config/log4j.xml</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
	</servlet>


这种方法要特别主要加载的方式,主要看你的配置文件是properties还是xml,我之前就被这个坑过,特别注意!

// 如果配置文件是log4j.properties请使用PropertyConfigurator.configure加载
PropertyConfigurator.configure(配置文件路径);

// 如果配置文件是log4jxml请使用DOMConfigurator.configure加载
DOMConfigurator.configure(配置文件路径);



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值