프로젝트에log 로그를 추가할 때 코드 간소화

5830 단어 log

전언


일반적으로 controller의 모든 방법의 첫 줄에 logger.info("【**Controller】【collectionInfo】 ...");을 쓰고 방법이 끝날 때 logger.info("【**Controller】【collectionInfo】 ...");을 더하면 나중에 로그를 볼 때 편리하다. 매번 이렇게 쓰는 것도 번거롭고 코드로 실행 클래스와 방법을 직접 얻을 수 있다.

남의 집 코드


툴 클래스 보기 스레드의 이름을 개별적으로 쓰기 Logprefix
다른 사람이 쓴 원본을 보면...
public class LogPrefix {
    public static String get() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        int l = stackTrace.length;
        String className = stackTrace[l - 1].getClassName();
        className = StringUtils.substringAfterLast(className, ".");
        return String.format("【%s】【%s】", className, stackTrace[l - 1].getMethodName());
    }
}
 @RequestMapping(value = "/findByModel")
    public String  find(@RequestParam  MultipartFile files) throws  Exception{
        log.info(Logprefix.get() + "  ");
        }

//2018-08-03 12:10:14.356  INFO 6876 --- [nio-8086-exec-1] c.j.f.Service.Impl.TestFaceServiceImpl   : 【TestFaceServiceImpl】【testFace】  

그러나 [thread] [run]을 표시하기 시작했고 실행 중인 클래스 이름과 방법 이름이 표시되지 않았습니다.
직접 사용하는 방법에 String msgToPrint = Thread.currentThread().getStackTrace()[1].getMethodName();을 더하면 이 방법명을 표시할 수 있지만, 다른 사람이 쓴 코드는 마지막methodName을 취한다는 뜻으로 모든 라인 이름을 인쇄하기로 결정했습니다.
순환을 해서 가져온 라인을 인쇄했다
getStackTrace
get
testFace
testFace
invoke0
invoke
invoke
invoke
doInvoke
invokeForRequest
invokeAndHandle
invokeHandlerMethod
handleInternal
handle
doDispatch
doService
processRequest
doGet
service
service
service
internalDoFilter
doFilter
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
invoke
invoke
invoke
invoke
invoke
invoke
service
service
process
process
doRun
run
runWorker
run
run
run

이게 많네요. 그런데 진짜 필요한name가 3위예요.
package com.jxl.face.Utils;

import org.apache.commons.lang3.StringUtils;

public class Logprefix {

        public static  String get() {
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
//            int l = stackTrace.length;
//            for(int i=0;i
//                System.out.println(stackTrace[i].getMethodName());
//            }
            String className = stackTrace[2].getClas sName();//com.jxl.face.Controller.TestFaceController
            className = StringUtils.substringAfterLast(className, ".");
            return String.format("【%s】【%s】", className, stackTrace[2].getMethodName());
        }
}

아래 표시를 바꾸었는데, 과연 정상적으로 표시해야 할 유명, 방법명.
ps: 대체적인 코드는 위와 같습니다. 구체적으로 아래 표시된 위치는 테스트 코드를 보십시오. 왜냐하면 구체적인 프로젝트 구조와 관련이 있는지 모르겠습니다.

좋은 웹페이지 즐겨찾기