>  기사  >  Java  >  기능에 대한 효과적인 로깅

기능에 대한 효과적인 로깅

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-05 14:08:02947검색

Effective Logging for Function

기능 수준 로깅을 익히는 것은 전체 소프트웨어 시스템에 대한 포괄적인 로깅을 이해하고 구현하기 위한 중요한 단계입니다. 세분화된 수준의 기능에 집중함으로써 복잡한 시스템까지 쉽게 확장할 수 있는 탄탄한 기반을 구축할 수 있습니다.

함수 로그를 작성할 때 기억해야 할 5가지 주요 사항은 다음과 같습니다.

  1. 로그 출처 지정:

    • 항상 로그의 출처를 적어두세요. 여기에는 파일이 생성된 시간, 파일 이름, 관련된 기능 및 기타 여러 세부 정보가 포함될 수 있습니다. 개발자가 특정 파일이나 기능에 집중할 수 있으므로 문제 해결 시 도움이 됩니다.
  2. 디버깅을 염두에 두고 작성:

    • 로그를 작성할 때 발생할 수 있는 잠재적인 문제를 고려하세요. 이러한 문제가 발생할 경우 이를 해결하는 데 도움이 되는 방식으로 로그를 작성해야 합니다.
  3. 이야기 해설:

    • 로그는 요점을 지키되 중요한 세부 사항을 모두 다루는 스토리여야 합니다. 각 함수에는 수신된 인수로 시작하고 반환된 데이터로 끝나는 고유한 설명이 있어야 합니다. 로그에는 실행 시간, 호출된 내부 함수, 수신된 입력 및 반환된 출력이 포함될 수 있습니다.
  4. 철저한 테스트 로그:

    • 완료 후 기능을 테스트하는 것처럼 로그도 테스트해야 합니다. 성공 사례와 실패 사례 모두에 대한 올바른 정보가 로그에 표시되는지 확인하세요. 항상 문제를 해결하려는 사람의 관점에서 로그를 살펴보세요.
  5. 과잉 로깅 방지:

    • 모든 내용을 기록할 필요는 없습니다. 민감한 정보, 특히 사용자 데이터와 관련된 정보는 생략해야 합니다. 예를 들어, 사용자의 모든 정보를 기록하는 것이 아니라, 사용자의 ID나 코드에 활용된 정보만 기록해야 합니다.

올바른 수준에서 로그하는 것을 잊지 마세요.

  • INFO - 앱 작동에 대해 중요하지 않은 세부 정보를 기록합니다.
  • 경고 - 사용자 경험에 영향을 주지 않고 잠재적인 문제를 표시합니다.
  • 오류 - 사용자 경험에 영향을 미치는 심각한 문제를 나타냅니다.
  • 치명적 - 사용자 경험에 심각한 영향을 미치는 주요 오류를 표시합니다.
  • DEBUG - 개발자를 위한 디버깅 정보를 제공합니다.

함수 로깅 모범 사례

로그 문자열의 필수 요소: Timestamp, ApplicationName, FileName, FunctionName 포함 , LEVEL 및 기타 관련 세부 정보를 통해 애플리케이션 로그의 효과를 크게 향상시킬 수 있습니다. 이러한 요소는 중요한 컨텍스트를 제공하고 특히 애플리케이션을 디버깅하거나 모니터링할 때 이벤트 흐름을 더 쉽게 추적할 수 있도록 해줍니다. 목표는 개인 정보 보호 및 보안 고려 사항을 존중하면서 유익하고 유용한 로그를 만드는 것임을 기억하세요.

메시지는 의도한 작업, 작업의 시작자, 입력 및 출력을 전달해야 합니다.

다음과 같은 구조화되지 않은 로그 항목을 고려하세요.


2019-06-20T17:21:00.002899+00:00 myApp [c.d.g.UserRequestClass]: [getUser]: DEBUG: Fetching mailing list 14777
2019-06-20T17:21:00.002899+00:00 myApp [c.d.g.UserRequestClass]: [getUser]: DEBUG: User 3654 opted out
2019-06-20T17:21:00.002899+00:00 myApp [c.d.g.UserRequestClass]: [getUser]: DEBUG: User 1334563 plays 4 of spades in game 23425656


이러한 항목을 JSON으로 구성하여 가독성과 구문 분석 용이성을 향상시켰습니다.


2019-06-20T17:21:00.002899+00:00 myApp [c.d.g.UserRequestClass]: [getUser]: DEBUG: Fetching mailing list {"listid":14777}
2019-06-20T17:21:00.002899+00:00 myApp [c.d.g.UserRequestClass]: [getUser]: DEBUG: User opted out {"userid":3654}
2019-06-20T17:21:00.002899+00:00 myApp [c.d.g.UserRequestClass]: [getUser]: DEBUG: User plays {'user':1334563, 'card':'4 of spade', 'game':23425656}


이러한 관행을 준수함으로써 로그가 유익하고 읽기 쉽고 디버깅에 가치가 있는지 확인할 수 있습니다.

코드 예제 및 모범 사례

  • 로그 일관성 및 균일성 유지: 코드를 작성하는 개발자 수에 관계없이 프로그램 전체에서 로그의 일관성을 유지하는 것이 중요합니다. 이를 통해 더 쉽게 디버깅하고, 작업 흐름을 이해하고, 코드 실행을 더 효과적으로 추적할 수 있습니다.
  • 로깅 템플릿 생성 및 동일한 로깅 패턴 사용: 전체 팀을 위한 표준 로깅 템플릿을 개발하고 팀의 모든 개발자가 동일한 로깅 패턴을 따르도록 권장합니다. 이렇게 하면 통일성이 향상되고 로그를 더 쉽게 읽고 이해할 수 있습니다.
  • 예제 함수 제공 및 참조: 코드에서 좋은 로깅 방법을 보여주는 몇 가지 예제 함수를 사용 가능하게 만듭니다. 이는 개발자에게 참고 자료가 될 수 있습니다. 개발자가 자신의 코드를 작성할 때 이러한 예제를 참조할 수 있도록 허용합니다. 이는 확립된 로깅 관행을 준수하고 일관성을 유지하는 데 도움이 됩니다.

예:


import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class UserService {

    private static final Logger logger = LogManager.getLogger(UserService.class);
    private Database database;

    public UserService(Database database) {
        this.database = database;
    }

    public int getTotalLikesInLast30Days(String userId) {
        logger.info("Request received to get all total likes in last 30 days 
                for: {userId: " + userId + "}");
        long startTime = System.nanoTime();

        try {
            logger.debug("Fetching user with id: {userId: " + userId + "}");
            User user = database.getUserById(userId);

            if (user == null || user.isDeleted() || user.isDeactivated()) {
                logger.warn("User not found or deactivated: {userId: " + userId + "}");
                return 0;
            }

            LocalDate thirtyDaysAgo = LocalDate.now().minus(30, ChronoUnit.DAYS);
            logger.debug("Fetching posts for user since: {userId: " + userId + ", 
                    since: " + thirtyDaysAgo + "}");
            List<Post> posts = database.getPostsByUserSince(user, thirtyDaysAgo);

            int totalLikes = 0;
            for (Post post : posts) {
                totalLikes += post.getLikes().size();
            }

            long endTime = System.nanoTime();
            // compute the elapsed time in nanoseconds
            long duration = (endTime - startTime);  
            logger.info("Execution time: {timeInNanoseconds: " + duration + "}");
            logger.info("Returning total likes in last 30 days for: {userId: " + 
                    userId + ", totalLikes: " + totalLikes + "}");

            return totalLikes;
        } catch (Exception e) {
            logger.error("An error occurred: {message: " + e.getMessage() + "}", e);
            return 0;
        }
    }
}



성공적인 경우 로그는 다음과 같습니다.


2024-01-07 14:00:00,001 [INFO]  UserService.java:10 [com.example.UserService] (getTotalLikesInLast30Days) : Request received to get all total likes in last 30 days for: {userId: 123}
2024-01-07 14:00:00,002 [DEBUG] UserService.java:12 [com.example.UserService] (getTotalLikesInLast30Days) : Fetching user with id: {userId: 123}
2024-01-07 14:00:00,010 [DEBUG] UserService.java:18 [com.example.UserService] (getTotalLikesInLast30Days) : Fetching posts for user since: {userId: 123, since: 2023-12-08}
2024-01-07 14:00:00,020 [INFO]  UserService.java:26 [com.example.UserService] (getTotalLikesInLast30Days) : Execution time: {timeInNanoseconds: 19000000}
2024-01-07 14:00:00,021 [INFO]  UserService.java:28 [com.example.UserService] (getTotalLikesInLast30Days) : Returning total likes in last 30 days for: {userId: 123, totalLikes: 999}


Post 테이블이 존재하지 않는 경우와 같이 예외가 발생할 때의 모습은 다음과 같습니다.


2024-01-07 14:00:00,001 [INFO]  UserService.java:10 [com.example.UserService] (getTotalLikesInLast30Days) : Request received to get all total likes in last 30 days for: {userId: 123}
2024-01-07 14:00:00,002 [DEBUG] UserService.java:12 [com.example.UserService] (getTotalLikesInLast30Days) : Fetching user with id: {userId: 123}
2024-01-07 14:00:00,010 [DEBUG] UserService.java:18 [com.example.UserService] (getTotalLikesInLast30Days) : Fetching posts for user since: {userId: 123, since: 2023-12-08}
2024-01-07 14:00:00,015 [ERROR] UserService.java:18 [com.example.UserService] (getTotalLikesInLast30Days) : An error occurred: {message: "Post table does not exist"}


Packages like log4j, slf4j, and many others can be used for better management of logs in large software programs.

Focusing on creating effective logs for each function can significantly improve the overall quality of logs for the entire software. This approach ensures that each part of the software is well-documented and can facilitate easier debugging and maintenance. Remember, a well-logged function contributes to a well-logged application.

Thank you for reading this blog. _Sayonara!

위 내용은 기능에 대한 효과적인 로깅의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.