Получить пользовательский регистратор через LogManger.getLogger()

Я хотел бы знать, как получить мой собственный регистратор с помощью метода LogManger.getLogger() log4j.

Я почти уверен, что моему проекту не нужен специальный регистратор, и я использую стандартный логгер log4j.

Но, в случае необходимости, я хочу изменить все регистраторы в исходном коде с помощью своего собственного регистратора.

Могу ли я сделать это, просто изменив файл настроек или исходный код LoggerFactory?

Если этот пост повторяется, пожалуйста, поместите ссылку, чтобы привести меня туда.

Благодарю.

2 ответа

Решение

Рекомендуемый метод - изменить файл конфигурации и установить для флага наблюдения значение true. Если вы хотите продвинуться вперед, используя подход с исходным кодом, см. Ниже.

Это довольно сложный процесс, который включает приведение к типу log4j.core.logger для предоставления защищенных методов, которые скрыты интерфейсом Logger. Я также должен дать отказ от ответственности, что это касается защищенных методов в core.logger, которые могут быть изменены в любое время.

К счастью для вас, я только что решил эту проблему и приведу пример кода.

/**
 * Dynamically creates an instance of a Logger.
 * 
 * @param appenderName
 *            most often will be the name of the class this logger will
 *            belong to.
 * @param logFileName
 *            the file name to save the logs to
 * @return
 */
public static org.apache.logging.log4j.Logger createInstanceLogger(String appenderName,
        String logFileName) {
    //call getLogger() which will create and load a logger with a default configuration
    org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager
            .getLogger(String.format("DynamicLogger%s",
                    String.valueOf(DynamicLogManager.loggerCount++)));
    org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger; // cast logger to core logger to access protected methods
    org.apache.logging.log4j.core.LoggerContext context = coreLogger.getContext();
    org.apache.logging.log4j.core.config.BaseConfiguration configuration = (org.apache.logging.log4j.core.config.BaseConfiguration) context
            .getConfiguration();

    TriggeringPolicy compositePolicy = CompositeTriggeringPolicy.createPolicy(
            SizeBasedTriggeringPolicy.createPolicy("5mb"),
            TimeBasedTriggeringPolicy.createPolicy("1", "true"));

    String fileName = String.format("%1$s/%2$s", appenderName, logFileName);
    String filePattern = String.format("%1$s/%2$s.%%d{yyyy-MM-dd}",
            appenderName, logFileName);

    Layout<String> layout = PatternLayout.createLayout(DynamicLogManager._conversionPattern,
            configuration, RegexReplacement.createRegexReplacement("a^", "."), //empty regex replacement
            "utf-8", "false");

    Filter f = ThresholdFilter.createFilter("trace", "accept", "accept");

    Appender a = RollingFileAppender.createAppender(fileName, //fileName
            filePattern, //filePattern
            "true", //append
            appenderName, //appender name
            "true", //bufferred io
            "true", //immediate flush
            compositePolicy, //policy
            null, //strategy default
            layout, //layout
            f, //filter none
            "true", //ignore exceptions
            "false", //advertise
            "null", //advertise uri
            configuration //configuration
            );

    a.start();

    coreLogger.addAppender(a);

    //this is where we would figure out how to configure the logger to listen on a configuration file
    coreLogger.setLevel(Level.ALL); //set the log level of the logger that we are returning to Level.ALL

    return coreLogger; //cast logger back to Logger interface

Изменить после вашего комментария:

Кажется, вы просто хотите добавить свой регистратор в конфигурацию xml и извлечь его из кода Java, это очень легко сделать...

  <Loggers>
    <Logger name="com.foo.Bar" level="trace" additivity="false">
      <AppenderRef ref="whateverAppenderName"/>
    </Logger>
    <Root level="error">
      <AppenderRef ref="whateverOtherAppenderName"/>
    </Root>
  </Loggers>

тогда в коде Java:

package com.foo;
class Bar{
private static final Logger log = LogManager.getLogger(); //qualified class name is com.foo.Bar
}

Регистрация в log4j также является иерархической. Это означает, что если вы определите регистратор с именем "com.foo", он будет захвачен всеми дочерними элементами этого пакета, если он является наиболее доступным регистратором (то есть у вас нет более конкретного имени регистратора для этого конкретного класса)

Прочитайте это... http://logging.apache.org/log4j/2.x/manual/configuration.html

Пожалуйста, посмотрите на https://issues.apache.org/jira/browse/LOG4J2-519

Обратите внимание, что генератор кода, прикрепленный к этому билету, является экспериментальным, и пользовательские / расширенные регистраторы, созданные с помощью этого инструмента, могут выйти из строя в будущих выпусках log4j-2.0.

Другие вопросы по тегам