Apache Commons IO Tailer entrega viejos mensajes de registro

Mi código se da a continuación.

public static void main(String[] args) {
    // TODO code application logic here
    File pcounter_log = new File("c:\development\temp\test.log");

try {

    Tailer tailer = new Tailer(pcounter_log, new FileListener("c:\development\temp\test.log",getLogPattern()), 5000,true);

    Thread thread = new Thread(tailer);
    thread.start();
} catch (Exception e) {
    System.out.println(e);
}
}

public class FileListener extends TailerListenerAdapter {


 public void handle(String line) {
        for (String logPattern : pattern) {
            if (line.contains(logPattern)) {
                logger.info(line);

            }
        }
    }
}

Aquí getLogPattern()devuelve ArrayListvalores que contienen como [info, error, abc.catch, warning]. Cuando ejecuto este código, recibo un mensaje de registro antiguo seguido de un mensaje de registro nuevo. Es decir, la salida es así:

20 May 2011 07:06:02,305  INFO FileListener:? - 20 May 2011 07:06:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:06:55,052  INFO FileListener:? - 20 May 2011 07:06:55,016 DEBUG  - readScriptErrorStream()
20 May 2011 07:06:56,056  INFO FileListener:? - 20 May 2011 07:06:55,040 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:07:01,241  INFO FileListener:? - 20 May 2011 07:07:01,219 DEBUG  - readScriptErrorStream()
20 May 2011 07:07:02,245  INFO FileListener:? -  20 May 2011 07:07:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:07:55,020  INFO FileListener:? -  20 May 2011 07:07:55,016 DEBUG  - readScriptErrorStream()
20 May 2011 07:07:56,024  INFO FileListener:? - 20  2011 07:07:55,030 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:01,269  INFO FileListener:? -  20 May 2011 07:08:01,227 DEBUG - readScriptErrorStream()
20 May 2011 07:08:02,273  INFO FileListener:? -  20 May 2011 07:08:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:21,234  INFO FileListener:? -  20 May 2011 06:40:02,461 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:22,237  INFO FileListener:? -  20 May 2011 06:40:02,468 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:23,242  INFO FileListener:? -  20 May 2011 06:41:01,224 DEBUG - readScriptErrorStream()
20 May 2011 07:08:24,250  INFO FileListener:? -  20 May 2011 06:41:01,232 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:25,261  INFO FileListener:? -  20 May 2011 06:42:01,218 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:26,265  INFO FileListener:? -  20 May 2011 06:42:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:27,272  INFO FileListener:? -  20 May 2011 06:43:01,223 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:28,275  INFO FileListener:? -  20 May 2011 06:43:01,231 DEBUG   - exiting readScriptErrorStream()

¿Cómo evitar recibir mensajes de registro antiguos de un archivo de registro como este?

Respuesta 1

Oh, muchacho, he perdido un día entero pensando que era mi hilo sospechoso, pero ahora veo que otros han compartido mi dolor. Oh, bueno, al menos no perderé otro día mirándolo.

Pero sí miré el código fuente. Estoy seguro de que el error está ocurriendo aquí en el archivo Tailer.java:

boolean newer = FileUtils.isFileNewer(file, last); // IO-279, must be done first
...
...
else if (newer) {
    /*
    * This can happen if the file is truncated or overwritten with the 
    * exact same length of information. In cases like this, the file
    * position needs to be reset
    */
    position = 0;
    reader.seek(position);
...

Parece que es posible que los datos de modificación del archivo puedan cambiar antes de que se escriban los datos. No soy un experto en por qué sería así. Estoy obteniendo mis archivos de registro de la red, por lo que tal vez esté ocurriendo todo tipo de almacenamiento en caché, lo que significa que no está seguro de que un archivo más nuevo contenga más datos.

He actualizado la fuente y eliminado esta sección. Para mí, las posibilidades de que un archivo sea truncado / recreado con exactamente el mismo número de bytes es mínimo. Estoy haciendo referencia a archivos de registro continuos de 10 MB.

Veo que este es un problema conocido (IO-279 ENLACE AQUÍ ). Sin embargo, está marcado como resuelto y claramente ese no es el caso. Me pondré en contacto con los desarrolladores para ver si hay algo en la tubería. Parece que son de la misma opinión que yo sobre la solución.

Respuesta: 2

https://issues.apache.org/jira/browse/IO-279?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

¿Qué versión de commons.io estás (estabas) usando? Experimenté este error con 2.0.1. Actualicé a 2.3, y parece estar funcionando correctamente (hasta ahora)

Respuesta: 3

Cuando uso ArrayList en Java, hay algunas cosas que no entiendo. Aquí está mi código de inicialización: ArrayList <Integer> list = new ArrayList <Integer> (); list.add (0); list.add ...

Estoy tratando de incluir un botón de donación de PayPal en mi aplicación (al iniciarlo desde un botón de la barra de acción), funciona como debería, pero ... solo muestra PayPalActivity como una ventana emergente muy pequeña, mientras que debería ...

En Java / Processing, quiero probar si una curva bezier se superpone a un círculo, para poder desplazar una de ellas. ¿Hay una manera simple de hacer esto?

Tengo un JMenuItem con un ActionListener, en este ActionListener quiero agregar un GridBagLayout a mi marco (que podría o no tener un panel de contenido aún agregado, para fines de prueba no lo hace) ...