springmvc+logback项目日志配置

	最近在做项目的时候用到logback作为项目日志,而抛弃了log4j。具体为什么用logback,我总结了以下几点:
1.log4j和logback的创作者是同一个人,logback是log4j的升级版,是对log4j核心的一个封装。
2.性能提升,在某些特定场景上执行速度提升10倍以上,同时初始化内存更小
3.扩展文档,丰富的并且详细的文档和不断的更新,可在官网上查看
4.Filters(过滤器),过滤器的使用又是logback的一大特色,在使用log4j的时候,当我们遇到问题时,我们需要降低日志等级,但这时又会有大量的日志输出。但logback可以根据用户设定不同的日志级别,比如一个用户的日志级别时debug,其他的用户可以时error,这里要了解MDCFilter
5.日志自动清除和日志自动压缩,自动清除通过设置TimeBasedRollingPolicy 或者 SizeAndTimeBasedFNATP的 maxHistory 属性,自动压缩RollingFileAppender可以在回滚操作中,自动压缩归档日志文件,回滚是异步的
6.自动载入配置文件,Logback-classic可以在配置文件被修改后,自动重新载入

上面做的是理论的介绍,现在我们就通过具体的实例来使用logback框架
1.配置maven依赖


      ch.qos.logback
      logback-core
      1.1.5
    
    
      ch.qos.logback
      logback-classic
      1.1.5
    
    
    
      org.logback-extensions
      logback-ext-spring
      0.1.3
      
        
          ch.qos.logback
          logback-classic
        
      
    
    
      org.slf4j
      slf4j-api
      1.7.5
    
    
    
      org.slf4j
      slf4j-simple
      1.7.5
    

注意事项:配置了logback的jar包后,一定不要再配置log4j的jar包,因为这样会发生冲突,有可能导致输出的日志文件中没有内容,如果其他的jar包中包含的有log4j的jar包我们要exclusion,比如我们引入的shiro依赖

 
      org.apache.shiro
      shiro-core
      
        
          org.slf4j
          slf4j-api
        
      
      1.2.2
    

2.配置文件
首先在web.xml中配置,用于加载logback.xml和过滤

 
        log4jConfigLocation
        classpath:logback.xml
    
    
        ch.qos.logback.ext.spring.web.LogbackConfigListener
    

注意:一定要有listener,要不logback不生效,还有logback一定要放在rescore文件夹下,要是放在webapp下会加载不到
springmvc+logback项目日志配置_第1张图片

3.配置logback.xml



    
    logback
    
    

    
    
    
    
        
            
            %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger:%-3L) - %cyan(%msg%n)
        
    

    
        
         ${CONSOLE_LOG_PATH}/neoinfo.log
        
            
            INFO
            
            DENY
            
            ACCEPT
        
        
            ${CONSOLE_LOG_PATTERN}
            UTF-8
        
        true
        false
        
        
            
            
                ${CONSOLE_LOG_PATH}/neoinfo.%d.log
            
            
            15
            10GB
        
    

    
        
         ${CONSOLE_LOG_PATH}/neoinfo_error.log
        
        
            
            ERROR
        

        
            ${CONSOLE_LOG_PATTERN}
            UTF-8
        
        false
        false
        
        
            
            
                ${CONSOLE_LOG_PATH}/neoinfo_error.%d.log
            
            
            15
            10GB
        
    
    
    
    
    
        
        
        
    



4.配置aop类

package com.aop;


import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.UUID;


/**
 * 日志输出
 * */
@Aspect
@Component
public class LogAspect {
	private static Logger log = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping) || @annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping)")
	public void webLogs() {
	}
	@Before("webLogs()")
	public void doBefore(JoinPoint joinPoint)  {
		// 接收到请求,记录请求内容
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();
		// 记录下请求内容
		log.info("DATE:"+new Date());
		log.info("URL : " + request.getRequestURL().toString());
		log.info("HTTP_METHOD : " + request.getMethod());
		log.info("IP : " + request.getRemoteAddr());
		log.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
		Enumeration enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			String name = (String) enu.nextElement();
			log.info("name:{" + name + "},value:{" + request.getParameter(name) + "}");
		}
	}

	@AfterReturning(returning = "ret", pointcut = "webLogs()")
	public void doAfterReturning(JoinPoint joinPoint, Object ret) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		mapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
		try {
			if (log.isDebugEnabled()) {
				log.debug("returnValue={}", mapper.writeValueAsString(ret));
			}
		} catch (Exception ex) {
			log.error("拦截器异常", ex);
		}
	}
}

你可能感兴趣的:(springMvc,日志)