로거로 마이그레이션 Sensei

게시일: 2020년 11월 30일
by 앨런 리처드슨
사례 연구

로거로 마이그레이션 Sensei

게시일: 2020년 11월 30일
by 앨런 리처드슨
리소스 보기
리소스 보기

로거로 마이그레이션 Sensei

이 게시물에는 System.out.println에서 Java 로거사용으로 마이그레이션할 수 있는 레시피를 만드는 것이 설명되어 있습니다.

TDD를 사용하는 대신 코드를 해킹하고 실수를 할 때 System.out에 선을 인쇄하는 나쁜 습관이 있으며 그 습관을 벗어나고 싶었습니다.

아래 코드를 작성할 때 실수를 많이 했습니다.

   private String getCountdownString() {
        String output = "";
        String prefix="";
        for(int countdown = 10; countdown > 0; countdown-- ){
            output = output + prefix + countdown;
            System.out.println(output);
            prefix=", ";
        }
        System.out.println(output);
        return output;
    }


처음에 카운트다운++를 썼고 루프가 끝나지 않았습니다.

그리고 카운트 다운 > 1을 사용했기 때문에 원하는 출력을 얻지 못했습니다.

결국, 나는 디버깅을 돕기 위해 System.out.println으로 코드를 산재했다. 그리고 경험은 내 기본 접근 으로 로거를 사용하는 방법을 배워야한다는 것을 강화했다.

연구

다행히도, 나는 Sensei 문서화하고 System.out.println에서 변환하는 레시피를 만들고 로거를 사용하도록 권장하는 데 도움이되는 "시작하기" 가이드를 사용하기로 결정했습니다.

  • java.util.logge.Logger

레시피 만들기

내가 하는 첫 번째 일은 인쇄물을 클릭한 다음 alt+를 클릭하여 새 레시피를 만드는 것입니다.

시스템 출력 새 레시피 만들기


다음 세부 정보로 만듭니다.


이름: 로거: 인쇄대신 로거 사용
설명: println 대신 로거 사용 - System.out.println 사용을 중지해야 합니다.
수준: 오류


그리고 나는 이름 println과 방법 콜을 일치로 시작합니다


검색:
  메서드콜:
    이름: "프린트렌"

그리고 미리보기는 내 코드의 모든 일치를 보여줍니다.


레시피 설정 방법인쇄 호출


코드의 모든 일치 항목이 System.out.println용이라는 것을 알 수 있지만 장기적으로 이것이 유일한 일치가 될 것이라고는 생각하지 않습니다. 변경하려는 더 검증된 문장과 일치하고 싶습니다.

매치를 확장하여 클래스 시스템에서 명명된 필드에서 메서드콜을 검색합니다.


검색:
  메서드콜:
    이름: "프린트렌"
    "켜기":
      밭:
        안으로:
          수업:
            이름: "시스템"
        이름: "아웃"



내가 원한다면, 완전히 java.lang.System에 시스템 이름을 자격을 얻을 수 있습니다.

레시피 설정 방법콜 이름 시스템

로그할 코드 수정


다음으로 QuickFix를 만들고 싶습니다.

먼저 출력을 기록하는 코드 줄을 수정하려고 합니다.


사용 가능한 픽스:
- 이름 : "로거 사용"
  작업:
  - 다시 작성 :
      to: "logger.log(Level.INFO, {{{ arguments.0 }}})"



콧수염 템플릿 형식을 기억할 필요가 없습니다. GUI의 변수 표시를 사용하여 인수를 보여주고 두 번 클릭했습니다. 그런 다음 GUI는 적절한 일치하는 콧수염 템플릿으로 채워져 있습니다.



내가 그것을 밖으로 시도 할 때, 나는 여전히 alt +레벨 열거를 가져오기 위해 입력해야 하는 것을 볼 수 있습니다. 그러나 완전 자격을 갖춘 항목을 갖도록 QuickFix를 수정하면 Sensei 예를 들어 가져오기를 추가합니다.

  • System.out.println(출력)을 대체합니다. 와

로거.log(Level.INFO, 출력);

  • 그리고 열거에 대한 가져오기를 추가 :

자바.util.logging.level 가져오기;

  • 다음을 다시 작성하는 경우:
로거.log(java.util.logging.Level.INFO{{{인수.0}})

그리고 이것은 작동하지만, 나는 여전히 처음에 로거를 인스턴스화하기 위해 구문을 기억해야합니다.

처음에 로거를 인스턴스화하는 구문


로거 필드를 추가할 코드 수정

나는 뿐만 아니라 나를 위해 필드를 만들 내 QuickFix를 수정할 수 있습니다.

로거를 먼저 코딩한 다음 레시피에 추가하여 다시는 코딩할 필요가 없습니다.

로거 로거2 = Logger.getLogger (시스아웃테스트.class.getName());


나는 내가 제대로 얻을 수 있는지 확인하기 위해 IntelliJ 코드 완료 및 구문 검사를 사용할 수 있기 때문에 내가 먼저 생성보고 싶은 예제 코드를 작성하는 경향이있다. 부작용으로, 다음 코드 미리 보기에 있을 때 그 코드를 만들 것 이다 QuickFix 라인을 추가 하는 레시피를 편집 할 때.

예제 코드를 작성할 때 다른 필드 이름(여기 로거2를 사용하고 있음)을 사용하고 싶습니다. Sensei 중복 필드를 추가하지 않을 만큼 영리하므로 다른 이름을 사용하여 속이면 됩니다.

그래서 로거라는 필드를 추가하여이 코드를 만들 수있는 조리법을 수정합니다.

사용 가능한 픽스:

- 이름 : "로거 사용"
  작업:
  - 다시 작성 :
      to: "logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})"
  - 추가 필드 :
      field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
        \ }}.class.getName()""
      대상: "부모 클래스"


SysOutTest를 콧수염 변수로 변경하여 이 레시피를 사용하는 클래스의 이름을 선택합니다. 그리고 다시, 나는 콧수염 구문을 기억하지 않았다, 나는 내가 필요한 교체를 찾기 위해 GUI 쇼 변수를 사용했다.

로거를 자바.util.logge.logger로 완전히 예선하여, Sensei 가져오기를 추가하고 원하는 코드 줄을 작성합니다.

로거 로거 = Logger.getLogger (시스아웃테스트.class.getName());


로거를 java.util.logging.Logger로 완전히 정규화하기


이 레시피의 한 가지 유용한 점은 로거 필드를 한 번만 추가하기 때문에 'System.out.println'을 사용한 기존 코드에서 사용할 수 있다는 것입니다. Sensei 코드 파일의 모든 발생을 동시에 변경합니다.


로거를 사용하여 파일의 모든 문제 해결



다음 단계

일단 이것에 익숙해지면, 나는 결국 System.out.println을 사용하지 못하게 훈련할 것입니다.

사용할 수 있습니다 Sensei 로거를 만드는 데 도움이 되는 두 번째 레시피를 만들어 코드를 사전에 작성할 수 있도록 도와줍니다.

예를 들어 로거라는 필드가 없는 클래스에서 일치하고 추가할 수 있습니다.

레벨 정보의 레시피를 만들경우


이름: 로거: 로거 추가

설명: 클래스에 로거 추가


로거 필드가 없는 클래스에서 일치하려면 다음을 수행합니다.

검색:
  수업:
    없이:
      아이:
        밭:
          이름: "로거"


그리고 나는 우리가 이전에 본 QuickFix의 일부를 다시 사용합니다 :


사용 가능한 픽스:

  - 이름 : "로거 추가"
    작업:
      - 추가 필드 :
          field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
        \ }}.class.getName()""
          대상: "자기"


첫 번째 QuickFix와 비교하여 대상의 차이를 기록합니다. 이는 검색이 클래스와 일치했기 때문에 셀프를 사용합니다. 첫 번째 QuickFix는 클래스 자체 내에서 코드를 일치시켰기 때문에 상위 클래스를 사용합니다.

요약

이는 사용과 관련된 키 흐름 중 하나를 나타냅니다. Sensei 개인 프로그래밍 기술을 향상시키는 데 도움이 됩니다.

  • 즉각적인 '모범 사례'에 도움이 되는 레시피 만들기
  • 일단 당신이 그 모범 사례를 사용하는 방법을 알고 ... 워크플로우를 더 빠르게 만들 수 있는 레시피 만들기


---


설치할 수 있습니다. Sensei "환경 설정 \ 플러그인"(맥) 또는 "설정 \ 플러그인"(윈도우)를 사용하여 IntelliJ 내에서 다음 그냥 검색 " sensei 보안 코드".


소스 코드와 이에 대한 조리법은 ' sensei -블로그 예제의 리포지토리는 Secure Code Warrior GitHub 계정, 'pojoexamples' 모듈에서.




리소스 보기
리소스 보기

저자

앨런 리처드슨

더 알고 싶으신가요?

블로그에서 최신 보안 코딩 인사이트에 대해 자세히 알아보세요.

Atlassian의 광범위한 리소스 라이브러리는 안전한 코딩 숙련도를 확보하기 위한 인적 접근 방식을 강화하는 것을 목표로 합니다.

블로그 보기
더 알고 싶으신가요?

개발자 중심 보안에 대한 최신 연구 보기

광범위한 리소스 라이브러리에는 개발자 중심의 보안 코딩을 시작하는 데 도움이 되는 백서부터 웨비나까지 유용한 리소스가 가득합니다. 지금 살펴보세요.

리소스 허브

로거로 마이그레이션 Sensei

게시일: 2020년 11월 30일
By 앨런 리처드슨

로거로 마이그레이션 Sensei

이 게시물에는 System.out.println에서 Java 로거사용으로 마이그레이션할 수 있는 레시피를 만드는 것이 설명되어 있습니다.

TDD를 사용하는 대신 코드를 해킹하고 실수를 할 때 System.out에 선을 인쇄하는 나쁜 습관이 있으며 그 습관을 벗어나고 싶었습니다.

아래 코드를 작성할 때 실수를 많이 했습니다.

   private String getCountdownString() {
        String output = "";
        String prefix="";
        for(int countdown = 10; countdown > 0; countdown-- ){
            output = output + prefix + countdown;
            System.out.println(output);
            prefix=", ";
        }
        System.out.println(output);
        return output;
    }


처음에 카운트다운++를 썼고 루프가 끝나지 않았습니다.

그리고 카운트 다운 > 1을 사용했기 때문에 원하는 출력을 얻지 못했습니다.

결국, 나는 디버깅을 돕기 위해 System.out.println으로 코드를 산재했다. 그리고 경험은 내 기본 접근 으로 로거를 사용하는 방법을 배워야한다는 것을 강화했다.

연구

다행히도, 나는 Sensei 문서화하고 System.out.println에서 변환하는 레시피를 만들고 로거를 사용하도록 권장하는 데 도움이되는 "시작하기" 가이드를 사용하기로 결정했습니다.

  • java.util.logge.Logger

레시피 만들기

내가 하는 첫 번째 일은 인쇄물을 클릭한 다음 alt+를 클릭하여 새 레시피를 만드는 것입니다.

시스템 출력 새 레시피 만들기


다음 세부 정보로 만듭니다.


이름: 로거: 인쇄대신 로거 사용
설명: println 대신 로거 사용 - System.out.println 사용을 중지해야 합니다.
수준: 오류


그리고 나는 이름 println과 방법 콜을 일치로 시작합니다


검색:
  메서드콜:
    이름: "프린트렌"

그리고 미리보기는 내 코드의 모든 일치를 보여줍니다.


레시피 설정 방법인쇄 호출


코드의 모든 일치 항목이 System.out.println용이라는 것을 알 수 있지만 장기적으로 이것이 유일한 일치가 될 것이라고는 생각하지 않습니다. 변경하려는 더 검증된 문장과 일치하고 싶습니다.

매치를 확장하여 클래스 시스템에서 명명된 필드에서 메서드콜을 검색합니다.


검색:
  메서드콜:
    이름: "프린트렌"
    "켜기":
      밭:
        안으로:
          수업:
            이름: "시스템"
        이름: "아웃"



내가 원한다면, 완전히 java.lang.System에 시스템 이름을 자격을 얻을 수 있습니다.

레시피 설정 방법콜 이름 시스템

로그할 코드 수정


다음으로 QuickFix를 만들고 싶습니다.

먼저 출력을 기록하는 코드 줄을 수정하려고 합니다.


사용 가능한 픽스:
- 이름 : "로거 사용"
  작업:
  - 다시 작성 :
      to: "logger.log(Level.INFO, {{{ arguments.0 }}})"



콧수염 템플릿 형식을 기억할 필요가 없습니다. GUI의 변수 표시를 사용하여 인수를 보여주고 두 번 클릭했습니다. 그런 다음 GUI는 적절한 일치하는 콧수염 템플릿으로 채워져 있습니다.



내가 그것을 밖으로 시도 할 때, 나는 여전히 alt +레벨 열거를 가져오기 위해 입력해야 하는 것을 볼 수 있습니다. 그러나 완전 자격을 갖춘 항목을 갖도록 QuickFix를 수정하면 Sensei 예를 들어 가져오기를 추가합니다.

  • System.out.println(출력)을 대체합니다. 와

로거.log(Level.INFO, 출력);

  • 그리고 열거에 대한 가져오기를 추가 :

자바.util.logging.level 가져오기;

  • 다음을 다시 작성하는 경우:
로거.log(java.util.logging.Level.INFO{{{인수.0}})

그리고 이것은 작동하지만, 나는 여전히 처음에 로거를 인스턴스화하기 위해 구문을 기억해야합니다.

처음에 로거를 인스턴스화하는 구문


로거 필드를 추가할 코드 수정

나는 뿐만 아니라 나를 위해 필드를 만들 내 QuickFix를 수정할 수 있습니다.

로거를 먼저 코딩한 다음 레시피에 추가하여 다시는 코딩할 필요가 없습니다.

로거 로거2 = Logger.getLogger (시스아웃테스트.class.getName());


나는 내가 제대로 얻을 수 있는지 확인하기 위해 IntelliJ 코드 완료 및 구문 검사를 사용할 수 있기 때문에 내가 먼저 생성보고 싶은 예제 코드를 작성하는 경향이있다. 부작용으로, 다음 코드 미리 보기에 있을 때 그 코드를 만들 것 이다 QuickFix 라인을 추가 하는 레시피를 편집 할 때.

예제 코드를 작성할 때 다른 필드 이름(여기 로거2를 사용하고 있음)을 사용하고 싶습니다. Sensei 중복 필드를 추가하지 않을 만큼 영리하므로 다른 이름을 사용하여 속이면 됩니다.

그래서 로거라는 필드를 추가하여이 코드를 만들 수있는 조리법을 수정합니다.

사용 가능한 픽스:

- 이름 : "로거 사용"
  작업:
  - 다시 작성 :
      to: "logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})"
  - 추가 필드 :
      field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
        \ }}.class.getName()""
      대상: "부모 클래스"


SysOutTest를 콧수염 변수로 변경하여 이 레시피를 사용하는 클래스의 이름을 선택합니다. 그리고 다시, 나는 콧수염 구문을 기억하지 않았다, 나는 내가 필요한 교체를 찾기 위해 GUI 쇼 변수를 사용했다.

로거를 자바.util.logge.logger로 완전히 예선하여, Sensei 가져오기를 추가하고 원하는 코드 줄을 작성합니다.

로거 로거 = Logger.getLogger (시스아웃테스트.class.getName());


로거를 java.util.logging.Logger로 완전히 정규화하기


이 레시피의 한 가지 유용한 점은 로거 필드를 한 번만 추가하기 때문에 'System.out.println'을 사용한 기존 코드에서 사용할 수 있다는 것입니다. Sensei 코드 파일의 모든 발생을 동시에 변경합니다.


로거를 사용하여 파일의 모든 문제 해결



다음 단계

일단 이것에 익숙해지면, 나는 결국 System.out.println을 사용하지 못하게 훈련할 것입니다.

사용할 수 있습니다 Sensei 로거를 만드는 데 도움이 되는 두 번째 레시피를 만들어 코드를 사전에 작성할 수 있도록 도와줍니다.

예를 들어 로거라는 필드가 없는 클래스에서 일치하고 추가할 수 있습니다.

레벨 정보의 레시피를 만들경우


이름: 로거: 로거 추가

설명: 클래스에 로거 추가


로거 필드가 없는 클래스에서 일치하려면 다음을 수행합니다.

검색:
  수업:
    없이:
      아이:
        밭:
          이름: "로거"


그리고 나는 우리가 이전에 본 QuickFix의 일부를 다시 사용합니다 :


사용 가능한 픽스:

  - 이름 : "로거 추가"
    작업:
      - 추가 필드 :
          field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
        \ }}.class.getName()""
          대상: "자기"


첫 번째 QuickFix와 비교하여 대상의 차이를 기록합니다. 이는 검색이 클래스와 일치했기 때문에 셀프를 사용합니다. 첫 번째 QuickFix는 클래스 자체 내에서 코드를 일치시켰기 때문에 상위 클래스를 사용합니다.

요약

이는 사용과 관련된 키 흐름 중 하나를 나타냅니다. Sensei 개인 프로그래밍 기술을 향상시키는 데 도움이 됩니다.

  • 즉각적인 '모범 사례'에 도움이 되는 레시피 만들기
  • 일단 당신이 그 모범 사례를 사용하는 방법을 알고 ... 워크플로우를 더 빠르게 만들 수 있는 레시피 만들기


---


설치할 수 있습니다. Sensei "환경 설정 \ 플러그인"(맥) 또는 "설정 \ 플러그인"(윈도우)를 사용하여 IntelliJ 내에서 다음 그냥 검색 " sensei 보안 코드".


소스 코드와 이에 대한 조리법은 ' sensei -블로그 예제의 리포지토리는 Secure Code Warrior GitHub 계정, 'pojoexamples' 모듈에서.




우리는 당신에게 우리의 제품 및 / 또는 관련 보안 코딩 주제에 대한 정보를 보낼 수있는 귀하의 허가를 바랍니다. 우리는 항상 최대한의주의를 기울여 귀하의 개인 정보를 취급 할 것이며 마케팅 목적으로 다른 회사에 판매하지 않을 것입니다.

양식을 제출하려면 '분석' 쿠키를 활성화하세요. 완료되면 언제든지 다시 비활성화할 수 있습니다.