2013-04-02 3 views
3

Я использую Play 2.1 (Java) и loglog по умолчанию (1.0.7), который поставляется с Play. В одном из моих контроллеров я использую «play.Logger» для печати сообщения журнала отладки. Несмотря на упоминание «%class» в файле logger.xml, имя класса вызывающего абонента не печатается. Скорее «play.Logger$ALogger» печатается. Я отлаживал до logback ch.qos.logback.classic.spi.CallerData, где он возвращает stacktrace как массив, чтобы идентифицировать класс вызывающего. В массиве класс контроллера вызывающего абонента находится в нижней части массива, а наверху - «play.Logger.ALogger», и это то, что используется в «ch.qos.logback.classic.pattern.ClassOfCallerConverter» для печати класса name(cda[0].getClassName()).PlayFramework Запись имени вызывающего вызывающего абонента

Я смотрел другие подобные темы here и here, но они, похоже, не исправляют это.

Вот мой XML

<appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${application.home}/logs/debug_log.log</file> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <pattern>%date - [%level] - from %logger %class in %thread %n%message%n%xException%n</pattern> 
    </layout> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>DEBUG</level> 
    </filter> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${application.home}/logs/debug_log.%d{yyyy-MM-dd}.log</fileNamePattern> 
     <maxHistory>30</maxHistory> 
    </rollingPolicy> 
</appender> 

ли я что-то отсутствует?

ответ

0

Я исследовал тот же вопрос в последнее время, и вот мое решение: вам необходимо установить флаг includeCallerData путем добавления

<includeCallerData>true</includeCallerData> 

в конфигурации Appender.

Btw, если вы используете ch.qos.logback.classic.AsyncAppender, вы должны включить флаг там, как хорошо, но как только вы сделаете это, вы не должны установить его в другом месте, как AsyncAppender модифицирует регистрации событий, вводя данные вызывающего абонента в него.

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

<appender name="NOP" class="ch.qos.logback.core.helpers.NOPAppender" /> 
    <appender name="ASYNC.NOP" class="ch.qos.logback.classic.AsyncAppender"> 
     <includeCallerData>true</includeCallerData> 
     <appender-ref ref="NOP" /> 
    </appender> 

    <root level="..."> 
     ... 
     <appender-ref ref="ASYNC.NOP" /> 
    </root> 

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