如何使用Log4J在Java中创建二进制日志文件

时间:2011-07-26 08:56:51

标签: java logging log4j appender

我可以使用FileAppender,RollingFileAppender等创建日志文件,

我的问题是日志是以纯文本形式写的,任何人都可以阅读,但我想将我的日志注册为非人类可读的二进制文件。

任何人都可以帮我解决为示例代码创建二进制日志文件的问题。

2 个答案:

答案 0 :(得分:1)

做你写的东西并不是一个好主意,但如果你真的需要,写一个这样的自己的appender:

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,你完成了写作部分。对于读取部分,您再次需要每字节读取一个字节并将字节减少一个,然后从中加载一个字符串。

祝你好运。

答案 1 :(得分:0)

我会使用DataOutputStream BufferedOutputStream和FileOutputStream来编写二进制文件。我假设您希望文件是机器可读的而不是不可读的。 ;)

Log4j专为文本文件设计,但您可以使用其日志级别,如。

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

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