Не удается заставить java .util протоколирование Tomcat работать с указанным c классом. - PullRequest
0 голосов
/ 13 февраля 2020

Я использую Liferay 7.0, который работает в контейнере Tomcat 8.0.

Во время запуска я регистрирую указанный класс c для ловушки Liferay. Этот класс должен быть в системном classpath Tomcat. Таким образом, файл .jar находится в CATALINA_BASE/lib/ext

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

Я изменил Tomcat logging.properties следующим образом (изменения выделены жирным шрифтом)

Сначала я определил дополнительный обработчик:

handlers = 1catalina.org.apache.juli.AsyncFileHandler, <b>2myhandler.org.apache.juli.AsyncFileHandler</b>, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

Обработчик настроен следующим образом:

2myhandler.org.apache.juli.AsyncFileHandler.level = FINE
2myhandler.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2myhandler.org.apache.juli.AsyncFileHandler.prefix =  my-class.
2myhandler.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter
2myhandler.java.util.logging.SimpleFormatter.format=%1$tF %1$tT %4$s [%2$s] %5$s %6$s %n

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

com.mypackage.MyClass.level = ALL
com.mypackage.MyClass.handlers = 2myhandler.org.apache.juli.AsyncFileHandler
com.mypackage.MyClass.useParentHandlers=false

Мой класс использует

private static final LOGGER = Logger.getLogger("com.mypackage.MyClass");

Когда Tomcat запускается, файл my-hook.log создано (с отметкой времени в имени файла).

Но ни одно из моих сообщений журнала не появляется в файле.

В коде, который у меня есть, например, следующее в конструкторе:

logger.log(Level.INFO, "MyClass initialized");
System.out.println("*** MyClass loaded ***");

Когда я запускаю Liferay, я вижу сообщение *** MyClass loaded *** в окне консоли, но сообщение журнала не записано в (существующий) файл.

Что мне здесь не хватает?

Обратите внимание, что я не могу переключиться на Log4J (который я использую в своих портлетах Liferay), потому что это вызывает конфликт загрузчика классов между Log4j, предоставленным Liferay, и тем, что в lib/ext

1 Ответ

0 голосов
/ 13 февраля 2020

Таким образом, файл .jar находится в CATALINA_BASE / lib / ext

В моей установке Tomcat 8 я вижу CATALINA_BASE / lib, но нет подкаталога с именем ext. Я думаю, вы захотите убедиться, что системное свойство для common.loader показывает ext в пути. На моей машине нет пути ext:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"

Когда я запускаю Liferay, я вижу сообщение * MyClass загружено * в окне консоли, но сообщение журнала не записывается в (существующий) файл.

Итак, загрузчик классов может найти ваш класс, и ваш обработчик был создан, потому что файл существует. Измените MyClass, чтобы включить код из DebugLogging . Включите вспомогательные функции и скопируйте тело метода main в конструктор MyClass. Это позволит отследить, как выглядит дерево логгера. Включите вывод в ответ.

package com.mypackage;

import java.io.PrintStream;
import java.util.Enumeration;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class MyClass {

    private static final String CLASS_NAME = MyClass.class.getName();
    private static final Logger logger = Logger.getLogger(CLASS_NAME);


    public static void main(String[] args) {
        new MyClass();
    }

    public MyClass() {
        logger.log(Level.INFO, "MyClass initialized");
        System.out.println("*** MyClass loaded ***");
        logger.log(Level.FINEST, "Finest");
        logger.log(Level.FINER, "FINER");
        logger.log(Level.FINE, "FINE");
        logger.log(Level.CONFIG, "CONFIG");
        logger.log(Level.INFO, "INFO");
        logger.log(Level.WARNING, "WARNING");
        logger.log(Level.SEVERE, "SEVERE");
        logger.finest("Finest Log");
        logger.finer("Finer Log");
        logger.fine("Fine Log");
        logger.config("Config Log");
        logger.info("Info Log");
        logger.warning("Warning Log");
        logger.severe("Severe Log");
        printConfig(System.out);
    }

    private static void printConfig(PrintStream ps) {
        LogManager lm = LogManager.getLogManager();
        ps.append("LogManager=").append(lm.getClass().getName());
        ps.append("@");
        printLoader(lm, ps);
        ps.println();
        synchronized (lm) {
            Enumeration<String> e = lm.getLoggerNames();
            while (e.hasMoreElements()) {
                Logger l = lm.getLogger(e.nextElement());
                if (l != null) {
                    print(l, ps);
                }
            }
        }
    }

    private static void print(Logger l, PrintStream ps) {
        ps.append("scn=").append(l.getClass().getSimpleName());
        ps.append("@");
        printLoader(l, ps);
        ps.append(", n=").append(String.valueOf(l.getName()));
        ps.append(", uph=").append(String.valueOf(l.getUseParentHandlers()));

        ps.append(", l=").append(String.valueOf(l.getLevel()));
        ps.append(", fl=").println(String.valueOf(l.getFilter()));
        for (Handler h : l.getHandlers()) {
            ps.append("\t").append(l.getName()).append("->");
            ps.append(h.getClass().getName());
            ps.append("@");
            printLoader(h, ps);
            ps.append(", h=")
                    .append(String.valueOf(h.getLevel())).append(", fl=")
                    .append(String.valueOf(h.getFilter())).println();
        }
    }

    private static void printLoader(Object o, PrintStream ps) {
        if (o != null) {
            Object cl = o.getClass().getClassLoader();
            if (cl != null) {
                ps.append(cl.getClass().getSimpleName());
            } else {
                ps.append("null");
            }
        } else {
            ps.append("null");
        }
    }
}

Ваш обработчик объявлен в обработчиках . Так что этого должно быть достаточно, чтобы использовать обработчик. Наличие файла показывает, что обработчик был создан.

На моем компьютере выходные данные отладки показывают, что обработчик был настроен:

scn=Logger@null, n=com.mypackage.MyClass, uph=false, l=ALL, fl=null
com.mypackage.MyClass->org.apache.juli.AsyncFileHandler@AppClassLoader, h=FINE, fl=null

Журнал файла содержит:

2020-02-15 11:48:55 INFO [com.mypackage.MyClass <init>] MyClass initialized  
2020-02-15 11:48:55 FINE [com.mypackage.MyClass <init>] FINE  
2020-02-15 11:48:55 CONFIG [com.mypackage.MyClass <init>] CONFIG  
2020-02-15 11:48:55 INFO [com.mypackage.MyClass <init>] INFO  
2020-02-15 11:48:55 WARNING [com.mypackage.MyClass <init>] WARNING  
2020-02-15 11:48:55 SEVERE [com.mypackage.MyClass <init>] SEVERE  
2020-02-15 11:48:55 FINE [com.mypackage.MyClass <init>] Fine Log  
2020-02-15 11:48:55 CONFIG [com.mypackage.MyClass <init>] Config Log  
2020-02-15 11:48:55 INFO [com.mypackage.MyClass <init>] Info Log  
2020-02-15 11:48:55 WARNING [com.mypackage.MyClass <init>] Warning Log  
2020-02-15 11:48:55 SEVERE [com.mypackage.MyClass <init>] Severe Log  

Согласно документации вы можете указать системное свойство org.apache.juli.ClassLoaderLogManager.debug=true для Tomcat, которое будет отправлять информацию о конфигурации в System.err. Это может помочь вам в дальнейшем устранении неполадок.

...