Log4j on package level and how to test log entries produced by Log4j


1. Configure log4j on package level

When you want the logs for different package to be in different log files, you can configure log4j in package level.
So Log4j can be configured on package level, name the logger using the package name, note that the loggers for child packages
would write to the log files of parent packages.

e.g.

   <logger name="fred.test.log4j">
    <level value="debug"/>
    <appender-ref ref="MainProcessAppender"/>
    </logger>
    <logger name="fred.test.log4j.packageTwo">
    <level value="debug"/>
    <appender-ref ref="MonitorAppender"/>
    </logger>
    
Say logger  "fred.test.log4j" would write to main.log, logger "fred.test.log4j.packageTwo" would write to monitor.log.

then when you run this program, the second logger will write to main.log as well.


2. how to test log4j ?

1. create test appender which derives from AppenderSkeleton
2. get the same logger using "Logger.getLogger()"
3. add the test appender to the logger
4. call the target method which will get the same logger and write logs
5. get log from the appender and verify the log entries

## TargetClassTest.java

    TargetClass target;

    @Test
    public static void test() {
        final TestAppender appender = new TestAppender();
        final Logger logger = Logger.getLogger(Log4jExampleOne.class);
        logger.addAppender(appender);
        try {
            target.targetMethodWhichWriteLogs();
        }
        finally {
            logger.removeAppender(appender);
        }

        final List<LoggingEvent> log = appender.getLog();
        final LoggingEvent firstLogEntry = log.get(0);
        Assert.isTrue(firstLogEntry.getLevel() == Level.INFO);
        Assert.isTrue(firstLogEntry.getMessage().equals("Test"));
        Assert.isTrue(firstLogEntry.getLoggerName().equals("fred.test.log4j.TargetClass"));

    }


    class TestAppender extends AppenderSkeleton {
        private final List<LoggingEvent> log = new ArrayList<LoggingEvent>();

        @Override
        public boolean requiresLayout() {
            return false;
        }

        @Override
        protected void append(final LoggingEvent loggingEvent) {
            log.add(loggingEvent);
        }

        @Override
        public void close() {
        }

        public List<LoggingEvent> getLog() {
            return new ArrayList<LoggingEvent>(log);
        }
    }

    
## TargetClass.java
## package name: fred.test.log4j

    final Logger logger = Logger.getLogger(TargetClass.class);
    public void targetMethodWhichWriteLogs(){
        logger.info("Test");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值