CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /์ž๋ฐ” ๋กœ๊น…
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

์ž๋ฐ” ๋กœ๊น…

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•! ๊ฐ•์˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ ์ž‘์—…์—์„œ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ํŠน์ • ์ฃผ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํŠนํžˆ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋“ค์–ด๋ณด์„ธ์š”! ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃฐ ์ฃผ์ œ๋Š” ์ฑ„์šฉ ์ฒซ๋‚ ๋ถ€ํ„ฐ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Java ๋กœ๊น…์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ๋Š” ์ „ํ˜€ ๋ณต์žกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์‰ฝ๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ์ฒซ ์ง์žฅ์—์„œ ๊ฐ•์กฐํ•  ๋ป”ํ•œ ๋‚ด์šฉ์€ ์ถฉ๋ถ„ํžˆ ์žˆ์„ ํ…Œ๋‹ˆ ์ง€๊ธˆ ๋‹น์žฅ ์ฒ ์ €ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค :) ์ž, ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Java ๋กœ๊ทธ์ธ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋กœ๊น…์€ ํ”„๋กœ๊ทธ๋žจ ์ž‘๋™์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์žฅ์†Œ๋ฅผ "๋กœ๊ทธ"๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์ฆ‰์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์— ๊ธฐ๋ก๋ฉ๋‹ˆ๊นŒ? "where"๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์œ„์น˜์—์„œ ํ”„๋กœ๊ทธ๋žจ ์ž‘์—…์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต๋ถ€ํ•˜๋Š” ๋™์•ˆ System.out.println()์ฝ˜์†”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•์‹์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๋กœ๊น…์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๋‚˜ ์ œํ’ˆ ์ง€์› ํŒ€์—๊ฒŒ ๊ทธ๋‹ค์ง€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๋“ค์€ IDE๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ฝ˜์†”์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :) ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ๋” ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์ธ ํ…์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๊ฐ„์€ ์ด ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํŽธํ•˜๊ณ  ํ™•์‹คํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค! ์ด์ œ ๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ: ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ „์ ์œผ๋กœ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค! Java์˜ ๋กœ๊น… ์‹œ์Šคํ…œ์€ ๋งค์šฐ ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ๊ธฐ๋กํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ ์ด๊ฒƒ์€ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋ฉด์— Facebook์ด๋‚˜ Twitter์˜ ๋กœ๊ทธ์— ๋ชจ๋“  ๋‚ด์šฉ์„ ๊ธฐ๋กํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ํฐ ๋กœ๊ทธ๊ฐ€ ๋ ์ง€ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ด๋Ÿฌํ•œ ๋Œ€๊ธฐ์—…์€ ์•„๋งˆ๋„ ๊ทธ ์ •๋„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 500GB์˜ ํ…์ŠคํŠธ ๋กœ๊ทธ์—์„œ ํ•˜๋‚˜์˜ ์ค‘๋Œ€ํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ์ง€ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€ ๊ฑด์ดˆ ๋”๋ฏธ์—์„œ ๋ฐ”๋Š˜์„ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Java๋Š” ์˜ค๋ฅ˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ธฐ๋กํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค! ์ฆ‰, Java์˜ ๊ธฐ๋ณธ ๋กœ๊น… ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด ๊ธฐ๋Šฅ์ด ์–ธ์–ด์— ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— ๋กœ๊น…์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. Java๊ฐ€ ์ž์ฒด ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ–ˆ์„ ๋•Œ ๋ชจ๋‘๊ฐ€ ์ด๋ฏธ log4j ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Java ๋กœ๊ทธ์ธ์˜ ์—ญ์‚ฌ๋Š” ์‹ค์ œ๋กœ ๋งค์šฐ ๊ธธ๊ณ  ์œ ์ตํ•ฉ๋‹ˆ๋‹ค. ์š”์ปจ๋Œ€ Java์—๋Š” ์ž์ฒด ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :) ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ 12๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ถ”์ƒ SLF4J ํ”„๋ ˆ์ž„์›Œํฌ("Service Logging Facade For Java")๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. SLF4J ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” log4j, ํ‘œ์ค€ java.util.logging ๋“ฑ ์ด์ „์˜ ๋ชจ๋“  ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ถ”์ƒํ™”๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์—†๋Š” Log4j์˜ ํŠน์ • ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด SLF4J๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Log4j ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Œ์ด ๋ฐ”๋€Œ์–ด Log4j ๊ธฐ๋Šฅ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ "์—ฌ๊ธฐ ์— Log4j ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๋‹ค์Œ์œผ๋กœ ์•„์นด์ด๋ธŒ์˜ ์••์ถ•์„ ํ’€๊ณ  IntelliJ IDEA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— JAR ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ํ•ญ๋ชฉ: ํŒŒ์ผ -> ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ -> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š”ํ•œ JAR ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๋‹ค์šด๋กœ๋“œํ•œ ์•„์นด์ด๋ธŒ์—๋Š” ๋งŽ์€ JAR ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋ณด๋ ค๋ฉด ๊ทธ๋ฆผ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.) ํ•ด๋‹น ํ•™์ƒ์„ ์œ„ํ•œ ์ด ์ง€์นจ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค ๋กœ๊น…์ด ํ•„์š”ํ•œ ์ด์œ  - 2๋กœ๊น…์ด ํ•„์š”ํ•œ ์ด์œ  - 3. Maven ์‚ฌ์šฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ. Maven์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด Maven์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ข‹์Šต๋‹ˆ๋‹ค(ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค). Maven ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
์—„์ฒญ๋‚œ! ์šฐ๋ฆฌ๋Š” ์„ค์ •์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค :) SLF4J๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ด…์‹œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ž‘์—…์ด ์–ด๋”˜๊ฐ€์— ๊ธฐ๋ก๋˜๋„๋ก ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” logger์™€ appender๋ผ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋กœ๊ฑฐ๋Š” ๋กœ๊น…์„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ๋กœ๊ฑฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ •์  LoggerFactory.getLogger() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์ž‘์—…์ด ๊ธฐ๋ก๋  ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๋ด…์‹œ๋‹ค:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
์ฝ˜์†” ์ถœ๋ ฅ:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋จผ์ € ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ œ ํ•„์š”ํ•œ ์„ค์ •์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ €ํฌ ๋กœ๊ฑฐ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(ERROR)๋งŒ ์ฝ˜์†”์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. logger.info () ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ logger.error() ๊ฐ€ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค! ์ฝ˜์†”์—์„œ ํ˜„์žฌ ๋‚ ์งœ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฐฉ๋ฒ•( main), "ERROR"๋ผ๋Š” ๋‹จ์–ด, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ๋ฉ”์‹œ์ง€! ERROR๋Š” ๋กœ๊น… ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๊ทธ ํ•ญ๋ชฉ์— "ERROR"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์ด ์ง€์ ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์— "INFO"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ‘œ์‹œ๋œ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€๋Š” ๋‹จ์ˆœํžˆ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์ƒ ์ž‘๋™์— ๋Œ€ํ•œ ํ˜„์žฌ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. SLF4J ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋กœ๊น…์„ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋กœ๊น… ์ˆ˜์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“  ๋กœ์ง์ด ์ด๋ฏธ Java Logger ํด๋ž˜์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ผ์ƒ์ ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•˜๋ ค๋ฉด logger.info() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ๊ฒฝ์šฐ logger.error() ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค . ๊ฒฝ๊ณ ์˜ ๊ฒฝ์šฐ logger.warn()์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด์ œ appender์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด ๋ด…์‹œ๋‹ค.

Appender๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฉด์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋ฐ˜๋Œ€, ์ฆ‰ "B ์ง€์ "์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜ˆ์ œ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ตฌ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ์ฝ˜์†”์— ํ‘œ์‹œ๋˜๊ณ  Log4j ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋กœ๊ฑฐ๋Š” ERROR ์ˆ˜์ค€ ๋ฉ”์‹œ์ง€๋งŒ ์ฝ˜์†”์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์‚ฌ๋žŒ๋“ค์ด ํ…์ŠคํŠธ ํŒŒ์ผ์—์„œ ๋กœ๊ทธ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ฑฐ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํŒŒ์ผ ์ถ”๊ฐ€์ž๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋ ค๋ฉด src ํด๋”์— ์ง์ ‘ log4j.xml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๋ฏธ XML ํ˜•์‹์— ์ต์ˆ™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์šฐ๋ฆฌ๋Š” ์ตœ๊ทผ์— ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ตํ›ˆ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค :) ๋‹ค์Œ์€ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
ํŠน๋ณ„ํžˆ ํŠน๋ณ„ํ•˜๊ฑฐ๋‚˜ ์–ด๋ ค์šด ๋‚ด์šฉ์€ ์—†์Šต๋‹ˆ๋‹ค :) ๊ทธ๋ž˜๋„ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
<Configuration status="INFO">
์ด๊ฒƒ์€ ์†Œ์œ„ StatusLogger์ž…๋‹ˆ๋‹ค. ๋กœ๊ฑฐ์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ Log4j์˜ ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. status="INFO" ๋Œ€์‹  status="TRACE"๋ฅผ ์„ค์ •ํ•˜๋ฉด Log4j์˜ ๋‚ด๋ถ€ ์ž‘์—…์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ฝ˜์†”์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(StatusLogger๋Š” ์–ดํŽœ๋”๊ฐ€ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ์—๋„ ์ฝ˜์†”์— ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค). ์ง€๊ธˆ์€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” appender๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. <File> ํƒœ๊ทธ ๋Š” ํŒŒ์ผ ์ถ”๊ฐ€์ž๊ฐ€ ๋  ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. name="MyFileAppender"๋Š” ์–ดํŽœ๋”์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. fileName="C:\Users\Username\Desktop\testlog.txt"๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ก๋  ๋กœ๊ทธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. append="true"๋Š” ํŒŒ์ผ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ ํŒŒ์ผ์˜ ์ด์ „ ๋‚ด์šฉ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. <PatternLayout ํŒจํ„ด="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5๋ ˆ๋ฒจ %logger{36} - %msg%n"/>์„œ์‹ ์„ค์ •์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์—์„œ ํ…์ŠคํŠธ ํ˜•์‹์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
์—ฌ๊ธฐ์„œ๋Š” ๋ฃจํŠธ ์ˆ˜์ค€์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. "INFO" ์ˆ˜์ค€์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, INFO๋ณด๋‹ค ๋†’์€ ์ˆ˜์ค€์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€(์œ„์—์„œ ์‚ดํŽด๋ณธ ํ‘œ์— ๋”ฐ๋ผ)๋Š” ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—๋Š” 3๊ฐœ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ํ•˜๋‚˜๋Š” INFO, ํ•˜๋‚˜๋Š” WARN, ํ•˜๋‚˜๋Š” ERROR์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌ์„ฑ์—์„œ๋Š” 3๊ฐœ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ชจ๋‘ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์ˆ˜์ค€์„ ERROR๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด LOGGER.error() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€๋งŒ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ appender์— ๋Œ€ํ•œ ์ฐธ์กฐ๋„ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด <Root> ํƒœ๊ทธ ์•ˆ์— <ApprenderRef> ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑ ํ•˜๊ณ  ref='your appender's name' ์†์„ฑ์„ ์ถ”๊ฐ€ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ์—ฌ๊ธฐ์—์„œ ์ถ”๊ฐ€์ž์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. <. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
๋ฌผ๋ก  ์•ฝ๊ฐ„ ์—‰๋šฑํ•˜์ง€๋งŒ(RuntimeException์„ ํฌ์ฐฉํ•˜๋Š” ๊ฒƒ์€ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค), ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์—๋Š” ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค :) main() ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์†์œผ๋กœ 4๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  testlog.txt ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค! :) ์ด์ œ ๊ตฌ์„ฑ๋œ ๋กœ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์„œ๋“œ์— ๋กœ๊ฑฐ ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด์ „ ํ”„๋กœ๊ทธ๋žจ ์ค‘ ์ผ๋ถ€๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฐ๊ณผ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค :) ๊นŠ์ด ๋กœ๊ทธ์ธ ์ฃผ์ œ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์•‰์€ ์ž๋ฆฌ์—์„œ ๋‹ค ์ฝ๊ธฐ๋Š” ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์œ ์šฉํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ๋งŽ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด testlog.txt ํŒŒ์ผ์ด ํŠน์ • ํฌ๊ธฐ์— ๋„๋‹ฌํ•˜๋ฉด ์ƒˆ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋„๋ก ๋กœ๊ฑฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. :) ์ด๊ฒƒ์œผ๋กœ ์ˆ˜์—…์„ ๋งˆ์นฉ๋‹ˆ๋‹ค! ์˜ค๋Š˜ ๋‹น์‹ ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ์ฃผ์ œ์— ์ต์ˆ™ํ•ด์กŒ๊ณ  ์ด ์ง€์‹์€ ๋‹น์‹ ์˜ ๋ฏธ๋ž˜ ์ž‘์—…์— ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์‹œ๊ฐ„๊นŒ์ง€! :)
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION