2016-08-30 4 views
0

Я недавно обновил log4j в приложении веб-службы Java, от версии 1.2 до версии 2.2.2; приложение размещено на Tomcat 7.0.21, используя Java 7.0_67-b01; кодирование/компиляция с использованием Eclipse Juno (v4.2.0).log4j2 файлы, созданные, но не написанные

Я воспроизвел функцию log4j.properties в новом файле конфигурации lo4j2.xml. Ниже приведены примеры кода, я пытаюсь использовать приложение RollingFile и приложение File в дополнение к стандартным консольным приложениям.

Файлы журнала создаются в ожидаемом месте, но они остаются пустыми. Сама консоль регистрирует все сообщения, которые на нее накладывает приложение; каталины. yyyy-mm-dd .log-файл регистрирует уровень информации и выше. Как уже отмечалось, файлы tearsLog.log и tearsLogRF.log создаются, но сообщения журнала не записываются вообще.

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="trace"> 
    <Properties> 
     <Property name="log-path">${sys:catalina.home}/logs</Property> 
    </Properties> 
    <Appenders> 
     <Console name="Console" 
       target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" /> 
     </Console> 

     <File name="MyFile" 
       append="true" immediateFlush="true" 
       fileName="${log-path}/tearsLog.log"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" /> 
     </File> 

     <RollingFile name="MyRollingFile" 
       append="true" immediateFlush="true" 
       fileName="${log-path}/tearsLogRF.log" 
       filePattern="${log-path}/tearsLogRF_%d{yyyy-MM-dd_HH-mm-ss}.log"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" /> 
      <Policies> 
       <TimeBasedTriggeringPolicy /> 
       <SizeBasedTriggeringPolicy size="100 KB" /> 
      </Policies> 
      <DefaultRolloverStrategy max="10" /> 
     </RollingFile> 
    </Appenders> 

    <Loggers> 
     <Logger name="us.ak.state.adfg.tears.service.TearsService" level="info" additivity="false"> 
      <AppenderRef ref="Console" /> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.GenericDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.EmployeeDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.TimesheetDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.SecurityDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Root level="debug"> 
      <AppenderRef ref="Console" /> 
      <AppenderRef ref="MyFile" level="trace" additivity="false" /> 
      <AppenderRef ref="MyRollingFile" additivity="false" /> 
     </Root> 
    </Loggers> 
</Configuration> 

образец * .java класс:

package us.ak.state.adfg.tears.service; 

import java.util.Date; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 


public class TearsService { 
    static Logger log = LogManager.getLogger(TearsService.class); 

    public TearsService() { 
    } 

    public int saveTimesheet(User user, Timesheet ts) throws Exception {   
     String msg = ""; 
     if (user == null) { 
      msg = "Null user."; 
      log.error(msg); 
      throw new Exception(msg); 
     } 
     ... 
     return 0; 
    } 

Я вращал прочь, посмотрел на много, много примеров кода, Apache log4j документации и SO вопросы/ответы, используемый образец кода и предложения ... не могу понять, что не так. Я знаю, что это близко, только небольшая магия не позволяет мне это сделать. Поблагодарили бы за помощь. Спасибо заранее ...

+0

Не публикуйте это в комментарии. Измените вопрос. Удалите комментарий. – Andreas

ответ

1

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

public int saveTimesheet(User user, Timesheet ts) throws Exception {   
    String msg = ""; 
    log.info("Message:{}",msg); 
    if (user == null) { 
     msg = "Null user."; 
     log.error(msg); 
     throw new Exception(msg); 
    } 
    ... 
    return 0; 
} 

Кстати, вы не должны определять регистратор для каждого класса, достаточно общий регистратор для всего:

<Loggers> 
    <root level="debug"> 
     ... 
    </root> 
    <Logger name="us.ak.state.adfg.tears" level="info" additivity="false"> 
     <AppenderRef ref="Console" /> 
     <AppenderRef ref="MyFile" level="trace"/> 
     <AppenderRef ref="MyRollingFile" /> 
    </Logger> 

</Loggers> 
+0

Спасибо за этот отзыв, я надеялся, что смогу уменьшить повторение кода. Вы получаете A для усилий ... но в конечном счете, перезапуск сервера Tomcat волшебным образом устранил проблему. Нечетный, что было необходимо, код и модуль log4j полностью автономны в приложении, я думал, что просто перераспределение заставило бы его работать (он создал файлы)? В любом случае, похоже, сейчас это работает. – jwdvorak

+0

A A для усилий? Почему бы не подняться? –

0

В конечном счете, перезапуск сервера Tomcat волшебно констатировала вопрос. Нечетный, что было необходимо, код и модуль log4j полностью автономны в приложении, я думал, что просто перераспределение приложения заставит его работать (он создал файлы)? В любом случае, похоже, сейчас это работает.

Смежные вопросы