J'écrivais un programme serveur de base lorsque j'utilisais System.out.println
pour imprimer mes messages de journal. J'ai écrit un fichier de classe de base qui utilise cela pour écrire dans le journal. Si je devais écrire ce qui suit:La redirection Java PrintStream se comportait de façon inattendue
System.out.println("Hello, world!");
System.out.println("Goodbye, world");
La sortie souhaitée serait:
Log message - Hello, world!
Log message - Goodbye, world!
Ce qui finit par se produire ne correspond pas à la sortie désirée. Au lieu de cela, il sort à la suivante.
Log message - Hello, world!
Goodbye, world!
Le code pour la méthode principale:
public static void main(String[] args){
LogManager.start();
System.out.println("Hello, world!");
System.out.println("Goodbye, world!");
LogManager.stop();
}
La classe LogManager commute la valeur par défaut PrintStream
qui est imprimé, et conserve une copie de l'ancien pour imprimer des messages journaux. Cependant, "Message de journal -" n'est pas toujours préfixé. Bien que, en dormant pendant 2000ms entre chaque appel println
, la sortie ressemble à ce qui suit.
Log message - Hello, world!
Log message - Goodbye, world!Log message -
Le code de LogManager est le suivant.
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
public class LogManager implements Runnable{
private final PrintStream ps;
private final OutputStream out;
private static boolean cont = true;
public static void start(){
OutputStream stdout = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(stdout);
Thread th = new Thread(new LogManager(System.out, stdout));
System.setOut(ps);
th.start();
}
public static void stop(){
cont = false;
}
public LogManager(PrintStream std, OutputStream out){
this.ps = std;
this.out = out;
}
@Override
public void run() {
ByteArrayOutputStream baos = (ByteArrayOutputStream) out;
while(true){
if(!cont) return;
byte[] bytes = baos.toByteArray();
if(bytes.length > 0){
baos.reset();
ps.print("Log message - " + new String(bytes));
}
}
}
}
Quelqu'un pourrait-il me signaler ce que je fais de mal, l'aide serait grandement appréciée. Je voudrais rester à l'écart des bibliothèques, car je souhaite réduire au minimum la taille de mon JAR, sans inclure de paquets supplémentaires, bien que je sache que je n'utilise pas la bibliothèque de quelqu'un d'autre pour réaliser ce que je suis en train de faire.
J'ai essayé ceci, mais il semble donner les mêmes résultats. Le préfixe est ajouté uniquement à certains journaux. Je crois que c'est probablement quelque chose à faire avec le tampon. J'ai rendu le 'cont' volatile et j'ai changé le code dans ma boucle pour celui que vous aviez montré, mais il semble toujours faire la même chose. – Garhoogin
@Garhoogin Mis à jour – yshavit