java - 使用 JClouds 和 Guice 依赖注入(inject)创建自定义记录器

标签 java guice jclouds

我只是被困住了,需要一些指导。我已经按照说明创建了自己的日志记录实现、日志记录工厂和 guice 模块;但只是不确定我错过了什么......

我的自定义记录器是通过工厂实现的。这从 jClouds BaseLogger 延伸而来。 ;未显示的是实际的日志记录功能。还创建了工厂,它是我基于其 Log4JLogger Factory 的实现而创建的。 。在此,我需要一个静态 getLogger 并使用 slf4j 的 LoggerFactory 并将其转换为 jClouds 接口(interface)类型 Logger。我添加了“@Inject”注释,但我觉得这应该是在 jClouds 端,而不是我的。 (没有把握)。我错过了什么??

import org.jclouds.logging.BaseLogger;
import org.jclouds.logging.Logger;
import com.google.inject.Inject;

public class NullLoggerExt extends BaseLogger {
  private final org.jclouds.logging.Logger logger;

  public static class NullLoggerExtFactory implements LoggerFactory {
    public Logger getLogger(String category) {
      return new NullLoggerExt( (Logger) org.slf4j.LoggerFactory.getLogger(category) );
    }
  }

  @Inject   <--- is this what I need?
  public NullLoggerExt(org.jclouds.logging.Logger logger) {
    this.logger = logger;
  }
  .
  . (implemented abstract methods)
  .
}

我的自定义记录器模块

import NullLoggerExt;

import org.jclouds.logging.Logger.LoggerFactory;
import org.jclouds.logging.config.LoggingModule;

public class NullLoggerModuleExt extends LoggingModule {

  @Override
  public LoggerFactory createLoggerFactory() {
    return new NullLoggerExt.NullLoggerExtFactory();
  }
}

我的 Guice 模块

import NullLoggerExt;
import com.google.inject.AbstractModule;
import org.jclouds.logging.Logger;

public class BindLoggerModule extends AbstractModule {

  @Override
  protected void configure() {
    bind(Logger.class).to(NullLoggerExt.class);
  }
}

本节将描述我在哪里使用它。

public class CloudHandler
{
  //Actual logger
  private static final Iterable<Module> detailedTrace = 
            ImmutableSet.<Module> of( new SLF4JLoggingModule() );

  Injector injector = Guice.createInjector(new BindLoggerModule());
  NullLoggerModuleExt customLog = injector.getInstance(NullLoggerModuleExt.class);

  //My performance logger
  private final Iterable<Module> baseLog =  
            ImmutableSet.<Module> of( customLog );

  public int connect( ... ) {
    contextBuilder...

    //Problem area
    if (debug mode == true)
      contextBuilder.modules( detailedTrace );
    else
      contextBuilder.modules( baseLog );

    //Throws CreationException
    ctx = contextBuilder.buildView( BlobStoreContext.class );
    return Success or Failure;
  }
}

最佳答案

这种方法是错误的,因为您试图注入(inject)绑定(bind)到完全相同的类的 Logger 实现,因此您将在那里得到一个递归循环。

如果您只是想修改 SLF4j 日志记录驱动程序的工作方式,您可以扩展它的类。但是,如果您尝试使用 null 记录器“装饰”任何 jclouds 记录器,然后在需要时委托(delegate)给日志记录驱动程序,则可以使用以下日志记录类和模块来寻求更通用的方法:

static class DelegatingNullLogger extends BaseLogger {
    private final Logger logger;

    public static class DelegatingNullLoggerFactory implements LoggerFactory {
        private final LoggerFactory delegate;

        public DelegatingNullLoggerFactory(LoggerFactory delegate) {
            this.delegate = checkNotNull(delegate, "delegate");
        }

        @Override
        public Logger getLogger(String category) {
            return new DelegatingNullLogger(delegate.getLogger(category));
        }
    }

    public DelegatingNullLogger(Logger logger) {
        this.logger = logger;
    }

    // Implement methods
}

static class NullDelegatingLoggingModule extends LoggingModule {
    private final LoggerFactory loggerFactory;

    public NullDelegatingLoggingModule(LoggerFactory loggerFactory) {
        this.loggerFactory = checkNotNull(loggerFactory, "loggerFactory");
    }

    @Override
    public LoggerFactory createLoggerFactory() {
        return new DelegatingNullLogger.DelegatingNullLoggerFactory(loggerFactory);
    }
}

此代码将首先创建一个记录器,当涉及到日志消息时,该记录器将委托(delegate)给底层记录器,可以是 Log4j、SLF4j 或其他记录器,并且提供的模块配置将传递的委托(delegate)记录器。

您可以按如下方式使用它,例如将 null 记录器委托(delegate)给 SLF4j 日志记录驱动程序:

LoggerFactory loggerFactory = new SLF4JLogger.SLF4JLoggerFactory();
LoggingModule loggingModule = new NullDelegatingLoggingModule(loggerFactory);

BlobStoreContext ctx = ContextBuilder.newBuilder("provider")
        .modules(ImmutableSet.of(loggingModule))
        (...)
        .buildView(BlobStoreContext.class);

关于java - 使用 JClouds 和 Guice 依赖注入(inject)创建自定义记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28722666/

相关文章:

java - Swing GTK L&F 标题栏上的额外按钮

dependency-injection - 何时提供显式绑定(bind)以及何时利用 Guice 上的自动绑定(bind)

java - 无法使用 jclouds API 将文件上传到 azure blob

java - 让 Spring 的 IoC 容器以零配置实例化 beans(如 Google Guice 的行为)

java - 实例化每个范围/组的单例 - 陷入 Guice 依赖 hell

java - 云 : Amazon, Google、Microsoft - 我可以使用哪种框架?

java - 如何使用 Jclouds 1.7 访问 native 提供程序 API

java - Mockito 和 ReloadableResourceBundleMessageSource 不能很好地结合在一起吗?

java - 如何从给定日期获取整数月份并打印为月份名称格式 ("MMM")

java - 为什么当我更改最大堆大小时 Eclipse 打不开?