(一).首先配置好SSH jar包
(二).在web.xml中配置监听器:
<!-- 加载log4j配置文件 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log/log4j_config.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
?(三).定义日志log4j_config.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "file:///D:\soft\log4j\log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="dailyFile" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="c:\\logs\\log.log"/> <param name="Append" value="true"/> <param name="Encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-6p%d{yyyy-MM-dd HH:mm}[%t]-%m%n"/> </layout> </appender> <logger name="org.springframework"> <level value="INFO"/> <appender-ref ref="dailyFile"/> </logger> <logger name="org.hibernate"> <level value="INFO"/> <appender-ref ref="dailyFile"/> </logger> <logger name="org.apache"> <level value="INFO"/> <appender-ref ref="dailyFile"/> </logger> <logger name="com.opensymphony"> <level value="INFO"/> <appender-ref ref="dailyFile"/> </logger> <logger name="com.mchange"> <level value="INFO"/> <appender-ref ref="dailyFile"/> </logger> <root> <priority value="INFO"/> <appender-ref ref="dailyFile"/> </root> </log4j:configuration>
?(四).日志输出到C:\logs\log.log文件中
?(五).有可能加载log4j.dtd文件
?(六).配置logAdvice.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <bean id="logAfter" class="com.newsicom.jxc.common.aop.log.LogAfterAdvice" /> <bean id="logBefore" class="com.newsicom.jxc.common.aop.log.LogBeforeAdvice" /> <bean id="logThrow" class="com.newsicom.jxc.common.aop.log.LogThrowAdvice" /> <aop:config> <aop:pointcut id="serviceOperation-logAfter" expression="execution(* com.newsicom.jxc.basicinfo.goodsunits.service..*.*(..))" /> <aop:advisor pointcut-ref="serviceOperation-logAfter" advice-ref="logAfter" /> </aop:config> <aop:config> <aop:pointcut id="serviceOperation-logBefore" expression="execution(* com.newsicom.jxc.basicinfo.goodsunits.service..*.*(..))"/> <aop:advisor pointcut-ref="serviceOperation-logBefore" advice-ref="logBefore" /> </aop:config> <aop:config> <aop:pointcut id="serviceOperation-logThrow" expression="execution(* com.newsicom.jxc.basicinfo.goodsunits.service..*.*(..))"/> <aop:advisor pointcut-ref="serviceOperation-logThrow" advice-ref="logThrow" /> </aop:config> </beans>
?(七).编写Advice:
LogAfterAdvice
/** * LogAfterAdvice */ package com.newsicom.jxc.common.aop.log; import java.lang.reflect.Method; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.aop.AfterReturningAdvice; public class LogAfterAdvice implements AfterReturningAdvice{ private static final Logger log=Logger.getLogger(LogAfterAdvice.class); public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { log.log(Level.INFO, target.getClass().getName()+"调用"+method.getName()+"结束,返回值:"+returnValue+"---"); } }
?? LogBeforeAdvice:
package com.newsicom.jxc.common.aop.log; import java.lang.reflect.Method; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.aop.MethodBeforeAdvice; public class LogBeforeAdvice implements MethodBeforeAdvice { private static final Logger log=Logger.getLogger(LogBeforeAdvice.class); public void before(Method method, Object[] args, Object target) throws Throwable { log.log(Level.INFO, target.getClass().getName()+"调用"+method.getName()+"开始---"); } }
?LogThrowAdvice:
?
package com.newsicom.jxc.common.aop.log; import java.lang.reflect.Method; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.aop.ThrowsAdvice; import com.newsicom.jxc.common.util.GeneralUtil; /** * @author * */ public class LogThrowAdvice implements ThrowsAdvice { private static final Logger log = Logger.getLogger(LogThrowAdvice.class); public void afterThrowing(Method method, Object[] args, Object target, Throwable throwable) { log.log(Level.ERROR, target.getClass().getName() + "调用" + method.getName() + "时有异常抛出:" + GeneralUtil.getTrace(throwable) + "---"); } }
?(八).在applicationContext.xml中添加logAdvice.xml
<!-- Aop日志追踪 --> <aop:aspectj-autoproxy proxy-target-class="true" /> <import resource="classpath:config/log/logAdvice.xml" />
? (九).辅助类:
package com.newsicom.jxc.common.constant; public final class CommonConstant { public final static String EMPTY_STRING = ""; }?
/* * @(#)GeneralUtil.java 1.0.0 2011/06/15 * * Copyright 2011 uniebiz.com. All rights reserved. * UNIEBIZ PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.newsicom.jxc.common.util; import java.io.PrintWriter; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.UUID; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringEscapeUtils; import com.newsicom.jxc.common.constant.CommonConstant; import com.opensymphony.xwork2.ActionContext; public class GeneralUtil { public static final String createGuid() { UUID uuid = UUID.randomUUID(); return uuid.toString().replaceAll("-", ""); } public static final boolean strIsNullOrEmpty(String str) { boolean isNullOrEmpty = (str == null || str .equals(CommonConstant.EMPTY_STRING)); return isNullOrEmpty; } public static final String getCookieByName(HttpServletRequest request, String name) { String returnvalue = null; Cookie[] cookies = request.getCookies(); if (null != cookies) { for (Cookie cookie : cookies) { if (cookie.getName().equals(name)) { returnvalue = cookie.getValue(); break; } } } return returnvalue; } public static final String dateFormat(String format, Date date) { SimpleDateFormat df = new SimpleDateFormat(format); return df.format(date); } public static final String HTMLEncode(String str) { return StringEscapeUtils.escapeHtml(str); } public static final String HTMLDecode(String str) { return StringEscapeUtils.unescapeHtml(str); } public static String[] getDateStr(Calendar calendar) { String tem[] = new String[5]; int mondayValue = calendar.get(Calendar.MONDAY) + 1; String month = "0" + mondayValue; tem[0] = calendar.get(Calendar.YEAR) + month.substring(month.length() - 2); // 遍历四次 获得本月前四个月的字符串 for (int i = 1; i < 5; i++) { calendar.add(Calendar.MONTH, -1); mondayValue = calendar.get(Calendar.MONDAY) + 1; month = "0" + mondayValue; tem[i] = calendar.get(Calendar.YEAR) + month.substring(month.length() - 2);// } return tem; } /** * * 方法名:<code>getBetweenDate</code></br> 功能描述??根据给定的Calendar * 获得当前日期??个月前的1????0??0??0的日期放到日期数组中 * * @param calendar * 给定的Calender * @return 日期 Date数组 */ public static Date[] getBetweenDate(Calendar calendar) { Date[] dateTem = new Date[2]; dateTem[0] = calendar.getTime(); calendar.add(Calendar.MONTH, -4); calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR)); calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH)); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); dateTem[1] = calendar.getTime(); return dateTem; } /** * * 方法名:<code>getCycleDate</code></br> * 功能描述:消费周?? * * * @return 消费周期 */ public static String getCycleDate() { String strDate=""; Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd"); strDate =sdf.format(calendar.getTime()); calendar.set(Calendar.DAY_OF_MONTH,1); strDate =sdf.format(calendar.getTime()) + " ~ " + strDate; return strDate; } /** * * 方法名:<code>setLocaleLanguage</code></br> * 功能描述?? * 设置国际化语?? * * @param ac * @param type */ public static void setLocaleLanguage(ActionContext ac, String type) { Locale l = Locale.getDefault(); // 中文 if ("zh_CN".equals(type)) { l = Locale.CHINESE; } else if ("en_US".equals(type)) { // 英文 l = Locale.US; } // 设置语言 ac.setLocale(l); } /** * * 方法名:<code>getTrace</code></br> * 功能描述?? * 获取异常堆栈信息?? * * @param t 抛出的异常?? * @return 异常堆栈字符串?? */ public static String getTrace(Throwable t) { StringWriter sw = new StringWriter(); PrintWriter writer = new PrintWriter(sw); t.printStackTrace(writer); StringBuffer buffer = sw.getBuffer(); return buffer.toString(); } }
?
?