Как записать весь системный вывод в файл в JAVA? - PullRequest
0 голосов
/ 03 апреля 2012

Я создал приложение JAVA.Иногда пользователи выполняют недопустимые операции с ним, или существуют некоторые исключения, с которыми приложение сталкивается при выводе ошибок.Тем не менее, эти выходные данные не видны, если я не запускаю приложение из командной строки, используя java -jar myapp.jar

Я хочу записать все это в файл в виде журнала, но не могу найтифункция или объект, который отвечает за вывод этих ошибок и т. д.

Чтобы упростить мое объяснение, предположим, что мое приложение выводит число от 1 до 10, используя цикл for и команду Sytem.out.Как я могу записать все, что выводится в Систему?

Спасибо

Ответы [ 7 ]

3 голосов
/ 03 апреля 2012

Почему бы не использовать каркас журнала: http://logback.qos.ch/

С этим вы можете легко переключаться между файлом или консолью.

2 голосов
/ 03 апреля 2012

Соглашено с выше, вы должны использовать каркас регистрации. Я предпочитаю использовать такие абстракции, как SLF4J.

В этом примере вы можете использовать log4j внизу. Вот пример файла log4j.properties, который вы можете поместить в путь к классам вашего Java-приложения.

#Rootlogger logs to console and logfile
log4j.rootLogger=INFO,stdout,logfile


log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=/tmp/apname.log
log4j.appender.logfile.MaxFileSize=1024KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date [thread] priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%t] %p [%c] - %m%n

#=============== CREATE A SEPARATE HANDLER FOR LOGGING SPECIFIC PACKAGES
log4j.appender.MYPACKAGEHANDLER=org.apache.log4j.RollingFileAppender
log4j.appender.MYPACKAGEHANDLER.File=/tmp/mypackage.log
# 1/2 GB
log4j.appender.MYPACKAGEHANDLER.MaxFileSize=512MB
# Keep three backup files.
log4j.appender.MYPACKAGEHANDLER.MaxBackupIndex=3
# Pattern to output: message only
log4j.appender.MYPACKAGEHANDLER.layout=org.apache.log4j.PatternLayout
log4j.appender.MYPACKAGEHANDLER.layout.ConversionPattern=%m%n

log4j.additivity.com.techtrip.mypackage=false
log4j.logger.com.techtrip.mypackage=DEBUG, MYPACKAGEHANDLER

Используя эту конфигурацию, вы создадите два файла журнала с обновляемым приложением, распечатав все выходные данные журнала отладки любого класса, который регистрирует в com.techtrip.mypackage, в /tmp/mypackage.log.

.

Предположим, простой пример класса с Logger и Formatter:

package com.techtrip.mypackage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Foo {

    private Logger logger = LoggerFactory.getLogger(Foo.class);

    private String someString;

    private Foo() {
        super();
    }
    public void setSomeString(String someString) {
        if (logger.isDebugEnabled()){
            logger.debug(String.format("Setting someString %s", someString));
        }

        this.someString = someString;
    }
}

Это запишет вывод установщика в файл журнала. Выключите его, просто изменив файл свойств. Очень просто.

2 голосов
/ 03 апреля 2012

Вы можете использовать System.setOutsetErr), чтобы установить стандартный вывод / ошибку по умолчанию для ваших собственных PrintStream с.В приведен полный пример этой записи в блоге Oracle (любезно предоставлен archive.org, поскольку исходная ссылка умерла).

Однако, если это ваше собственное приложение, вы должны использовать каркас журналирования вместо стандартного вывода / ошибки.

1 голос
/ 03 апреля 2012

Вы должны переопределить потоки с помощью System.setOut () и System.setErr () , но я думаю, что было бы более гибким решением использовать существующие журналырамки как Apache Log4J .

0 голосов
/ 19 апреля 2015

Код для создания простого файла журнала:

import java.io.FileOutputStream;
import java.io.PrintStream;

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

          String st1 = "This World is Very Nice";
          String st2 = " And Beautiful.";
        try {
            System.setOut(new PrintStream(new FileOutputStream("log1.txt"))); //Create log file in parent directory

            // System.setOut(new PrintStream(new FileOutputStream("C:\\log1.txt"))); //Create log file in specified directory
            System.out.println();
            System.out.println("Now the output is redirected! And String is: " +st1 +st2);
        } catch(Exception e) {}   
    }
}
0 голосов
/ 03 апреля 2012

Рассмотрите возможность использования библиотеки журналов, а не System.out. Например, настройте его так:

try {
    // Create a file handler that write log record to a file called logfile.txt
    FileHandler handler = new FileHandler("logfile.txt");

    // Add to the desired logger
    Logger logger = Logger.getLogger("");
    logger.addHandler(handler);
} catch (IOException e) {
}
0 голосов
/ 03 апреля 2012

вы можете использовать System.setOut и System.setErr, чтобы установить другой PrintStream

...