안녕하세요, 선생님! log.info/log.warn 과 주석의 사용에 대해 선생님의 실무적 견해, 고견을 여쭤보고자 질문 드리게 되었습니다. 질문 내용은 아래와 같습니다. 만약 오픈소스나 실무에서 상세한 명세나 설명을 해야 한다면 log info, warn 및 주석 중에 어떤 것을 먼저 생각하는 것이 좋을지 프레임워크의 예시처럼 일단 모두 주석으로 작성하고, 특징적인 부분(?)만 log로 보여주는 것이 좋을지 7강과 8강 log level 관련한 내용을 들었는데, 제가 이해한 내용이 맞으면 선생님께서 log info의 경우 운영환경에서 기본적으로 사용하는 로그, 주요 흐름을 기억하기 위해 사용 log warn의 경우 현재는 문제가 안되지만 트래픽 규모가 늘어나는 등 이후에 응답시간 지연 및 오류 발생 등의 중대한 상황을 유발할 수 있을때 활용 가능 즉각적인 조치는 아니지만 이후 요구사항이 추가적으로 나타날 수 있기에 확장 가능성/보완이 필요할 경우 활용 가능 으로 이해하였습니다. 이 부분을 듣고 Spring Batch나 Tomcat 등의 프레임워크(라이브러리에 등록된 로직)에서 제공하는 주석이 생각났습니다. 이러한 프레임워크에서는 상세 설명/명세에 대한 부분은 모두 log.info/warn보다는 주석으로 처리하였던 부분을 떠올렸는데, Spring Batch의 경우는 거의 대부분이 주석으로 상세 설명을 하였고, 물론 webMVC에서 tomcat이나 catalina를 실행하는 과정을 info로 보여주기는 했는데 핵심부분은 주석으로 모두 기재하여 보여주는 느낌이었습니다. 저의 부족한 식견일 수 있고, 말씀하신대로 팀의 정책이나 협의 과정에 의한 부분일 수 있겠지만, 추후 작은 규모의 오픈 소스 프로젝트 등을 시작할 생각도 있고, 이 강의를 기회로 실무에서 제대로 로그를 사용해보고자 하기에 선생님의 생각이 궁금하여 여쭤보고자 하였습니다. 패키지, 클래스의 상세한 설명은 주석으로 보여주고, 파라미터 등의 특징적인 부분(구체적으로 무엇을 log로 처리하는 것이 좋을지 몰라서 "특징적인 부분"으로 기재)만 보여지도록 log로 처리하면 될지 선생님의 고견을 참고해보고자 합니다! 감사합니다.
안녕하세요, 좋은 강의 주셔서 감사합니다. kibana 9.2.4 버전을 사용중이며, logstash 중앙화 pipleline을 어떻게 해야하는 지 알 수 있을까요? 다른 영상에서는 managemnet에서 Ingest Pipelines 랑 logstash Pipelines 가 있던데 제가 사용하는 버전에서는 없는것 같아서요.. 감사합니다. 좋은 강의 감사합니다.
먼저 gpt를 통해 elk 스택을 설치했습니다. discover를 클릭하니 아래의 이미지와 맞지 않은 결과가 나오는데.. 상위버전이나 혹은 하위버전처럼 나오는경우 어떻게하면 좋을까요? http://localhost:5601/app/management/kibana/indexPatterns/ 으로 이동하게되는데.. create dataview는 어떤 경로로 나올수있을까요? 아래의 docker정보는 실제 제가 설치한 정보입니다. Index patterns이 나옵니다.
아래와 같은 양식으로 질문을 남겨주세요 🙂 수업을 들으시면 이해하기 어려운 부분이 있으면 상세히 질문을 남겨주세요. 서로 Tone and Manner 를 지키며, 즐거운 수업 시간을 만들어보아요. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 pdf가 없는거 같은데 따로 제공해주시지는 않나요? 강의 들을 때 있으면 더 도움될거 같아서 질문드립니다
강의 내용에서 사용자 요청, 응답에 관한 부분은 trace로그로 보관한다고 들었습니다. 또한 로그 레벨을 나누는 이유가 보기 편하라는 이유를 들었는데요 보통 개발환경에서 로그레벨을 파일별로 나누나요? app-trace.log app-info.log app-error.log 이런식으로 나누고 trace로그를 7일만 보관할 경우 app-trace.log가 7일이 지나면 삭제한다는 방식으로 파일을 나눠서 보관하는지 궁금합니다. 추가로, 다른 질문에 app.log, security.log 이런식으로 파일을 분할하지만 강사님 기준 법적 기준 로그 제외 파일을 하나로 묶는게 좋다고 추천하셨는데요 그럼 trace로그도 하나로 묶어서 보관하는지, 묶는경우 삭제가 안되니까 나눠서 보관하는지요?
선생님의 코드와 100% 똑같이 하고 1_weather.py를 실행했는데 맑음, 구름많음과 같은 <data>들은 안뜹니다.. 그냥 홈페이지에 대한 html 코드만 나와요 홈페이지에 직접들어가보면 다음과 같은 내용이 표시됩니다.. 업데이트가 필요할 듯 합니다. ※ 날씨누리에 접속 시 해당화면이 나타났다면 다음을 확인해주세요. - 『 www.weather.go.kr/w/ 』 로 시작되는 URL로 접속 - 기상청 날씨누리는 『 www.weather.go.kr/w/ 』 시작되는 페이지만 운영합니다.(21년 이후) - 그 외 접속 페이지는 현재 서비스 및 관리를 하지 않는 페이지 임을 알려드립니다.
안녕하세요! 강사님 강의 잘 듣고있습니다. 몇가지 궁금한게 있어서 질문드려요. 로그를 내용에 따라, Logger 분리를 하는 방법 (Access.log, app.log, security.log, error.log 등등) 도 있는 것으로 알고 있는데요. 실무 API 서버경우에도 이렇게 로그레벨 이외에 Logger 분리를 하는 방법을 많이 사용하시는지 궁금합니다. 1번과 연관된 질문으로, 복잡한 실무 ELK 환경에서는 어플리케이션 로그의 경우, 한가지 로그에 몰아서 하는 방식을 많이 사용하는지, 각각 로거로 분리하고 elasticsearch index도 분리하는 방식을 많이 사용하는지 궁금합니다.
안녕하세요, 강사님. 우선 강의 잘 듣고 있습니다! 실무에서는 어떤 식으로 로그 관리가 진행되는지 궁금합니다. 개인적으로 trace나 debug 레벨과 같은 로그도 수집을 필수적으로 하는지 궁금합니다. 보관 기간을 3~7일 정도로 짧게 해서 저장한다고 하면 어차피 금방 제거되는 로그를 수집하는 이유가 있을지 의문이 들어서요! debug 레벨 로그는 분석이 필요할 때만 그 때 그 때 심고 필요가 없어지면 지우는 게 맞을까요? 보통은 trace 레벨 로그를 더 많이 쓰는지도 궁금합니다. 감사합니다 :)
안녕하세요 강사님. 이번에 강의를 복습하면서 한가지 궁금증이 생겨서 질문을 남기게 되었습니다. 섹션 5의 로그 레벨을 기준으로 알람 설정하려면? 강의를 보면 엘라스틱 서치 로 직접 http 요청을 보낸 후 받은 응답을 기준으로 알람 설정을 하도록 설명을 해주시는데요 요즘 시각화 툴 (Ex. 그라파나) 들은 Alert 같은 기능들이 있어서, 해당 기능들을 사용하면 간단하게 노코드로도 알람 설정이 가능한 것 같던데 키바나 는 해당 기능이 따로 없는 걸까요? 그래서 엘라스틱 서치 기준으로 알람 설정 하는 방법을 알려주신 걸까요? 좋은 강의 잘 봤습니다!!
저는 컴터 사양이 꽤나 좋아서 인지? 항상 표준출력이 더 빠르더군요. 알아보니 로깅 프레임워크가 느린 이유에는 대략 이런 이유들이 있네요. 로그 출력에 여러 과정을 거침. Logger → Appender → Encoder → Layout → OutputStream 레벨 설정에 의한 필터링 로그 포맷팅 처리 분명 표준출력이 synchronized 에 의해서 멀티 스레드 환경에서 취약한건 맞으나 현재 테스트에서는 그 부분이 로깅 프레임워크의 처리 과정보다는 빨랐던 것 같습니다. 테스트 환경 변경 그래서 테스트 환경을 바꿔서 테스트 해보았습니다. 멀티스레드 환경. 스레드 10개. 각 스레드별 100000번 출력 package kr.co.shortenurlservice.log; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Slf4j public class SoutVsAsyncLoggingTest { private static final int THREAD_COUNT = 10; private static final int LOG_COUNT = 100_000; public static void main(String[] args) throws InterruptedException { // 1. System.out.println() 테스트 long sysoutTime = runTest(i -> System.out.println("[SYSOUT][" + Thread.currentThread().getName() + "] " + i) ); // 2. log.info() (AsyncAppender + Console) 테스트 long asyncLogTime = runTest(i -> log.info("[LOGGER][{}] {}", Thread.currentThread().getName(), i) ); // 결과 출력 Thread.sleep(5000); System.out.printf("System.out: %,d ms%n", sysoutTime); System.out.printf("Async log : %,d ms%n", asyncLogTime); } private static long runTest(StringConsumer task) throws InterruptedException { long start = System.currentTimeMillis(); ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); CountDownLatch latch = new CountDownLatch(THREAD_COUNT); for (int t = 0; t < THREAD_COUNT; t++) { executor.submit(() -> { for (int i = 0; i < LOG_COUNT; i++) { task.accept(i); } latch.countDown(); }); } latch.await(); executor.shutdown(); long end = System.currentTimeMillis(); return end - start; } @FunctionalInterface interface StringConsumer { void accept(int value); } } 또한 test/resources/logback.xml 설정으로 포맷을 날짜 같은것 제외하고 표준출력과 똑같이 맞춰주고 AsyncAppender 를 통해 멀티 스레드 환경에서 차별점이 있도록 비동기 Appender를 추가해줌. <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="CONSOLE"/> <queueSize>10240</queueSize> </appender> <root level="info"> <appender-ref ref="ASYNC_CONSOLE"/> </root> </configuration> 이렇게 하니까 표준출력보다 빠르더군요. 꼭 성능문제뿐 아니라 로그 관리체계 자체가 로깅 프레임워크가 넘사이기 때문에 안쓸 비교불가겠지만.. 성능적으로 보더라도 실무 환경이라면 메시지 출력 전후로 비즈니스 로직들이 있기 때문에 임계영역을 통해 스레드를 대시시키는 표준출력을 사용하는것보다는 로깅 프레임워크가 더욱 성능적으로 이점이 있을 것 같습니다.
gpt에 질문을 해도 명확한 답이 안나와서 질문드립니다. 현재 2가지 장점으로 getStackTrace를 사용한다고 이해했습니다. printStackTrace를 사용하면 콘솔 출력이므로 로그 관리가 어렵다 getStackTrace를 사용하면 속도 측면에서 이점이 있다. 속도가 조금 느리더라도 로그 관리를 위해서 getStackTrace를 사용한다고 말해야할까요? 아니면 다른 이유가 있어서 getStackTrace의 속도가 느린걸까요?
안녕하세요! 예외와 로그 강의 보던 중에 궁금한 점이 생겨 질문드립니다. 체크드 예외와 언체크드 예외 설명 과정에서, 컴파일 단계에서 발생하는 것은 예외가 아니라 문법 오류로 인한 에러라고 말씀해주셨습니다. 제가 이해하고 있는 에러 정의는 프로그램에서 복구할 수 없는 심각한 문제 입니다. 단순 문법 오류를 에러라고 이해해도되는건지 궁금하여 질문 남겨봅니다..! 감사합니다
안녕하세요 search관한 질문으로서 질문을 해도 되는지 궁금하며 질문 내용은 아래와 같습니다 질문내용 조건 => (contents=장애인 or abstract=매매대금) and etype="민사 and (jdate>2023-01-01 and jdate<2025-03-01) 인경우 search구문은 아래와 같습니다 "query": { "bool": { "must": [ { "bool": { "should": [ { "match": { "contents": { "query": "장애인" } } }, { "match": { "abstract": { "query": "매매대금", "boost": 2 } } } ] } }, { "term": { "etype": { "value": "행동" } } }, { "range": { "jdate": { "gt": "2023-01-01", "lt": "2025-03-01" } } } ] } } 1.1 조건 => (contents=장애인 or abstract=매매대금) and etype=민사 인경우으로서 jdate전체로 할경우 range부분을 삭제 시키면 가능하나 삭제를 안하고 gt와 lt 값을 어떻케 주면 되는지(즉 최대일과 최소일을 모른다는 가정하에서) 1.2 조건 => (contents=장애인 or abstract=매매대금) and (jdate>2023-01-01 and jdate<2025-03-01) etype 예에서는 행동로 했는데 행동이 아닌 전체를 할경우 이것 또한 term부문을 삭제를 하면 되는데 삭제를 안할경우 value값을 무엇을 주어야 하는지요? 1.3 1.1 및 1.2 질문을 한이유는 search 문을 여러개 만들어서 조건에 맞는 것을 사용해야 하는데 한개의 search문에서 값만 변경해서 사용할려고 합니다 이게 가능한지 궁금 하네요
맥북 M1 시리즈 사용하고 있는데, 강의에서의 docker 이미지 다운로드 및 컨테이너 실행 시 문제가 발생하고 있습니다(이미지 다운로드는 문제없으나, 컨테이너 실행시 문제 발생). 플랫폼 관련 옵션이 추가적으로 필요합니다. --platform linux/amd64 강의 자료보면 각각 Elasticsearch, Logstash 따로 작성되어 있는데 yml 하나로 제공되어도 좋을 것으로 보입니다. version: "3.8" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0 container_name: elasticsearch platform: linux/amd64 ports: - "9200:9200" environment: - discovery.type=single-node - xpack.security.enabled=false - xpack.security.http.ssl.enabled=false networks: - elastic-network logstash: image: docker.elastic.co/logstash/logstash:8.10.0 container_name: logstash platform: linux/amd64 ports: - "5044:5044" - "9600:9600" volumes: - ../logstash.conf:/usr/share/logstash/pipeline/logstash.conf # logstash.conf 경로 수정 필요 networks: - elastic-network networks: elastic-network: driver: bridge