Я использую классы ведения журнала java.util для создания скользящего файла. Я хочу создать читатель журнала, который читает из этих журналов, когда данные записываются в них.Создание файла роллинга Java Сбой при попытке чтения одновременно
Сводный код приложения для журналов работает отлично. Но как только я запускаю поток читателей, новые файлы не создаются, т. Е. Если в скользящем приложении журнала используется 5 файлов, он будет создавать 1og.0, log.1, log.2 и т. Д., Но если поток читателя начнется, он будет только create log.0 никакие другие файлы не создаются. Я замечаю это как в java logging, так и в log4j.
Я использую nio для чтения в устройстве чтения журнала. Так что я сомневаюсь, создает другой FileChannel в том же файле, создавая некоторые проблемы? или я пропустил какой-то базовый материал nio здесь, что вызывает проблемы.
здесь код ..
public class Test {
private static final long initialTime = System.currentTimeMillis();
private static Logger logger = Logger.getLogger(Test.class.getName());
public static void main(String[] args) {
logger.setLevel(Level.INFO);
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File(System.getProperty("user.dir")+File.separator+"input.dat"))));
FileHandler handler = new FileHandler("log/test.log", 1024, 5, true);
handler.setFormatter(new SimpleFormatter());
logger.addHandler(handler);
logger.setUseParentHandlers(false);
//If I comment the next two lines the rolling appender works as expected both in java logging
//and when using log4j. however once I start the log reader only one file is created.
Thread logReader = new Thread(new LogReader("log/test.log.0"));
logReader.start();
while(reader.ready())
{
String strToLog = reader.readLine();
logger.info(strToLog);
//Only want to run this for 10 secs.
if(System.currentTimeMillis() - initialTime > 10000)
System.exit(0);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
}
}
}
class LogReader implements Runnable {
private final int BUFFER_SIZE = 1024;
private RandomAccessFile file;
private FileChannel chan;
private long offset;
private ByteBuffer buf;
private Charset charset = Charset.forName("UTF-8");
private String filename = "output.log";
public LogReader(String logfile) throws IOException {
System.out.println("Starting log reader from " + logfile);
file = new RandomAccessFile(logfile, "r");
offset = file.length();
chan = file.getChannel();
chan.position(offset);
buf = ByteBuffer.allocateDirect(BUFFER_SIZE);
System.out.println("Started log reader from " + logfile);
}
public void run() {
//Even if I have nothing here..the problem exists..
}
}
Да, проблема была в RandonAccessFile – Guru