πŸ’» Programming

μŠ€ν”„λ§ ν”„λ‘œμ νŠΈ logback μ„€μ • 였λ₯˜ (Could not find Janino library on the class path)

μΌ€μ΄μΉ˜ 2019. 7. 24. 15:55


μŠ€ν”„λ§ ν”„λ‘œμ νŠΈμ—μ„œ logback을 μ΄μš©ν•˜μ—¬ ν™˜κ²½λ³„λ‘œ 둜그 섀정을 λ‹€λ₯΄κ²Œ ν•  λ•Œ 

<if>, <elseif> λ“±μ˜ νƒœκ·Έλ₯Ό μ΄μš©ν•  수 μžˆλŠ” 쀄 μ•Œκ³  μ•„λž˜μ²˜λŸΌ 섀정을 ν•΄λ³΄μ•˜λ‹€.

<if condition="property('myproject.profile').equals('live')">
<logger name="com.myproject" level="debug">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="org.springframework" level="WARN"/>
<root level="info"/>
</if>
<elseif condition="property('myproject.profile').equals('dev')">
<logger name="com.myproject" level="debug">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="org.springframework" level="WARN"/>
<root level="info"/>
</elseif>
<else condition="property('myproject.profile').equals('local')">
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</else>

μœ„ 처럼 μ„€μ •ν–ˆλŠ”λ° μ•± 기동 μ‹œ μ•„λž˜μ²˜λŸΌ logbackμ—μ„œ μ—λŸ¬λ‘œκ·Έλ₯Ό μ°μ—ˆλ‹€.


14:46:24,662 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]

14:46:24,668 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.

14:46:24,668 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.

14:46:24,668 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details

14:46:24,673 |-ERROR in ch.qos.logback.core.joran.conditional.IfAction - Could not find Janino library on the class path. Skipping conditional processing.

14:46:24,673 |-ERROR in ch.qos.logback.core.joran.conditional.IfAction - See also http://logback.qos.ch/codes.html#ifJanino

14:46:24,673 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@31:64 - no applicable action for [logger], current ElementPath  is [[configuration][if][logger]]

14:46:24,674 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@32:42 - no applicable action for [appender-ref], current ElementPath  is [[configuration][if][logger][appender-ref]]


원인은 λͺ…ν™•ν•΄λ³΄μ˜€λ‹€. JaninoλΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ—†μ–΄μ„œμ˜€λ‹€.

<if>, <elseif> λ“±μ˜ νƒœκ·Έλ¬Έλ²•μ„ Janino λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 해석을 ν•΄μ£ΌλŠ”λ° ν•΄λ‹Ή λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ—†μ–΄μ„œ logback μ„€μ •νŒŒμΌν•΄μ„μ„ μ œλŒ€λ‘œ λͺ»ν•œ μƒνƒœμ˜€λ‹€.

κ·Έλž˜μ„œ ν˜„μž¬μΌμž κ°€μž₯ μ΅œμ‹ λ²„μ „μœΌλ‘œ μ˜μ‘΄μ„±μ„ μΆ”κ°€ν–ˆλ‹€.

<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.14</version>
</dependency>


그런데 또 였λ₯˜κ°€ 났닀 γ… γ… 

 Failed to parse condition [property('myproject.profile').equals('live')] org.codehaus.commons.compiler.CompileException: Line 1, Column 45: Closing single quote missing

at org.codehaus.commons.compiler.CompileException: Line 1, Column 45: Closing single quote missing


쑰건으둜 μ€€κ²Œ νŒŒμ‹±μ˜€λ₯˜κ°€ 났단닀. κ·Έλž˜μ„œ μ»¨λ””μ…˜μ„ μ•„λž˜μ²˜λŸΌ λ°”κΎΈμ—ˆλ‹€.

<if condition='property("myproject.profile").equals("local")'>

μŒλ”°μ˜΄ν‘œμ™€ ν™‘λ”°μ˜΄ν‘œλ₯Ό λ°”κΎΌκ±°λ‹€.

그리고 if-else if - else λ₯Ό ν•˜κΈ°μœ„ν•΄μ„  nested ifλ₯Ό μ¨μ•Όν–ˆλ‹€.

ν•˜μ§€λ§Œ nested <if> λ₯Ό μ“°κΈ°μ—” μ•ˆμͺ½μœΌλ‘œ 인덴트 λ˜λŠ” 게 λ§Žμ•„μ Έμ„œ 가독성이 λ–¨μ–΄μ§„λ‹€.

μ–΄μ°¨ν”Ό 쑰건을 equals둜 λΉ„κ΅ν•˜κ³  μžˆμœΌλ‹ˆ 

결과적으둜 if문만 μ¨μ„œ profile값을 비ꡐ해주어도 if-elseif의 νš¨κ³ΌλŠ” λ³Ό 수 μžˆμœΌλ―€λ‘œ μ•„λž˜μ²˜λŸΌ λ°”κΏ¨λ‹€.

<if condition='property("myproject.profile").equals("live")'>
<then>
<logger name="com.myproject" level="debug">
<appender-ref ref="ELASTIC"/>
</logger>
<logger name="org.springframework" level="WARN"/>
<root level="info"/>
</then>
</if>
<if condition='property("myproject.profile").equals("dev")'>
<then>
<logger name="com.myproject" level="debug">
<appender-ref ref="ELASTIC"/>
</logger>
<logger name="org.springframework" level="WARN"/>
<root level="info"/>
</then>
</if>
<if condition='property("myproject.profile").equals("local")'>
<then>
<logger name="com.myproject" level="debug">
<appender-ref ref="STDOUT"/>
</logger>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</then>
</if>

이제 잘 λ™μž‘ν•œλ‹€.