사용자 도구

사이트 도구


java:logback

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:logback [2015/04/17 13:39]
kwon37xi
java:logback [2023/09/21 13:21]
kwon37xi
줄 13: 줄 13:
   * logback-access : Tomcat/Jetty 등에 설치되어 웹 요청을 로깅할 수 있다.   * logback-access : Tomcat/Jetty 등에 설치되어 웹 요청을 로깅할 수 있다.
   * [[http://audit.qos.ch/|logback-audit]] : 장시간 추적이 필요한 비지니스 애플리케이션의 이벤트 로깅   * [[http://audit.qos.ch/|logback-audit]] : 장시간 추적이 필요한 비지니스 애플리케이션의 이벤트 로깅
 +
 +===== LOGBACK-1591 취약점 이슈 =====
 +  * 가급적 logback **1.2.9** 이상 버전을 사용할 것.
 +  * [[http://mailman.qos.ch/pipermail/announce/2021/000165.html|[qos.ch-announce] Secuirty Fix - logback 1.2.9 and 1.3.0-alpha11]]
 +  * [[https://jira.qos.ch/browse/LOGBACK-1591|[LOGBACK-1591] Possibility of vulnerability - QOS.ch JIRA]]
 +  * 발생 가능성은 희박한 편임.
 +  * [[https://github.com/cn-panda/logbackRceDemo|cn-panda/logbackRceDemo: The project is a simple vulnerability Demo environment written by SpringBoot. Here, I deliberately wrote a vulnerability environment where there are arbitrary file uploads, and then use the `scan` attribute in the loghack configuration file to cooperate with the logback vulnerability to implement RCE.]]
 +  * write access to logback.xml
 +  * use of versions < 1.2.8
 +  * reloading of poisoned configuration data, which implies application restart or scan="true" set prior to attack
  
 ===== 설정 ===== ===== 설정 =====
줄 23: 줄 33:
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <pattern>▶ %-5level %d{HH:mm:ss.SSS} [%thread] %logger{36}[%method:%line- %msg%n</pattern>+            <pattern>▶ %-5level %d{HH:mm:ss.SSS} [%thread] %class{36}.%method:%line - %msg%n</pattern>
         </encoder>         </encoder>
     </appender>     </appender>
줄 99: 줄 109:
 } }
  
 +</code>
 +
 +===== Multi line to Single line =====
 +Grep 시에 여러줄로 된 로그를 올바로 grep하기 힘들 경우 multi line 을 single line으로 합쳐서 로깅하면 좀 더 편하게 로깅 가능하다.
 +
 +[[http://co-de-generation.blogspot.kr/2012/08/java-logging-in-single-line-for-grep.html|CoDeGeneration: Java: Logging in single line for grep]]
 +
 +Layout 을 다음과 같이 지정하면 새줄기호(%%\n%%)가 %%\n%% 문자 그 자체로 표시된다. 예외 Stacktrace까지 모두 한 줄로 합친다.
 +
 +XML 설정의 경우에는
 +<code>
 +%replace(%msg){"\n","\\n"} %replace(%xException){"\n", "\\n"}%nopex%n
 +</code>
 +
 +<code>
 +-- 공백으로 변환됨.
 +%replace(%msg){'[\r\n]', ''}
 +</code>
 +
 +groovy 설정으로 할 경우에는 
 +<code>
 +%replace(%msg){"\n","\\n"} %replace(%xException){"\\n", "\\\\n"}%nopex%n
 </code> </code>
  
줄 108: 줄 140:
   * [[https://github.com/Moocar/logback-gelf|logback-gelf]] 로그 수집/뷰어인 [[:logging:graylog2]] 연동 appender   * [[https://github.com/Moocar/logback-gelf|logback-gelf]] 로그 수집/뷰어인 [[:logging:graylog2]] 연동 appender
   * [[https://github.com/cosmocode/logback-xmpp|Logback XMPP]] XMPP, Jabber Appender   * [[https://github.com/cosmocode/logback-xmpp|Logback XMPP]] XMPP, Jabber Appender
 +  * [[https://github.com/danielwegener/logback-kafka-appender|logback-kafka-appender]]
   * [[https://github.com/ptgoetz/logback-kafka|logback-kafka]]   * [[https://github.com/ptgoetz/logback-kafka|logback-kafka]]
 ===== Marker ===== ===== Marker =====
줄 133: 줄 166:
 </configuration> </configuration>
 </code> </code>
 +
 +===== Filter =====
 +  * [[http://logback.qos.ch/manual/filters.html|Logback Filters]]
 +
 +==== GEventEvaluator ====
 +  * ''EventEvaluatorFilter''에서 [[:groovy|Groovy]] 로 필터 조건을 줄수 있는 Evaluator.
 +  * ''ILoggingEvent'' 객체가 ''e'' 혹은 ''event'' 변수로 전달되며 ''TRACE'',''DEBUG'',...''ERROR''도 변수로 전달된다.
 +  * ''level'' 변수는 ''toInt()''로 숫자로 변환하여 비교할 수 있다. ''e.level.toInt() >= WARN.toInt()'' 형태.
 +  * 설정 파일 파싱할 때 미리 컴파일 되므로 매번 컴파일 된다고 걱정하지 않아도 된다.
 +<code xml>
 +  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 +    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
 +      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
 +        <expression>
 +           e.level.toInt() >= WARN.toInt() &amp;&amp;  <!-- Stands for && in XML -->
 +           !(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
 +        </expression>
 +      </evaluator>
 +      <OnMismatch>DENY</OnMismatch>
 +      <OnMatch>NEUTRAL</OnMatch>
 +    </filter>
 +    <encoder>
 +      <pattern>
 +        %-4relative [%thread] %-5level %logger - %msg%n
 +      </pattern>
 +    </encoder>
 +  </appender>
 +</code>
 +
 +===== Stacktrace 에서 불필요한 스택 감추기 =====
 +<code xml>
 +<configuration>
 +    <property name="STACKTRACE_FILTER" value="
 +        불필요한 stack 문자열 나열,
 +        org.junit.platform.engine.,
 +        org.junit.platform.launcher.,
 +        org.junit.platform.commons.util.ReflectionUtils.,
 +        org.junit.jupiter.engine.,
 +        org.junit.jupiter.params.provider.,
 +        org.junit.jupiter.api.AssertThrows.,
 +        org.junit.jupiter.api.AssertDoesNotThrow.,
 +        org.assertj.core.api.AssertionsFor,
 +        org.assertj.core.api.ThrowableAssert.,
 +        org.gradle.
 +    "/>
 +
 +    <property name="CONSOLE_LOG_PATTERN"
 +              value=".... %exception{full,${STACKTRACE_FILTER}} %n"/>
 +
 +</code>
 +
 +  * 단점, ''String.contains()'' 로 검사한다.
 +  * Test 용 설정에 적용하면 좋음.
java/logback.txt · 마지막으로 수정됨: 2023/09/21 13:21 저자 kwon37xi