Как создать двоичный файл журнала в Java с помощью Log4J - PullRequest
1 голос
/ 26 июля 2011

Я могу создавать файлы журналов, используя FileAppender, RollingFileAppender и т. Д.,

Моя проблема в том, что журналы пишутся в виде простого текста, который может прочитать каждый, но я хочу зарегистрировать свои журналы как двоичные файлы, которые не читаются человеком.

Может ли кто-нибудь помочь мне с предложением создать двоичный файл журнала для примера кода.

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Это не очень хорошая идея, чтобы делать то, что вы написали, но если вам действительно нужно, напишите собственного аппендера, как это:

package de.steamnet.loggingUtils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

public class BinaryAppender extends AppenderSkeleton {

    FileOutputStream fout;

    public BinaryAppender() throws FileNotFoundException {
        fout = new FileOutputStream("/tmp/somefile.log.bin");
    }

    @Override
    protected void append(LoggingEvent le) {
        String origMessage = le.getLoggerName() + " said: " + le.getMessage();
        byte[] obscure = origMessage.getBytes();
        for(int ii = 0; ii < obscure.length; ii++) {
            if(obscure[ii] == Byte.MAX_VALUE) {
                obscure[ii] = Byte.MIN_VALUE;
            } else {
                obscure[ii] = (byte)(obscure[ii] +1); // thats a really bad idea to create 'nonesense stuff' that way!
            }
        }
        try {
            fout.write(obscure);
        } catch (IOException ex) {
            System.out.println("too bad. File writer bombed.");
        }
    }

    @Override
    public boolean requiresLayout() {
        return false; // we do all layouting in here.
    }

    @Override
    public void close() {
        try {
            fout.close();
        } catch (IOException ex) {
            System.out.println("too bad. could not close it.");
        }
    }

}

Тогда в вашей конфигурации log4j используйте этот класс как appender, и вы закончили с записью. для части чтения вам снова нужно прочитать ее байт на байт и уменьшить ее на единицу, а затем загрузить из нее строку.

Удачи.

0 голосов
/ 26 июля 2011

Я бы использовал DataOutputStream BufferedOutputStream и FileOutputStream для записи двоичных файлов. Я предполагаю, что вы хотите, чтобы файлы были машиночитаемыми, а не нечитаемыми. ;)

Log4j предназначен для текстовых файлов, однако вы можете использовать его уровни ведения журнала, например.

private static final Log LOG = 
static DataOutputStream out = ... FileOutputStream ...

if(LOG.isDebugEnabled()) {
   // write a debug log to out
}
...