기능 수준 로깅을 익히는 것은 전체 소프트웨어 시스템에 대한 포괄적인 로깅을 이해하고 구현하기 위한 중요한 단계입니다. 세분화된 수준의 기능에 집중함으로써 복잡한 시스템까지 쉽게 확장할 수 있는 탄탄한 기반을 구축할 수 있습니다.
함수 로그를 작성할 때 기억해야 할 5가지 주요 사항은 다음과 같습니다.
로그 출처 지정:
디버깅을 염두에 두고 작성:
이야기 해설:
철저한 테스트 로그:
과잉 로깅 방지:
로그 문자열의 필수 요소: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!