Как записать информацию о местонахождении вызывающего абонента в файл журнала, используя Java, без ущерба для производительности? - PullRequest
3 голосов
/ 28 августа 2010

Как я могу записать информацию о местоположении вызывающего абонента (исходный файл Java и строку) в файл журнала, используя Java и log4j, но без ущерба для производительности? log4j позволяет вам записывать такую ​​информацию в файл журнала, но он использует трассировку стека для получения этой информации, каждый раз, когда выдается оператор журнала, что вызывает снижение производительности. Я ищу альтернативу, дружественную к производительности, такую ​​как получение информации о местоположении во время компиляции, а не во время выполнения. Можно ли использовать аннотации для этого? Или, может быть, какая-то другая техника?

Ответы [ 2 ]

1 голос
/ 28 августа 2010

Как насчет того, чтобы сделать его частью процесса сборки для замены определенных заполнителей, таких как $filename$ и $linenumber$ в этом фрагменте.

logger.info("The original message... $filename$ $linenumber$");

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

0 голосов
/ 28 августа 2010

Я согласен с Робом, что это вообще не нужно.Обычно в сообщении есть какая-то отдельная строка, поиск которой приведет к источнику.С хорошей IDE это действительно быстро.

Теперь, учитывая вопрос как есть, это возможное решение:

Class Foo
    void bar()
        new Logger(){} . warn("blah");

для каждого действия журнала во время выполнения, создается новый объект- это не проблема.

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

вот как работает магия:

abstract public class Logger
    static Map<Class, String> sourceInfo = new ...
    public Logger()
        Class thisClass = this.getClass();
        String info = sourceInfo.get(thisClass);
        if(info==null)
             info = ... // init from stack trace
             sourceInfo.put(thisClass,info)
        this.info = info

     public void warn(msg)
        log(WARN, this.info,msg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...