All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.archive.crawler.reporting.AlertThreadGroup Maven / Gradle / Ivy

The newest version!
/*
 *  This file is part of the Heritrix web crawler (crawler.archive.org).
 *
 *  Licensed to the Internet Archive (IA) by one or more individual 
 *  contributors. 
 *
 *  The IA licenses this file to You 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.archive.crawler.reporting;

import java.util.LinkedList;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

import org.archive.io.SinkHandlerLogThread;

/**
 * Parent thread group which lets all child threads find the right 
 * 'alert' error handler. Helpful for collecting all log events
 * of a certain severity (WARNING, SEVERE) from a group of related
 * threads. 
 * 
 * @author pjack
 * @author gojomo
 */
public class AlertThreadGroup extends ThreadGroup {
    protected int count;
    protected LinkedList loggers = new LinkedList(); 
    static protected ThreadLocal threadLogger = new ThreadLocal();
    
    public AlertThreadGroup(String name) {
        super(name);
    }

    public int getAlertCount() {
        return count;
    }

    public void resetAlertCount() {
        count = 0;
    }
    
    public void addLogger(Logger logger) {
        loggers.add(logger);
    }
    
    /** set alternate temporary alert logger */
    public static void setThreadLogger(Logger logger) {
        threadLogger.set(logger); 
    }

    public static AlertThreadGroup current() {
        Thread t = Thread.currentThread();
        ThreadGroup th = t.getThreadGroup();
        while ((th != null) && !(th instanceof AlertThreadGroup)) {
            th = th.getParent();
        }
        return (AlertThreadGroup)th;
    }

    public static void publishCurrent(LogRecord record) {
        AlertThreadGroup atg = AlertThreadGroup.current();
        if (atg == null) {
            Logger tlog = threadLogger.get(); 
            if(tlog!=null) {
                // send to temp-registered logger
                boolean usePar = tlog.getUseParentHandlers();
                tlog.setUseParentHandlers(false);
                tlog.log(record);
                tlog.setUseParentHandlers(usePar);
            }
            return;
        }
        atg.publish(record);
    }

    /**
     * Pass a record to all loggers registered with the 
     * AlertThreadGroup. Adds thread info to the message, 
     * if available.
     * 
     * @param record
     */
    public void publish(LogRecord record) {
        String orig = record.getMessage();
        StringBuilder newMessage = new StringBuilder(256);
        Thread current = Thread.currentThread();
        newMessage.append(orig).append(" (in thread '");
        newMessage.append(current.getName()).append("'");
        if (current instanceof SinkHandlerLogThread) {
            SinkHandlerLogThread tt = (SinkHandlerLogThread)current;
            if(tt.getCurrentProcessorName().length()>0) {
                newMessage.append("; in processor '");
                newMessage.append(tt.getCurrentProcessorName());
                newMessage.append("'");
            }
        }
        newMessage.append(")");
        record.setMessage(newMessage.toString());
        count++;
        for(Logger logger : loggers) {
            // for the relay, suppress use of parent handlers
            // (otherwise endless loop a risk if any target
            // loggers relay through parents to topmost logger)
            synchronized(logger) {
                boolean usePar = logger.getUseParentHandlers();
                logger.setUseParentHandlers(false);
                logger.log(record);
                logger.setUseParentHandlers(usePar); 
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy