Удаление доступа к System.out в Java

Я думаю, что произвольный текст (возможно, varchar (25)) является наиболее широко используемым стандартом. Это будет допускать любой формат, или внутренний или международный.

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

5
задан Robert Munteanu 13 November 2009 в 10:53
поделиться

12 ответов

Ключевым моментом здесь является настройка log4j перед перенаправлением выходных потоков, например

BasicConfigurator.configure();
System.setOut(...);
System.setErr(...);

System.out.println("I fail");
Logger.getLogger(...).info("I work");
2
ответ дан 18 December 2019 в 05:16
поделиться

Предполагая, что вы можете управлять выводом своих контейнеров, вы можете сделать следующее:

import java.io.*;
public class SysOut {
    public static void main(String[] args) throws Exception {
            PrintStream pw = new PrintStream(new FileOutputStream("a.txt"));
            PrintStream realout = System.out;
            System.setOut(pw);
            System.out.println("junk");
            realout.print("useful");
}
}

$ java SysOut 
useful
$ cat a.txt 
junk
12
ответ дан 18 December 2019 в 05:16
поделиться

Хотя Java определяет стандартные System.out и System.err, они могут быть перезаписаны вашими собственными потоками. См. http://www.devx.com/tips/Tip/5616

По сути, вы можете настроить новые потоки, которые либо направляются на ведение журнала, либо просто позволяют данным уходить в небытие. Я бы предпочел последнее, так как это мгновенно избавит разработчиков от использования System.out и приведет к ошибке, поскольку все, что они там пишут, просто исчезнет.

** Обновление: Я просто перечитал ваши условия в вопросе и вижу, что вам все еще нужна консоль для контейнерного приложения. Это может по-прежнему работать, если вы напишете оболочку вокруг стандартного потока, чтобы вы могли проверять каждый вызов и видеть, исходит ли он из родительского приложения (и передать его) или дочернего приложения (и заблокировать его)

6
ответ дан 18 December 2019 в 05:16
поделиться

Вы можете использовать System.setOut () и System.setErr () для перенаправления stdout и stderr в экземпляры PrintStream .

10
ответ дан 18 December 2019 в 05:16
поделиться

Используйте терапию отвращения. Визит «Инспекторов» планируется всякий раз, когда регистрируется какой-либо код, содержащий неприятные конструкции.

Nice cubicle you got ere, be shame if anyfing appened to it.
5
ответ дан 18 December 2019 в 05:16
поделиться

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

Единственная сложная часть на самом деле - это способность определять, какой вызов является допустимым, а какой нет. Рабочий, но, вероятно, очень медленный способ сделать это, - это вызвать Thread.currentThread (). GetStackTrace () и посмотреть, какой код (или пакет, по крайней мере) вызывает вас (просто возвращается, если он не действительный). Я бы не рекомендовал это делать, поскольку падение производительности будет ошеломляющим, особенно при каждом чтении байта.

Лучшей идеей может быть установка флага ThreadLocal во всех ваших допустимых потоках контейнера. Затем вы можете реализовать PrintStream примерно так:

public class ThreadValidity extends ThreadLocal<Boolean>
{
    private static final INSTANCE = new ThreadValidity();

    @Override Boolean initialValue() { return false; }
    public static ThreadValidity getInstance() { return INSTANCE; }
}

class VerifyingPrintStream extends PrintStream
{
    private boolean isValidThread()
    {
        return ThreadValidity.instance().get();
    }

    public void println(String s)
    {
        if (!isValidThread()) return;
        super.println(s);
    }

    public void println(Object o)
    {
        if (!isValidThread()) return;
        super.println(o);
    }

    // etc
}

В качестве альтернативы, если вы можете изменить println s в коде контейнера, все станет проще. Вы можете передать все записи консоли конкретному исполнителю; и пусть этот рабочий "украдет" System.out (сохранит его в своем собственном поле и будет использовать напрямую для записи вывода), установив фактический System.out на нерабочую запись.

3
ответ дан 18 December 2019 в 05:16
поделиться

Преобразование потоков System.out и System.err в специальные реализации, которые вызывают исключение RuntimeException (" Использовать ведение журнала вместо System.out " ) каждый раз, когда пишется символ.

Если ваш контейнер важен, они поймут идею довольно быстро:)

(Для дополнительного бонуса вместо этого выбросьте OutOfMemoryException; -))

1
ответ дан 18 December 2019 в 05:16
поделиться

Если у вас есть механизм сборки без головы, муравей или что-то подобное, тогда вы можете добавьте CheckStyle в сборку и настройте checkstyle, чтобы сборка провалилась, если она обнаружит в коде какие-либо System.out.println или e.printStackTrace.

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

3
ответ дан 18 December 2019 в 05:16
поделиться

Я перенаправил PrintStream для System.out и System.err на commons-logging как на уровень INFO и ERROR соответственно.

Это становится сложнее, если вы хотите, чтобы некоторые потоки выполняли иметь возможность писать на консоль, или вы хотите, чтобы журналы также поступали на консоль, но это можно сделать.

1
ответ дан 18 December 2019 в 05:16
поделиться

Фактически вы можете получить и сохранить System.out / err перед их заменой.

OutputStream out=System.getOut();  // I think the names are right
System.setOut(some predefined output stream, null won't work);
out.println("Hey, this still goes to the output");
System.out.println("Oh noes, this does not");

Я использовал это для перехвата всех System.out.println в кодовой базе и префикса каждой строки вывод с именем метода / номером строки, из которой он был взят.

1
ответ дан 18 December 2019 в 05:16
поделиться

Закройте потоки System.out и System.err.

1
ответ дан 18 December 2019 в 05:16
поделиться

Мы используем трюк log4j, но ведем журнал в отдельные файлы (stdout.log, stderr.log). Бесполезно смешивать их вывод с частями, которые действительно понимают ведение журнала ...

0
ответ дан 18 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

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