Ведение журнала с помощью log4j на tomcat jruby-rack для приложения Rails 3

Я только что провел большую часть 3 часов, пытаясь получить регистрацию моего приложения Rails с помощью Log4j. Наконец-то у меня это заработало, но я не уверен, что то, что я сделал, правильно. Я пробовал различные методы безрезультатно до самой последней попытки. Поэтому я действительно ищу здесь подтверждение, возможно, также несколько указателей и советов - если честно, все будет оценено. Я суммировал все свои слабые методы в три попытки ниже. Я надеюсь на некоторое просветление о том, где я ошибался с каждой попыткой - даже если это означает, что меня разорвут.

Спасибо за помощь в продвижении!

Системные характеристики

  • Рельсы 3.0
  • Windows Сервер 2008
  • Лог4дж ​​1.2
  • Томакт 6.0.29
  • Ява 6

Попытка 1 — настроить Tomcat для использования Log4J

В основном я следовал руководству на веб-сайте Apache Tomcat здесь. Шаги:

  1. Создайте файл log4j.properties в $CATALINA_HOME/lib
  2. Скачайте и скопируйте log4j-x.y.z.jar в $CATALINA_HOME/lib
  3. Замените $CATALINA_HOME/bin/tomcat-juli.jar на tomcat-juli.jar из папки Apache Tomcat Extras.
  4. Скопируйте tomcat-juli-adapters.jar из папки Apache Tomcat Extras в $CATALINA_HOME/lib
  5. Удалить $CATALINA_BASE/conf/logging.properties
  6. Запустите Tomcat (как службу)

Ожидаемые результаты согласно Руководству

Я должен был увидеть файл tomcat.log в папке $CATALINA_BASE/logs.

Фактические результаты

  • Нет tomcat.log
  • Saw three of the standard logs instead
    • jakarta_service_20101231.log
    • stderr_20101231.log
    • stdout_20101231.log

Вопрос

  • Разве я не должен был хотя бы увидеть файл tomcat.log?

Попытка 2 — использовать ведение журнала Tomcat по умолчанию (общее ведение журнала)

  1. Отменены все изменения из предыдущей настройки
  2. Изменил $CATALINA_BASE/conf/logging.properties, выполнив следующие действия:

    1. Adding a setting for my application in the handlers line: 5rails3.org.apache.juli.FileHandler
    2. Добавление конкретных свойств обработчика

      5rails3.org.apache.juli.FileHandler.level = FINE
      5rails3.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
      5rails3.org.apache.juli.FileHandler.prefix = rails3.
      
    3. Добавление конкретных свойств объекта

      org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/rails3].level = INFO
      org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/rails3].handlers = 4host-manager.org.apache.juli.FileHandler
      
  3. Изменил мой web.xml, добавив следующий параметр контекста в соответствии с разделом Logging в файле README jruby-rack (я также соответствующим образом изменил свой warbler.rb, но решил изменить web.xml напрямую, чтобы быстрее тестировать).

    <context-param>
      <param-name>jruby.rack.logging</param-name>
      <param-value>commons_logging</param-value>
    </context-param>
    
  4. Перезапущенный Томкэт

Результаты

  • Был создан файл журнала (rails3.log), однако в нем не было информации журнала.

Попытка 2A — использовать Log4j с существующей настройкой

Я решил дать Log4j еще один вихрь с этой новой настройкой web.xml.

  1. Скопировал log4j.jar в мою папку WEB-INF/lib
  2. Создал файл log4j.properties и поместил его в WEB-INF/classes

    log4j.rootLogger=INFO, R
    log4j.logger.javax.servlet=DEBUG
    
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=${catalina.base}/logs/rails3.log
    log4j.appender.R.MaxFileSize=5036KB
    log4j.appender.R.MaxBackupIndex=4
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} [%t] %-5p %c %x - %m%n
    
  3. Перезапущенный Томкэт

Результаты

То же, что и попытка 2

ПРИМЕЧАНИЕ. Я использовал log4j.logger.javax.servlet=DEBUG, потому что прочитал в файле README jruby-rack, что все выходные данные журнала автоматически перенаправляются на метод javax.servlet.ServletContext#log. Так что я думал, что это захватит его, но я был явно неправ.

Вопрос

  1. Почему это не сработало?
  2. Разве Log4J не использует commons_logging API?

Попытка 3 - Пробовал slf4j (РАБОТАЛ)

Немного не зная, почему попытка 2A не сработала, я подумал про себя, может быть, я не могу использовать commons_logging для параметра jruby.rack.logging, потому что он, вероятно, не использует commons_logging API... (но я все еще не был уверен). Я видел slf4j как вариант. Я никогда не слышал об этом и из любопытства, я решил найти его. Кратко прочитав об этом, я подумал, что это ничуть не хуже любого, и решил попробовать, следуя инструкциям здесь.

Продолжая настройку попытки 2А:

  1. Скопировал slf4j-api-1.6.1.jar и slf4j-simple-1.6.1.jar в мою папку WEB-INF/lib
  2. Я также скопировал slf4j-log4j12-1.6.1.jar в свою папку WEB-INF/lib
  3. Перезапущенный Томкэт

И ВИОЛА! Теперь у меня есть информация о журнале, поступающая в мой файл rails3.log.

Итак, большой вопрос:

ВТФ?

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


person John    schedule 31.12.2010    source источник


Ответы (2)


Мы также проводили различные эксперименты и, наконец, остановились на варианте slf4j. Исходя из фона Java, мы знали slf4j, поэтому мы не пошли дальше.

<context-param>
   <param-name>jruby.rack.logging</param-name>
   <param-value>slf4j</param-value>
 </context-param>

кстати, нет необходимости копировать slf4j-simple-1.6.1.jar в tomcat/lib или WEB-INF/lib при использовании slf4j-log4jxxx.jar

person so_mv    schedule 22.01.2011

Возможно, ваши ранние тесты с журналированием общих ресурсов показывали файлы с нулевым размером байта из-за размера буфера.

Если ваши записи сбрасываются в файл, когда вы останавливаете Tomcat, то это действительно так, и вы нарушаете буфер размером 8 КБ по умолчанию.

Чтобы отключить, для немедленной очистки попробуйте...

org.apache.juli.FileHandler.bufferSize = -1

на конкретном обработчике...

Итак, для локального хоста...

2localhost.org.apache.juli.FileHandler.bufferSize = -1

person Andrew Smith    schedule 04.07.2013