class PersistLogProcessor extends PersistProcessor 
implements Checkpointable, Lifecycle {

    @SuppressWarnings("unused")
    private static final long serialVersionUID = 1678691994065439346L;
    
    protected CrawlerJournal log;

    //  description: "Filename to which to log URI persistence information. " +
    // "Default is 'logs/persistlog.txtser.gz'. "
    protected ConfigPath logFile = new ConfigPath("URI persistence log file","${launchId}/logs/persistlog.txtser.gz");
    public ConfigPath getLogFile() {
        return this.logFile;
    }
    public void setLogFile(ConfigPath path) {
        this.logFile = path; 
    }
    
//    class description: "PersistLogProcessor. Logs CrawlURI attributes " +
//    "from latest fetch for consultation by a later recrawl."
    
    public PersistLogProcessor() {
    }


    public void start() {<FILL_FUNCTION_BODY>}
    
    public boolean isRunning() {
        return log != null; 
    }

    public void stop() {
        if(!isRunning()) {
            return;
        }
        
        // XXX happens at finish; move to teardown?
        log.close();
        log = null; 
    }

    @Override
    protected void innerProcess(CrawlURI curi) {
        log.writeLine(persistKeyFor(curi), " ", 
                new String(Base64.encodeBase64(
                        SerializationUtils.serialize((Serializable)curi.getData()))));
    }
    
    public void startCheckpoint(Checkpoint checkpointInProgress) {}

	public void doCheckpoint(Checkpoint checkpointInProgress) throws IOException {
        // rotate log
        log.rotateForCheckpoint(checkpointInProgress);
    }
    
    public void finishCheckpoint(Checkpoint checkpointInProgress) {}

    @Override
    protected boolean shouldProcess(CrawlURI uri) {
        return shouldStore(uri);
    }
}

        if (isRunning()) {
            return;
        }
        try {
            File logFile = getLogFile().getFile();
            log = new CrawlerJournal(logFile);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }
    
<methods>public void <init>() ,public static int copyPersistSourceToHistoryMap(java.io.File, StoredSortedMap<java.lang.String,Map#RAW>) throws DatabaseException, java.io.IOException,public static int copyPersistSourceToHistoryMap(java.net.URL, StoredSortedMap<java.lang.String,Map#RAW>) throws DatabaseException, java.io.IOException,public static void main(java.lang.String[]) throws DatabaseException, java.io.IOException,public static java.lang.String persistKeyFor(org.archive.modules.CrawlURI) ,public static java.lang.String persistKeyFor(java.lang.String) ,public static int populatePersistEnv(java.lang.String, java.io.File) throws java.io.IOException,public static org.archive.util.bdbje.EnhancedEnvironment setupCopyEnvironment(java.io.File) throws DatabaseException,public static org.archive.util.bdbje.EnhancedEnvironment setupCopyEnvironment(java.io.File, boolean) throws DatabaseException<variables>public static final non-sealed org.archive.bdb.BdbModule.BdbConfig HISTORY_DB_CONFIG,public static final java.lang.String URI_HISTORY_DBNAME,private static final java.util.logging.Logger logger,private static final long serialVersionUID