Статьи

Регистрация уровня приложения в OpenShift

Сегодня вечером я прочитал хорошую статью о реализации ведения журналов на уровне приложений с использованием log4J, и я подумал, что эту концепцию можно расширить и абстрагировать еще на один уровень, используя API ведения журнала Apache Commons . Использование API ведения журнала Apache Commons позволяет абстрагировать реализацию журналирования от приложения; в результате код приложения регистрируется, который можно использовать повторно, даже если реализация ведения журнала изменяется. В течение многих лет была некоторая критика API Commons Logging, и я обращусь к этому, сказав, что тот же принцип может быть применен к другому фасаду регистрации, подобному SLF4J .

Хватит говорить, давайте начнем …

Шаг 1:

Сначала я создал приложение JBoss AS7 в OpenShift под названием «commonslogging».

Затем я открыл командную строку (или терминал) и клонировал репозиторий Git на свой компьютер, используя команду Git, указанную OpenShift при создании проекта.

Шаг 2:

Затем я импортировал проект как проект Maven в Eclipse, используя локальный репозиторий Git.

образ

Рисунок 1: Импорт проекта в Eclipse

образ

Рисунок 2: Создание нового проекта Maven в Eclipse

Шаг 3:

Затем вам нужно будет загрузить API Commons Logging и реализацию log4J, если у вас их еще нет. Вы можете найти их здесь:

Затем я добавил зависимости Commons Logging и log4j в файл Maven pom.xml.

<dependency>
    <groupid>commons-logging</groupid>
    <artifactid>commons-logging</artifactid>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupid>log4j</groupid>
    <artifactid>log4j</artifactid>
    <version>1.2.17</version>
</dependency>

Шаг № 4:

Затем разверните папку / src / main / webapp и создайте новый файл «index.jsp».

Заменить содержимое следующим:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>OpenShift Apache Commons Logging Test</title>
</head>
<body>
    This is a test page to demonstrate a test with Apache Commons
    Logging and log4j application level logging.
    <p>
        <a href="Log4jTest">Click here to Invoke Logger</a>
    </p>
</body>
</html>

Вы можете удалить файл «index.html», созданный мастером приложения OpenShift.

Шаг № 5:

Создайте новый класс Java «Log4jTest.java» в папке / src / main / java.

Замените содержимое по умолчанию следующим кодом:

package org.ericsilva.openshift.commonslogging;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Tests the log4j implemenation using Apache Commons Logging API.
 * 
 * @author Eric Silva (ES)
 */
public class Log4jTest extends HttpServlet {

    /**
     * Serialization UID.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Logger instance
     */
    private Log log = LogFactory.getLog("test");

    /**
     * {@inheritDoc}
     */
    protected void doGet(
                    HttpServletRequest request,
                    HttpServletResponse response) throws ServletException,
                    IOException {
        log.info("from log4j=== test log4j log");
        log.debug("from log4j=== test log4j debug log");
        log.error("from log4j=== test log4j error log");

        System.out
            .println("from system.out.println==== test system.out.println log");
        System.err
            .println("from system.err.println==== test system.error.println log");

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("from printwriter=== test printwriter log");

        try {
            List<String> ar = new ArrayList<String>();
            ar.add("1");
            ar.add("2");

            log.info("from log4j=== get arraylist index=2" + ar.get(2));
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
            log.error("from log4j=== error===" + e.getMessage(), e);
            System.err.println("from system.err.println=== error==="
                + e.getMessage());
        }

        out.close();
    }
}

Шаг № 6:

Откройте файл «web.xml» в папке / src / main / webapp / WEB-INF и добавьте следующее отображение сервлета:

<servlet>
    <servlet-name>Log4jTest</servlet-name>
    <servlet-class>org.ericsilva.openshift.commonslogging.Log4jTest</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Log4jTest</servlet-name>
    <url-pattern>/Log4jTest</url-pattern>
</servlet-mapping>

Вам нужно будет изменить имя пакета файла Log4jTest.java на имя пакета, которое вы использовали при создании файла.

Шаг № 7:

Создайте новый файл «log4j.properties» в папке / src / main / resources.

Вставьте следующее содержимое в файл:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

log4j.rootLogger=INFO, test
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{MM/dd HH:mm:ss.SSS}][%p]%c{1}:%L - %m%n
log4j.appender.CONSOLE.Threshold=INFO

# My Application Log
log4j.appender.test=org.apache.log4j.RollingFileAppender
log4j.appender.test.File=logs/application.log
log4j.appender.logfile.Threshold=INFO
log4j.appender.test.MaxBackupIndex=100
log4j.appender.test.MaxFileSize=1Gb
log4j.appender.test.encoding=UTF8
log4j.appender.test.layout=org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern=<%d> <%t> <%p> <%F:%L> - %m%n

Шаг № 8:

Последнее, что нам нужно сделать, — это создать папку «META-INF» в папке / src / main / webapp и добавить файл дескриптора «jboss-deploy-structure.xml», чтобы указать ей использовать API регистрации Commons вместо стандартная реализация «java.util.logging».

После создания папки META-INF и дескриптора XML добавьте следующее содержимое в файл XML:

<jboss-deployment-structure>
  <deployment>
    <exclusions>
        <module name="org.apache.commons.logging" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

Шаг № 9:

Затем зафиксируйте ваши изменения в вашем локальном репозитории Git, а затем отправьте изменения обратно в OpenShift. OpenShift автоматически попытается развернуть ваш новый код.

Шаг № 10:

Затем откройте URL вашего приложения в вашем любимом браузере, например, http://commonslogging-ericsilva.rhcloud.com/

Нажмите на ссылку на странице. Это приведет к ошибке, которая появится в файле журнала вашего приложения.

Для получения информации о том, как подключиться через SSH к вашему приложению для доступа к командной строке, я предлагаю прочитать эту статью .

Удачного кодирования. Я действительно хочу сделать больше с OpenShift.