Статьи

Альтернативные каркасы журналирования для серверов приложений: WebLogic

Введение
Добро пожаловать на второй в серии блогов об использовании альтернативных каркасов журналов с серверами приложений. Эта запись будет посвящена WebLogic, в частности 12c, и его настройке для использования Log4j и SLF4J с Logback.

Первую часть этой серии можно найти здесь: Часть 1 — GlassFish

Как всегда, небольшой отказ от ответственности со средой, которую я использовал: 64-битный Linux Distro, WebLogic 12.1.3, Logback 1.2.2, SLF4J 1.7.7, Log4j 2.0.2 и веб-приложение версии 3.1, со всем кодированием для тесты, выполненные в NetBeans 8.0.

Я предполагаю, что вы создали базовый домен WebLogic, так что давайте начнем с Log4j.

Log4j

Как и при настройке GlassFish для использования Log4j, мы должны скопировать файлы log4j-api-2.0.jar и log4j-core-2.0.jar в домен; загрузите Log4j и скопируйте эти JAR-файлы в $ MW_HOME / user_projects / domains / $ domain_name / lib . Из каталога $ MW_HOME / wlserver / server / lib / скопируйте файл wllog4j.jar в тот же каталог lib домена, что и раньше. WebLogic автоматически добавляет любые JAR-файлы, расположенные в каталоге lib домена, в путь к классам домена.

После этого создайте файл свойств Log4j2 и поместите его в корневой каталог домена ($ MW_HOME / user_projects / domains / $ domain_name ). Я назвал мой log4j2.xml , и вы можете найти его ниже (это тот же, который я использовал в прошлом блоге); это простая конфигурация, которая выводит сообщения журнала любого уровня на консоль:

<?xml version="1.0" encoding="UTF-8"?>  
 <Configuration status="WARN">  
    <Appenders>  
       <Console name="Console" target="SYSTEM_OUT">  
          <PatternLayout pattern="%d{HH:mm} [%t] %-5level %logger{36} - %msg%n"/>  
       </Console>  
    </Appenders>  
    <Loggers>  
       <Root level="trace">  
          <AppenderRef ref="Console"/>  
       </Root>  
    </Loggers>  
 </Configuration> 

Конфигурация выполнена! Просто скажите WebLogic использовать ваш файл конфигурации, запустив его с помощью следующей опции: -Dlog4j.configurationFile = log4j2.xml Вот
так:

./startWebLogic -Dlog4j.configurationFile=log4j2.xml

тестирование

Чтобы убедиться, что он работает, давайте используем тот же тест, что и в моем предыдущем блоге (если он не сломался …), а именно развертывание простого сервлета, который выполняет вызов на каждом уровне журнала. Создайте простое веб-приложение на Java в NetBeans (или IDE по вашему выбору), добавьте сервлет в проект и выполните следующие действия:

  • Импортируйте два JARS Log4j, log4j-api-2.0.jar и log4j-core-2.0.jar , в проект и импортируйте пакет в сервлет

 import org.apache.logging.log4j.*; 

  •  Объявите и инициализируйте регистратор:

private static Logger logger = LogManager.getLogger(TestServlet.class.getName());

  • И измените метод processRequest, чтобы он выглядел так:

 protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
       throws ServletException, IOException 
 {  
      response.setContentType("text/html;charset=UTF-8");  
      try (PrintWriter out = response.getWriter())   
      {  
           logger.trace("Tracing a possible error");  
           logger.debug("Debugging a possible error");  
           logger.info("Gathering info on the possible error");  
           logger.warn("Warning you about the possible error");  
           logger.error("The error is indeed an error");  
      }  
 }

Это будет распечатывать записи журнала, когда будет сделан вызов сервлету.
Добавьте кнопку на домашнюю страницу вашего веб-приложения
index.html , чтобы предоставить вам простой способ вызова сервлета:

<html>
    <head>
        <title>Testing</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form name="testForm" action="TestServlet">
            <input type="submit" value="push me!" name="testybutton" />
        </form>
    </body>
</html>

Создайте и разверните приложение в WebLogic, и вы должны найти сообщения в
файле журнала
out сервера, на котором было запущено приложение, например,
Server-0.out . Для тех, кто плохо знаком с WebLogic, эти файлы журналов можно найти по адресу:
$ MW_HOME / user_projects / domains / $ domain_name / servers / $ server_name / logs

SLF4J с выходом из системы

WebLogic поставляется в комплекте с версией SLF4J, которая может немного усложнить работу при попытке использовать собственную (вероятно, более современную) версию SLF4J с Logback. Для этого вы должны сказать WebLogic игнорировать его версию SLF4J и использовать версию, прилагаемую к вашему приложению.

Для этого давайте использовать то же приложение, которое мы использовали для Log4j, но со следующими изменениями:

  • Загрузите SLF4J и Logback и импортируйте следующие три JAR-файла в проект:
    • SLF4J-апи
    • Logback-жильный
    • Logback-классик

  • Импортируйте следующие два пакета в сервлет 

import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

  •  И измените инициализацию логгера следующим образом:

private static Logger logger = LoggerFactory.getLogger(TestServlet.class.getName()); 

С основным приложением, настроенным для входа в систему, нам нужно создать файл weblogic.xml в каталоге WEB-INF проекта и заполнить его следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
    xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
    http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">

    <wls:container-descriptor>
        <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
    </wls:container-descriptor>
</wls:weblogic-web-app>

Как отмечалось ранее, нам нужно было указать WebLogic использовать связанную версию SLF4J и ее привязку к logback. Именно этот тег предпочитает web-inf-classes , и вы позже даже увидите это в журналах; мы не перезаписываем ранее существующую привязку SLF4J, мы включаем другую в приложение и говорим WebLogic расставить приоритеты, используя эту.

Создайте проект, но не запускайте WebLogic и не развертывайте его; нам все еще нужно создать файл конфигурации для использования в WebLogic.

Создайте файл свойств Logback logback.xml и поместите его в корневой каталог домена ( $ MW_HOME / user_projects / domains / $ domain_name ). Вот основной, который просто печатает на консоль:

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="TRACE">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

And with that, besides a start-up parameter, you’re done! This will cause all log messages of any level to be printed to the server’s
out log file. Start WebLogic as below, and you’re good to go! 

 ./startWebLogic -Dlogback.configurationFile=logback.xml 

Wrapping Up

And so concludes the second part in this logging series, hopefully giving you a starting point for using Log4j or Logback with WebLogic. Next up on the list is Wildfly, so stay tuned for that. Feel free to check out some of our other blogs on WebLogic in the meantime: 
Weblogic — Dynamic Clustering in practice
WebLogic 12c Does WebSockets — Getting Started
Common WebLogic Problems