项目中日志的配置及使用模板

本文介绍了项目中日志的配置,包括配置文件模板,如何在代码中引入和使用日志,以及如何通过Spring的XML配置进行AOP日志设置。
摘要由CSDN通过智能技术生成

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;
    }

}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值