log4j перенаправляют stdout к DailyRollingFileAppender

var Book = {"Titles":[                          
    {
    "Book3" : "BULLETIN 3"
    }   
    ,
    {
    "Book1" : "BULLETIN 1"
    }
    ,
    {
    "Book2" : "BULLETIN 2"
    }    
]}

var findbystr = function(str) { 
    var return_val;
    Book.Titles.forEach(function(data){ 
        if(typeof data[str] != 'undefined')
        {
            return_val = data[str];
        } 
    }, str) 

    return return_val;
}

book = findbystr('Book1');
console.log(book);
64
задан letronje 29 July 2009 в 13:15
поделиться

4 ответа

// I set up a ConsoleAppender in Log4J to format Stdout/Stderr
log4j.rootLogger=DEBUG, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n


// And I call this StdOutErrLog.tieSystemOutAndErrToLog() on startup

public class StdOutErrLog {

    private static final Logger logger = Logger.getLogger(StdOutErrLog.class);

    public static void tieSystemOutAndErrToLog() {
        System.setOut(createLoggingProxy(System.out));
        System.setErr(createLoggingProxy(System.err));
    }

    public static PrintStream createLoggingProxy(final PrintStream realPrintStream) {
        return new PrintStream(realPrintStream) {
            public void print(final String string) {
                realPrintStream.print(string);
                logger.info(string);
            }
        };
    }
}
99
ответ дан 24 November 2019 в 15:49
поделиться

Если вы используете сервер приложений, контейнер сервлетов или что-то подобное, см. Ответ кгианнакакиса .

Для автономных приложений см. this . Вы можете переназначить stdin , stdout и stderr , используя класс java.lang.System . По сути, вы создаете новый подкласс PrintStream и устанавливаете для этого экземпляра значение System.out.

Что-то вроде этих строк в начале вашего приложения (непроверено).

// PrintStream object that prints stuff to log4j logger
public class Log4jStream extends PrintStream {
      public void write(byte buf[], int off, int len) {
        try {
           // write stuff to Log4J logger
        } catch (Exception e) {
       }
    }
}

// reassign standard output to go to log4j
System.setOut(new Log4jStream());
6
ответ дан 24 November 2019 в 15:49
поделиться

Полагаю, вы регистрируете трассировки стека через e.printStackTrace () ? Вы можете передать объект исключения в методы ведения журнала Log4j, и они появятся в вашем журнале (см. Logger.error (Object obj, Throwable t) )

Обратите внимание, что вы можете изменить System.out и System .err к другому PrintStream , который перенаправляет на Log4j. Это было бы несложным изменением и избавило бы вас от преобразования всех ваших операторов System.out.println () .

2
ответ дан 24 November 2019 в 15:49
поделиться

Стандартный вывод и потоки ошибок управляются из вашего контейнера. Например, Tomcat использует JULI для протоколирования потоков вывода и ошибок.

Я рекомендую оставить их как есть. Избегайте использования System.out.print в вашем приложении. См. здесь для трассировки стека.

1
ответ дан 24 November 2019 в 15:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: