/*
 * Copyright (c) 2003, Israfil Consulting Services
 *
 * $Id: NSLogAppender.java,v 1.1 2003/09/22 02:34:09 cgruber Exp $
 */
package org.objectstyle.woproject.log4j;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Priority;
import org.apache.log4j.spi.LoggingEvent;

import com.webobjects.foundation.NSLog;

/**
 * A log4j appender that writes to NSLog.err, NSLog.out, or NSLog.debug 
 * depending on the Level.  This is very useful for a WebOObjectsApplication
 * deployed from the JavaMonitor, since WOApplication 
 * 
 *..uthor <a href="mailto:cgruber@israfil.net">Christian Edward Gruber (Israfil Consulting Services Corporation</a>
 *..ersion $Release$
 *
 */
public class NSLogAppender extends AppenderSkeleton {
    protected boolean immediateFlush = true;

    public NSLogAppender() {
    }
    
    public NSLogAppender(Layout layout) {
        ((AppenderSkeleton)this).setLayout(layout);
    }
	/* (non-Javadoc)
	 *..ee org.apache.log4j.AppenderSkeleton#append(org.apache.log4j.spi.LoggingEvent)
	 */
	public void append(LoggingEvent event) {
        Priority level = event.level;
        NSLog.Logger logger = null;
		if (level.isGreaterOrEqual(Level.WARN)){
            logger = NSLog.err;
		} else if (level.equals(Level.DEBUG)) {
            logger = NSLog.debug;
		} else {
            logger = NSLog.out;
		}
        logger.appendln(super.layout.format(event));
        if (super.layout.ignoresThrowable()) {
            String s[] = event.getThrowableStrRep();
            if (s != null) {
                StringBuffer sb = new StringBuffer();
                int len = s.length;
                for (int i = 0; i < len; i++) {
                    sb.append(s[i]);
                    sb.append(Layout.LINE_SEP);
                }
                logger.appendln(sb);
            }
        }
        if (immediateFlush) logger.flush();
	}

	public boolean requiresLayout() {
		return true;
	}
 
    public void setImmediateFlush(boolean value) {
        immediateFlush = value;
    }
    
    public boolean getImmediateFlush() {
        return immediateFlush;
    }

	/** 
     * Override close and flush the queues.
	 */
	public void close() {
		NSLog.err.flush();
        NSLog.out.flush();
        NSLog.debug.flush();
	}

}

