PDA

View Full Version : [Java] Output console su file?


Fire Fox II
07-09-2011, 10:48
Salve raga...

Come da titolo, possibile fare in modo che l'output della console venga scritto su file?

Praticamente, una volta generato il jar ed eseguito il programma vorrei fare in modo che sul file mi vengano segnati i vari errori che altrimenti non avrei modo di visualizzare, una sorta di debug...

Thanks

gokan
07-09-2011, 21:14
Quello che serve a te è la libreria Log4j (http://logging.apache.org/log4j/1.2/).

1. Scarichil il jar di log4j e prepari un file di properties contenente la directory dove salvare il file di log.
Qualcosa di simile (chiamalo log4j.properties):

log4j.rootLogger = DEBUG, CONSOLE, FILE

log4j.appender.FILE.encoding=UTF-8
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=${user.dir}/miofile.log
log4j.appender.FILE.MaxFileSize=2000KB
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.MaxBackupIndex=10
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %l %-5p %x - %m%n

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %l %-5p %x - %m%n


2.Nel main della tua applicazione inizializzi log4j (Util.initLog4j())
Ad esempio :

public class Util{
static public void initLog4j(){
Properties prop = loadLog4jProperties();
PropertyConfigurator.configure(prop);
}

private static Properties loadLog4jProperties(){
InputStream in = null;
Properties prop = null;
try {
prop = new Properties();
in = Util.class.getResourceAsStream("log4j.properties");
prop.load(in);
} catch (IOException e) {
System.err.println(e);
}finally{
try {
in.close();
} catch (IOException e) {
System.err.println(e);
}
}
return prop;
}
}

3. Nelle classi in cui vuoi mettere il log fai qualcosa di simile:

public class UnEsempio{
private static final Logger log = Logger.getLogger(UnEsempio.class);
...
public void faiQualcosa(){
...
if(...){
log.debug("Ho fatto una if e scrivo nel file..");
}..
if(...){
log.error("E' accaduto qualcosa di brutto");
}
...
log.info("fine metodo");

}
}


Fatto.

Fire Fox II
09-09-2011, 14:57
Ti ringrazio, appena provo ti faccio sapere :)

Fire Fox II
12-09-2011, 12:46
Scusami, solo ora stavo cercando di implementare il tuo suggerimento, ma forse non mi sono spiegato bene...

Io vorrei redirigere tutto quello che mi compare a console su un file di testo senza dover essere io ad effettuare le varie chiamate al "log" ogni if, else, try catch etc...

Il programma è abbastanza lungo, fare una cosa del genere diventerebbe impraticabile...

banryu79
12-09-2011, 13:21
Un esempio volante:

public class StandardOutputRedirection
{
public static void main(String[] args) {

String userDir = System.getProperty("user.dir");
File file = new File(userDir, "mylog.txt");
boolean done = customizeSystemOut(file);

if (done) {
System.out.println("Printing a line to a log file.");
} else {
System.out.println("Printing a line to the consolle.");
}
}

private static boolean customizeSystemOut(File file) {
PrintStream newOut = null;
try {
newOut = new PrintStream(new FileOutputStream(file));
System.setOut(newOut);
return true;
} catch (FileNotFoundException ignored) {
return false;
}
}
}


Credo però che non sia una buona pratica. Ad esempio fai attenzione al fatto che il file prodotto può crescere smisuratamente.

wingman87
12-09-2011, 13:38
Se sei su windows (ma credo funzioni anche sulle shell di linux, forse con un comando diverso) puoi lanciare il programma da shell aggiungendo in fondo ">output.txt".

Esempio:
dir >dir.txt

fbcyborg
12-09-2011, 14:50
Io una volta ho usato log4j e ha funzionato alla grande. Direi che è perfetto.

gokan
12-09-2011, 15:15
Scusami, solo ora stavo cercando di implementare il tuo suggerimento, ma forse non mi sono spiegato bene...

Io vorrei redirigere tutto quello che mi compare a console su un file di testo senza dover essere io ad effettuare le varie chiamate al "log" ogni if, else, try catch etc...

Il programma è abbastanza lungo, fare una cosa del genere diventerebbe impraticabile...

Ciao, quando ti riferisci alla console, parli della console di eclipse, oppure ti riferisci al prompt di msdos quando lanci un programma java da riga di comando?

A questo punto tutto quello che scrivi nella sistem.out potrebbe andare nel tuo file di log...

ally
12-09-2011, 15:50
Se sei su windows (ma credo funzioni anche sulle shell di linux, forse con un comando diverso) puoi lanciare il programma da shell aggiungendo in fondo ">output.txt".

Esempio:
dir >dir.txt

...su qualsiasi sistema...

Fire Fox II
12-09-2011, 19:48
La console è quella di eclipse, si...

Il programma alla fine sarà un file JAR da eseguire e dovrei fare in modo che l'output generato (gli errori che vedo nella console di eclipse praticamente) vengono salvati in un file...

gokan
12-09-2011, 20:56
La console è quella di eclipse, si...

Il programma alla fine sarà un file JAR da eseguire e dovrei fare in modo che l'output generato (gli errori che vedo nella console di eclipse praticamente) vengono salvati in un file...
Bhè allora quello che ti serve è esattamente log4j..quando in un blocco try-catch gestisci un eccezione, semplicemente fai :
log.error("ERRORE NELLA CHIAMATA ...." , exc);
oppure se preferisci:
log.error(exc.getMessage());

dove exc è l'eccezione catturata..

Bye

Fire Fox II
13-09-2011, 15:41
Bhè allora quello che ti serve è esattamente log4j..quando in un blocco try-catch gestisci un eccezione, semplicemente fai :
log.error("ERRORE NELLA CHIAMATA ...." , exc);
oppure se preferisci:
log.error(exc.getMessage());

dove exc è l'eccezione catturata..

Bye

No... Scusami, come ho detto prima non devo essere io ad effettuare le chiamate al log per il motivo espresso in precedenza...

Poniamo in essere un programma senza alcuna try catch...
Si crea il jar e si esegue il programma... Eventuali errori devono essere riversati sul file ed il prog continua la sua esecuzione
Successivamente si apre il file di log, si verificano gli errori e vi si pone rimedio con try catch o altro

Forse qualcosa come ha suggerito wingman87 ma non vorrei eseguire il programma da shell o batch...