首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CustomInjections for log4j2

CustomInjections for log4j2
EN

Stack Overflow用户
提问于 2017-04-04 22:41:56
回答 1查看 331关注 0票数 3

我一直试图跟踪CustomInjections文档,但为log4j2更新了它。我似乎错过了InjectLogger课程。

有没有什么想法,我错过了什么,或有人有一个工作的例子,我可以看到?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-05 02:50:32

InjectLogger是一个自定义注释类型,由您自己定义。

下面是一个简单的例子:

Log4j2CustomInjection.java

代码语言:javascript
复制
package test.guice;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;

public class Log4j2CustomInjection {

  public static void main(String[] args) {
    Injector injector =
        Guice.createInjector(
            new AbstractModule() {
              @Override
              protected void configure() {
                bind(PaymentService.class).asEagerSingleton();
                bindListener(Matchers.any(), new Log4JTypeListener());
              }
            });

    PaymentService ps = injector.getInstance(PaymentService.class);
    ps.logger.info("hello");
  }
}

PaymentService.java

代码语言:javascript
复制
package test.guice;

import org.apache.logging.log4j.Logger;

public class PaymentService {
  @InjectLogger Logger logger;
}

InjectLogger.java

代码语言:javascript
复制
package test.guice;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface InjectLogger {}

Log4JTypeListener.java

代码语言:javascript
复制
package test.guice;

import com.google.inject.TypeLiteral;
import com.google.inject.spi.TypeEncounter;
import com.google.inject.spi.TypeListener;
import java.lang.reflect.Field;
import org.apache.logging.log4j.Logger;

class Log4JTypeListener implements TypeListener {
  public <T> void hear(TypeLiteral<T> typeLiteral, TypeEncounter<T> typeEncounter) {
    Class<?> clazz = typeLiteral.getRawType();
    while (clazz != null) {
      for (Field field : clazz.getDeclaredFields()) {
        if (field.getType() == Logger.class && field.isAnnotationPresent(InjectLogger.class)) {
          typeEncounter.register(new Log4JMembersInjector<>(field));
        }
      }
      clazz = clazz.getSuperclass();
    }
  }
}

Log4JMembersInjector.java

代码语言:javascript
复制
package test.guice;

import com.google.inject.MembersInjector;
import java.lang.reflect.Field;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

class Log4JMembersInjector<T> implements MembersInjector<T> {
  private final Field field;
  private final Logger logger;

  Log4JMembersInjector(Field field) {
    this.field = field;
    this.logger = LogManager.getLogger(field.getDeclaringClass());
    field.setAccessible(true);
  }

  public void injectMembers(T t) {
    try {
      field.set(t, logger);
    } catch (IllegalAccessException e) {
      throw new RuntimeException(e);
    }
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43218912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档