log4j配置使用

引包:

log4j.jar 当然还有有一些依赖包commons-logging等等


web中log4j配置使用

1,src下新建配置文件sys_log4j.properties

#debug < info < warn < error < fatal
log4j.rootLogger=error,stdout,logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p [%l] %n---> %m%n
#log4j.appender.stdout.layout.ConversionPattern=- [%p](%l) ---> [%m]%d{yyyy-MMM-dd HH:mm:ss}%n


log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${webapp.root}/logs/sys.log
log4j.appender.logfile.MaxFileSize=1MB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=10
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= %n - [%p]-%d{yyyy-MMM-dd HH:mm:ss}-(%l)%n---> [%m]%n

log4j.logger.com.hl.zoneSystem_v01=error

#struts
#log4j.logger.org.apache.commons=DEBUG
#log4j.logger.org.apache.struts=DEBUG
#spring
#log4j.logger.org.springframework=DEBUG
#hibernate
#log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
#log4j.logger.org.hibernate=DEBUG

2,web.xml文件添加配置

<!-- log4j配置 放在spring的监听器之后-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/sys_log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

3,类中使用(这是我在Action类中使用的例子)

public class MainAction extends ModelAction<Talk> {
	//log4j
	public static Logger logger = Logger.getLogger(MainAction.class);
	
	/**
	 * @Title: main_loadDynamic
	 * @Description: 加载主页动态
	 * @param: @return
	 * @return: String
	 * @author: hl
	 * @time: 2014-4-13 下午12:51:15
	 * @throws
	 */
	@Action("/main_loadDynamic")
	public String main_loadDynamic(){
		logger.debug("---------main_loadDynamic--------");
		
		PageBean page = userDynamicService.UserDynamicPage(getUser().getId(), pageNum,pageSize);
		
		jsonMap.put("page", page);
		return jsonResult;
	}
}



log4j注解使用(在spring中)

做项目的时候, 看到公司框架中有一个不错的对logger的注解来简化定义, 具体用法如下:
@Logger  
private static Log log;  

当时觉得不错, 也没问他们怎么实现的, 后来网上搜了一下, 基本原理如下:
通过自定义一个BeanPostProcessor, 在对所有bean初始化之前, 对每一个bean的field进行检查, 是否适用了Logger注解, 如果有, 则调用LogFactory创建一个logger实例.

做法如下:
1.定义一个Logger注解:
/**
 * 添加一個日志注解类
 * 
 */
@Retention(RetentionPolicy.RUNTIME) //运行是编译
@Target( { ElementType.FIELD })  //修饰的字段
public @interface Logger {

}



2.创建一个BeanPostProcessor(这个是重点)
/**
 * Log4j日志注解化的应用 基本原理如下:
 *  通过自定义一个BeanPostProcessor, 在对所有bean初始化之前,
 * 对每一个bean的field进行检查, 是否适用了Logger注解, 如果有, 则调用LogFactory创建一个logger实例.
 * 
 */
public class LogBeanPostProcessor implements BeanPostProcessor {  
  
    /**
     * 初始化之后的操作
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
        return bean;  
    }  

    /**
     * 初始化之前的操作的处理
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
        List<Class<?>> clazzes = getAllClasses(bean);  
  
        for (Class<?> clazz : clazzes) {  
            initializeLog(bean, clazz);  
        }  
  
        return bean;  
    }  
  
    /** 
     * 取得指定bean的class以及所有父类的列表, 该列表排列顺序为从父类到当前类 
     * @param bean 
     * @return 
     */  
    private List<Class<?>> getAllClasses(Object bean) {  
        Class<? extends Object> clazz = bean.getClass();  
        List<Class<?>> clazzes = new ArrayList<Class<?>>();  
        while (clazz != null) {  
            clazzes.add(clazz);  
            clazz = clazz.getSuperclass();  
        }  
  
        Collections.reverse(clazzes);  
        return clazzes;  
    }  
  
    /** 
     * 对logger变量进行初始化 
     *  
     * @param bean 
     * @param clazz 
     */  
    private void initializeLog(Object bean, Class<? extends Object> clazz) {  
        Field[] fields = clazz.getDeclaredFields();  
        for (Field field : fields) {  
            if (field.getAnnotation(Logger.class) == null) {  
                continue;  
            }  
  
            if (!field.getType().isAssignableFrom(Log.class)) {  
                continue;  
            }  
  
            // 获取是否可以方法的属性
   	    boolean visable = field.isAccessible();
            try {
    	        // 设置可以属性为可以访问
	        field.setAccessible(true);
    		field.set(bean, LogFactory.getLog(clazz));
   	    } catch (Exception e) {
    		throw new BeanInitializationException(String.format(
      				"初始化logger失败!bean=%s;field=%s", bean, field));
   	    } finally {
        	// 恢复原来的访问修饰
    		field.setAccessible(visable);
   	    }
  
        }  

    }  



  
}  

3.在spring beans配置文件中加入如下配置:
<bean id="logBeanPocessor" class="cn.hl.zone.log.LogBeanPostProcessor" lazy-init="false" />  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值