1.日志的配置文件--classpath下 模板如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 这个是配置全局项目日志,上线初期阶段:为了看系统运行状况Threshold设置info或debug,当系统运行一段时间后,稳定了Threshold设置warn或error,提高日志级别,减少日志输出量 -->
<appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${catalina.base}/logs/flash-info.log" />
<param name="threshold" value="info" />
<param name="encoding" value="UTF-8" />
<param name="append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%n%-4r [%d{yyyy-MM-dd HH:mm:ss}] %p [%t] %c | %m%n" />
</layout>
</appender>
<appender name="ERROR" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${catalina.base}/logs/flash-error.log" />
<param name="threshold" value="error" />
<param name="encoding" value="UTF-8" />
<param name="append" value="false" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%n%-4r [%d{yyyy-MM-dd HH:mm:ss}] %p [%t] %c | %m%n" />
</layout>
</appender>
<!-- name:debug -->
<appender name="debug" class="org.apache.log4j.DailyRollingFileAppender">
<!-- File: 日志文件存放路径 -->
<param name="File" value="${catalina.base}/logs/debug/debug.log" />
<!-- Append: 追加模式 -->
<param name="Append" value="true" />
<!-- Threshold: 打印日志级别 debug、info、warn、error -->
<param name="Threshold" value="info" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="encoding" value="UTF-8" />
<!-- DatePattern: 日志分割 错误日志以小时来分割 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%t] %c | %m%n" />
</layout>
</appender>
<appender name="sqlLogger" class="org.apache.log4j.DailyRollingFileAppender">
<!-- File: 日志文件存放路径 -->
<param name="File" value="${catalina.base}/logs/sql/sql.log" />
<param name="Append" value="true" />
<!-- Threshold设置为info级别 -->
<param name="Threshold" value="info" />
<param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
<param name="encoding" value="UTF-8" />
<!-- DatePattern: 日志分割 事件日志以小时来分割 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%t] %c | %m%n" />
</layout>
</appender>
<root>
<appender-ref ref="INFO" />
<appender-ref ref="ERROR" />
</root>
</log4j:configuration>
2.项目中的使用
引入
private static final Logger logger = LoggerFactory.getLogger(this.class);
使用
logger.info("registe consumer socialGroup");
logger.error("when update group, ", e);
3.使用spring配置/aop日志设置
1.xml配置
<!-- 扫描包 controller层 -->
<context:component-scan base-package="cn.com.mx.flash.controller" />
<!-- 开启自动织入的注解方式 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- spring加载切面类 -->
<bean class="cn.com.mx.search.core.util.SearchPlatformLogAspector" />
2.切面类的 书写(注解要被spring扫描)
@Aspect
public class SearchPlatformLogAspector {
private final Logger logger = LoggerFactory.getLogger(SearchPlatformLogAspector.class);
/**
*
* @Title:doBeforeInServiceLayer
* @Description: 方法调用前触发 记录开始时间
* @param joinPoint
*/
@Before("execution(* cn.com.mx.flash.controller..*.*(..))")
public void doBeforeInServiceLayer(JoinPoint joinPoint) {
}
/**
*
* @Title:doAfterInServiceLayer
* @Description: 方法调用后触发 记录结束时间
* @param joinPoint
*/
@After("execution(* cn.com.mx.flash.controller..*.*(..))")
public void doAfterInServiceLayer(JoinPoint joinPoint) {
}
/**
*
* @Title:doAround
* @Description: 环绕触发
* @param pjp
* @return
* @throws Throwable
*/
@Around("execution(* cn.com.mx.gome.controller..*.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
// 获取输入参数
Map<?, ?> inputParamMap = request.getParameterMap();
// 获取请求地址
String requestPath = request.getRequestURI();
// 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
Map<String, Object> outputParamMap = new HashMap<String, Object>();
Object result = pjp.proceed();// result的值就是被拦截方法的返回值
outputParamMap.put("output", result);
long endTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
logger.info("\n url={};exe_time={}ms;input={};\n output={}", requestPath, (endTimeMillis - startTimeMillis),
JSON.toJSONString(inputParamMap), processRealOutput(JSON.toJSONString(outputParamMap)));
return result;
}
/**
*
* @描述:设置输入日志的上限为1000 更多内容不在输入
* @param output
* @return
* @return String
* @exception
*/
private String processRealOutput(String output) {
if (output.length() > getOutputLength()) {
StringBuilder sb = new StringBuilder();
sb.append(output.substring(0, outputLength));
sb.append("...more ").append(output.length() - getOutputLength()).append(" chars has been omitted.");
return sb.toString();
}
return output;
}
private int outputLength = 1000;
public int getOutputLength() {
return outputLength;
}
public void setOutputLength(int outputLength) {
this.outputLength = outputLength;
}
}