org.springframework.data.document.mongodb.log4j.MongoLog4jAppender.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.data.document.mongodb.log4j.MongoLog4jAppender.java

Source

/*
 * Copyright (c) 2011 by the original author(s).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.data.document.mongodb.log4j;

import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.WriteConcern;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.MDC;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;

/**
 * @author Jon Brisbin <jbrisbin@vmware.com>
 */
public class MongoLog4jAppender extends AppenderSkeleton {

    public static final String LEVEL = "level";
    public static final String NAME = "name";
    public static final String APP_ID = "applicationId";
    public static final String TIMESTAMP = "timestamp";
    public static final String PROPERTIES = "properties";
    public static final String TRACEBACK = "traceback";
    public static final String MESSAGE = "message";
    public static final String YEAR = "year";
    public static final String MONTH = "month";
    public static final String DAY = "day";
    public static final String HOUR = "hour";

    protected String host = "localhost";
    protected int port = 27017;
    protected String database = "logs";
    protected String collectionPattern = "%c";
    protected PatternLayout collectionLayout = new PatternLayout(collectionPattern);
    protected String applicationId = System.getProperty("APPLICATION_ID", null);
    protected WriteConcern warnOrHigherWriteConcern = WriteConcern.SAFE;
    protected WriteConcern infoOrLowerWriteConcern = WriteConcern.NORMAL;
    protected Mongo mongo;
    protected DB db;

    public MongoLog4jAppender() {
    }

    public MongoLog4jAppender(boolean isActive) {
        super(isActive);
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public String getCollectionPattern() {
        return collectionPattern;
    }

    public void setCollectionPattern(String collectionPattern) {
        this.collectionPattern = collectionPattern;
        this.collectionLayout = new PatternLayout(collectionPattern);
    }

    public String getApplicationId() {
        return applicationId;
    }

    public void setApplicationId(String applicationId) {
        this.applicationId = applicationId;
    }

    public void setWarnOrHigherWriteConcern(String wc) {
        this.warnOrHigherWriteConcern = WriteConcern.valueOf(wc);
    }

    public String getWarnOrHigherWriteConcern() {
        return warnOrHigherWriteConcern.toString();
    }

    public String getInfoOrLowerWriteConcern() {
        return infoOrLowerWriteConcern.toString();
    }

    public void setInfoOrLowerWriteConcern(String wc) {
        this.infoOrLowerWriteConcern = WriteConcern.valueOf(wc);
    }

    protected void connectToMongo() throws UnknownHostException {
        this.mongo = new Mongo(host, port);
        this.db = mongo.getDB(database);
    }

    @SuppressWarnings({ "unchecked" })
    @Override
    protected void append(final LoggingEvent event) {
        if (null == db) {
            try {
                connectToMongo();
            } catch (UnknownHostException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }

        BasicDBObject dbo = new BasicDBObject();
        if (null != applicationId) {
            dbo.put(APP_ID, applicationId);
            MDC.put(APP_ID, applicationId);
        }
        dbo.put(NAME, event.getLogger().getName());
        dbo.put(LEVEL, event.getLevel().toString());
        Calendar tstamp = Calendar.getInstance();
        tstamp.setTimeInMillis(event.getTimeStamp());
        dbo.put(TIMESTAMP, tstamp.getTime());

        // Copy properties into document
        Map<Object, Object> props = event.getProperties();
        if (null != props && props.size() > 0) {
            BasicDBObject propsDbo = new BasicDBObject();
            for (Map.Entry<Object, Object> entry : props.entrySet()) {
                propsDbo.put(entry.getKey().toString(), entry.getValue().toString());
            }
            dbo.put(PROPERTIES, propsDbo);
        }

        // Copy traceback info (if there is any) into the document
        String[] traceback = event.getThrowableStrRep();
        if (null != traceback && traceback.length > 0) {
            BasicDBList tbDbo = new BasicDBList();
            tbDbo.addAll(Arrays.asList(traceback));
            dbo.put(TRACEBACK, tbDbo);
        }

        // Put the rendered message into the document
        dbo.put(MESSAGE, event.getRenderedMessage());

        // Insert the document
        Calendar now = Calendar.getInstance();
        MDC.put(YEAR, now.get(Calendar.YEAR));
        MDC.put(MONTH, String.format("%1$02d", now.get(Calendar.MONTH) + 1));
        MDC.put(DAY, String.format("%1$02d", now.get(Calendar.DAY_OF_MONTH)));
        MDC.put(HOUR, String.format("%1$02d", now.get(Calendar.HOUR_OF_DAY)));

        String coll = collectionLayout.format(event);

        MDC.remove(YEAR);
        MDC.remove(MONTH);
        MDC.remove(DAY);
        MDC.remove(HOUR);
        if (null != applicationId) {
            MDC.remove(APP_ID);
        }

        WriteConcern wc;
        if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
            wc = warnOrHigherWriteConcern;
        } else {
            wc = infoOrLowerWriteConcern;
        }
        db.getCollection(coll).insert(dbo, wc);
    }

    public void close() {
        mongo.close();
    }

    public boolean requiresLayout() {
        return true;
    }
}