Определить долготы и широты в пределах диапазона

стандартный log4j (1.x) не поддерживает запись в HDFS. но, к счастью, log4j очень прост. Я написал один файл HDFS FileAppender для записи журнала в MapRFS (совместимый с Hadoop). имя файла может быть чем-то вроде «maprfs: ///projects/example/root.log». Это хорошо работает в наших проектах. Я извлекаю часть кода приложения и вставляю его ниже. фрагменты кода могут не работать. но это даст вам представление о том, как написать вам приложение. На самом деле вам нужно только расширить org.apache.log4j.AppenderSkeleton и реализовать append (), close (), requireLayout (). для получения дополнительной информации вы также можете загрузить исходный код log4j 1.2.17 и посмотреть, как определяется AppenderSkeleton, он предоставит вам всю информацию. Удачи!

note: альтернативный способ записи в HDFS - установить HDFS на все ваши узлы, чтобы вы могли записывать журналы так же, как писать в локальный каталог. возможно, это лучший способ на практике.

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.Layout;
import org.apache.hadoop.conf.Configuration;

import java.io.*;

public class HDFSFileAppender {
    private String filepath = null;
    private Layout layout = null;

    public HDFSFileAppender(String filePath, Layout layout){
        this.filepath = filePath;
        this.layout = layout;
    }

    @Override
    protected void append(LoggingEvent event) {
        String log = this.layout.format(event);
        try {
            InputStream logStream = new ByteArrayInputStream(log.getBytes());
            writeToFile(filepath, logStream, false);
            logStream.close();
        }catch (IOException e){
            System.err.println("Exception when append log to log file: " + e.getMessage());
        }
    }

    @Override
    public void close() {}

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

    //here write to HDFS
    //filePathStr: the file path in MapR, like 'maprfs:///projects/aibot/1.log'
    private boolean writeToFile(String filePathStr, InputStream inputStream, boolean overwrite) throws IOException {
        boolean success = false;
        int bytesRead = -1;
        byte[] buffer = new byte[64 * 1024 * 1024];
        try {
            Configuration conf = new Configuration();
            org.apache.hadoop.fs.FileSystem fs = org.apache.hadoop.fs.FileSystem.get(conf);
            org.apache.hadoop.fs.Path filePath = new org.apache.hadoop.fs.Path(filePathStr);
            org.apache.hadoop.fs.FSDataOutputStream fsDataOutputStream = null;

            if(overwrite || !fs.exists(filePath)) {
                fsDataOutputStream = fs.create(filePath, overwrite, 512, 3, 64*1024*1024);
            }else{ //append to existing file.
                fsDataOutputStream = fs.append(filePath, 512);
            }

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                fsDataOutputStream.write(buffer, 0, bytesRead);
            }

            fsDataOutputStream.close();
            success = true;
        } catch (IOException e) {
            throw e;
        }
        return success;
    }

}
1
задан j0k 11 September 2013 в 11:47
поделиться