用SLF4J和Guidce记录日志

又一次对java.util.logger无语的时候,我在想如何用SLF4J logger取代它。尽管Guice针对java.util.logger提供一个非常好的内部绑定,slf4j提供一个更好的语法。永远是细节中的魔鬼…如果你想你的logger与当前类一起初始化,你不能简单地注入logger。但是,在Guice中有一个好教程(http://code.google.com/p/google-guice/wiki/CustomInjections):关于注入log4j looger。SLF4J也是这样工作的。

首先你需要一个新的注解,像这样注入InjectLogger:

import static java.lang.annotation.ElementType.FIELD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; 
@Target({FIELD}) @Retention(RetentionPolicy.RUNTIME)

public @interface InjectLogger { }

然后是一个TypeListener,用注解InjectLogger监听org.slf4j.Logger类。

import java.lang.reflect.Field;
import org.slf4j.Logger;
import com.google.inject.TypeLiteral;
import com.google.inject.spi.TypeEncounter;
import com.google.inject.spi.TypeListener;
public class Slf4jTypeListener implements TypeListener {
    public <I> void hear(TypeLiteral<I> aTypeLiteral,
         TypeEncounter<I> aTypeEncounter) {
         for (Field field : aTypeLiteral.getRawType().getDeclaredFields()) {
                if (field.getType() == Logger.class &&
                        field.isAnnotationPresent(InjectLogger.class)) {
                        aTypeEncounter.register(new Slf4jMembersInjector<I>(field));
                }
        }
  }
} 

最后,需要Slf4jMembersInjector(Slf4j 成员注入),做实际注入:

import java.lang.reflect.Field;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.MembersInjector;
public class Slf4jMembersInjector<T> implements MembersInjector<T> {
    private final Field field;
    private final Logger logger;
    Slf4jMembersInjector(Field aField) {
      field = aField;
      logger = LoggerFactory.getLogger(field.getDeclaringClass());
       field.setAccessible(true);
    }
    public void injectMembers(T anArg0) {
       try {
        field.set(anArg0, logger);
      } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
      }
    }
} 

现在只需要在模块类内部绑定TypeListener:

bindListener(Matchers.any(), new Slf4jTypeListener());

实际应用是简单的,但是我们需要用@InjectLogger而不是@Inject.

@InjectLogger Logger logger; 

转载自 并发编程网 - ifeve.com

时间: 2024-10-21 19:56:21

用SLF4J和Guidce记录日志的相关文章

《SLF4J官方文档》SLF4J-FAQ 常见问题解答(一)

一般性问题 什么是SLF4J? 什么时候应该使用SLF4J? SLF4J仍是另一个日志外观吗? 如果SLF4J可修复JCL,那为什么不在JCL里加入修复而是创建一个新项目? 使用SLF4J时,我必须重新编译我的应用以转换到一个不同的日志系统吗? SLF4J的要求是什么? SLF4J向后兼容版本吗? 使用SLF4J时遇到访问权限错误,原因是什么? 为什么SLF4J是在X11类型许可证下许可而不是Apache软件许可? 10.在哪里能获得特定的SLF4J绑定? 11.我的库应该尝试配置logging

was7 slf4j logback 无法产生日志文件

问题描述 java项目,目前采用slf4j+logback记录日志,tomcat运行输出无问题.但将应用部署到was7就无法生存日志文件.求给位大牛不吝赐教<?xmlversion="1.0"encoding="UTF-8"?><configuration><propertyname="LOGBACK_HOME"value="C:/temp/logs/"/><!--toconsole-

《SLF4J官方文档》SLF4J-FAQ 常见问题解答(二)

替代3)空构件 另一种方法是依靠一个空的commons-logging.jar构件.这个聪明的办法首先 由Erik van Oosten想出和最初支持. 空构件可从一个http://version99.qos.ch高可用性Maven仓库,复制在位于不同地域的多个主机. 下面的声明添加version99库设定的Maven的搜索远程资源库. 该存储库中包含的commons-logging和log4j的空构件. 顺便说一句,如果你使用的version99库,请在<version99 AT qos.ch

Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析

应用场景 随着项目的逐渐扩大,日志的增加也变得更快.Log4j是常用的日志记录工具,在有些时候,我们可能需要将Log4j的日志发送到专门用于记录日志的远程服务器,特别是对于稍微大一点的应用.这么做的优点有: 可以集中管理日志:可以把多台服务器上的日志都发送到一台日志服务器上,方便管理.查看和分析 可以减轻服务器的开销:日志不在服务器上了,因此服务器有更多可用的磁盘空间 可以提高服务器的性能:通过异步方式,记录日志时服务器只负责发送消息,不关心日志记录的时间和位置,服务器甚至不关心日志到底有没有记

介绍在Java程序中记录日志的最佳实践

本文介绍了在Java程序中记录日志的最佳实践,同时也介绍了如何使用开源软件对日志进行聚合和分析.对于现在的应用程序来说,日志的重要性是不言而喻的.很难想象没有任何日志记录功能的应用程序运行在生产环境中.日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息.状态信息.调试信息和执行http://www.aliyun.com/zixun/aggregation/18195.html">时间信息等.在生产环境中,日志是 查找问题来源的重要依据.应用程序运行时的产生的各种信息,都应该通

简化SLF4J和通用日志工具的区别

这就是为什么现在每个人都用SLF4J的原因:) 下面是如何追踪和更新你的SLF4J日志: 首先,查询slf4j绑定的类路径. 然后,确保只有一个这样的绑定. 最后,当你找到正在被使用的绑定:查阅它的配置特性. 另一方面-下面是如何追踪通用日志: 首先,你得找到日志绑定是如何实现. 检查commons-logging.properties 里的org.apache.commons.logging.log的属性是否设置,或通过应用里的Commons Logging API设置. 如果没有设置,检查路

.NET Core下的日志(1):记录日志信息

记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关API定义在命名空间"System.Diagnostics"中)实现对日志的记录..NET Core提供了独立的日志模型使我们可以采用统一的API来完成针对日志记录的编程,我们同时也可以利用其扩展点对这个模型进行定制,比如可以将上述这些成熟的日志框架整合到我们的应用中.本系列文章旨在从设计和

logback slf4j管理 日志

注:使用logback和log4j十分相似, log4j的属性配置文件可以通过工具http://logback.qos.ch/translator/转换为logback的配置文件放到类路径里面去,另外再将logback的类库logback-core,logback-classic加入到类路径中去就搞定了. 一.下载组件: slf4j:http://www.slf4j.org/download.htmllogback:http://logback.qos.ch/download.html Logb

logback + slf4j + jboss + spring mvc

logback.log4j.log4j2 全是以同一个人为首的团伙搞出来的(日志专业户!),这几个各有所长,log4j性能相对最差,log4j2性能不错,但是目前跟mybatis有些犯冲(log4j2的当前版本,已经将AbstractLoggerWrapper更名成ExtendedLoggerWrapper,但是mybatis 2.3.7依赖的仍然是旧版本的log4j2,所以mybatis使用log4j2会报错),说到日志,还要注意另一外项目SLF4J( java的世界里,记日志的组件真是多!)