Comment puis-je suivre un fichier comme “Tail-f” n'en Java, sans tenir le fichier à ouvrir (Éviter de le renommer/supprimer)
je voudrais "Tail-f" beaucoup de fichiers de log dans une application java.
J'ai obtenu ce travail par le suivi de la taille et de la dernière mise à jour et à plusieurs reprises l'ouverture du fichier et la lecture de la dernière quelques octets à chaque fois que la taille du fichier ou de la dernière mise à jour les changements de temps, puis de le fermer tout de suite.
Cela semble problématique, car j'ai du ouvrir lorsque l'enregistreur décide de renommer le fichier qui va provoquer un certain genre de problème.
Je tiens également à détecter un "Roulé" fichier avec un mécanisme de plus en plus sûr que de remarquer que la taille de fichier réduite... semble enclins à faire des erreurs, mais peu probable.
Puisque je ne semble pas avoir accès au fichier descripteur ou d'un autre fichier de bas niveau utilitaires je risque de ne pas être en mesure de reproduire la queue behavor--mais il des trucs à la lecture d'un fichier sans le "Verrouillage" pour renommer/supprimer (Windows 7)
Je suppose que l'autre possibilité est de frayer un tail-f le processus et de lire le processus de sortie, mais qui semble un peu lourd, je suis la numérisation de 60 fichiers de log ici, certains ont beaucoup de sortie (la Plupart seront d'inactivité).
java.nio.file.WatchService.poll()
.Vraiment bien classe! Je pense que cela va résoudre le problème de la détection tronque, mais j'ai toujours le problème d'avoir à ouvrir le fichier et de lire le texte (même si cela peut me permettre de faire ça aussi... il faut que je regarde de plus près). Merci
J'ai perdu vous.Quel système d'exploitation?Windows ou Linux?
Windows 7, peut-être le fait que j'utilise la "Queue" de git jeta vous?
OriginalL'auteur Bill K | 2013-01-30
Vous devez vous connecter pour publier un commentaire.
Apache Commons a un Tailer classe, serait-ce faire ce que vous voulez? Si il le ferait, il a rouler mécanisme de détection ainsi que la lecture des choses, de sorte que vous obtenez tout ce que vous devez.
Si cela ne peut pas faire, c'est peut-être qu'il n'y a pas moyen de le faire avec java pur. Vous auriez besoin d'un peu d'aide, par exemple, le code en C, en utilisant fopen avec SH_DENYNO paramètre permettant partagé ouvert sur windows. Ou alors il suffit d'appeler un queue de la mise en œuvre par l'exécution d'un système de commande.
Mais depuis que le code de l'ouverture du fichier journal est à l'origine du verrou sur elle, même ce qui pourrait ne pas aider. Dans ce cas, la seule option est de changer la façon dont votre journalisation des œuvres, qui est le coupable du verrouillage d'un fichier. Log4j pouvez utiliser un SocketAppender, entre autres choses.
OriginalL'auteur eis
L'utilisation d'apache.commons.io
Et voici un exemple simple
}
OriginalL'auteur stones333
Dans Linux, vous n'auriez pas un problème, car le verrouillage est seulement
advisory
. Mais dansWindows
les choses sont différentes.Cela doit dépendre du mode de votre enregistreur (je suppose que log4j) ouvre le fichier de log.
La recherche dans ce réponse pour
C#
il semble qu'il y a un paramètredwShareMode
qui peuvent être utilisés pour ce type de partage.Je crois
NIO
serait la voie à suivre. Regardez sidwShareMode
paramètre est disponible dans le cadre deNIO
ApiOriginalL'auteur Cratylus