`
pittlu
  • 浏览: 15494 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给Slf4j加个壳,超简单易用的通用日志器Logs,全静态方法支持

 
阅读更多
实际项目开发中,发现许多开发人员(特别是新人)不喜欢记录日志,主要原因可能是目前的日志器都需要从日志工厂声明好日志对象然后才能使用,以apache logging为例:
Log log = LogFactory.getLog("XXXXX");//声明日志器

这一点让开发人员感觉麻烦,甚至于整个项目中经常出现sysout打印,严重影响性能和可控性。那么,为什么日志器不能仅仅是一系列的静态方法并且使用超简单的类型声明呢(如Logs)?答案是可以的(什么?性能问题?看看我的实现的,不会有太大的性能问题 )。Logs类做到了这一点,代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.spi.LocationAwareLogger;

/**
 * 通用日志器,依赖于slf4j的API,最大限度优化性能
 * 
 * 
 */
public class Logs {

	private static final Object[] EMPTY_ARRAY = new Object[] {};
	private static final String FQCN = Logs.class.getName();

	/**
	 * 获取适配日志器,供内部调用
	 * 
	 * @return
	 */
	@SuppressWarnings("restriction")
	private static LocationAwareLogger getLocationAwareLogger(final int depth) {
		String className = sun.reflect.Reflection.getCallerClass(depth)
				.getName();
		return (LocationAwareLogger) LoggerFactory.getLogger(className);
	}

	/**
	 * 静态的获取日志器
	 * 
	 * @return
	 */
	public static Logger getLogger() {
		return getLocationAwareLogger(3);
	}

	public static String getName() {
		return getLocationAwareLogger(3).getName();
	}

	public static boolean isTraceEnabled() {
		return getLocationAwareLogger(3).isTraceEnabled();
	}

	public static void trace(String msg) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.TRACE_INT, msg, EMPTY_ARRAY, null);
	}

	public static void trace(String format, Object arg) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.TRACE_INT, format, new Object[] { arg },
				null);
	}

	public static void trace(String format, Object arg1, Object arg2) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.TRACE_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void trace(String format, Object... arguments) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.TRACE_INT, format, arguments, null);
	}

	public static void trace(String msg, Throwable t) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.TRACE_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isTraceEnabled(Marker marker) {
		return getLocationAwareLogger(3).isTraceEnabled(marker);
	}

	public static void trace(Marker marker, String msg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.TRACE_INT, msg, EMPTY_ARRAY, null);
	}

	public static void trace(Marker marker, String format, Object arg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.TRACE_INT, format, new Object[] { arg },
				null);
	}

	public static void trace(Marker marker, String format, Object arg1,
			Object arg2) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.TRACE_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void trace(Marker marker, String format, Object... argArray) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.TRACE_INT, format, argArray, null);
	}

	public static void trace(Marker marker, String msg, Throwable t) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.TRACE_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isInfoEnabled() {
		return getLocationAwareLogger(3).isInfoEnabled();
	}

	public static void info(String msg) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.INFO_INT,
				msg, EMPTY_ARRAY, null);
	}

	public static void info(String format, Object arg) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.INFO_INT,
				format, new Object[] { arg }, null);
	}

	public static void info(String format, Object arg1, Object arg2) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.INFO_INT,
				format, new Object[] { arg1, arg2 }, null);
	}

	public static void info(String format, Object... arguments) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.INFO_INT,
				format, arguments, null);
	}

	public static void info(String msg, Throwable t) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.INFO_INT,
				msg, EMPTY_ARRAY, t);
	}

	public static boolean isInfoEnabled(Marker marker) {
		return getLocationAwareLogger(3).isInfoEnabled(marker);
	}

	public static void info(Marker marker, String msg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.INFO_INT, msg, EMPTY_ARRAY, null);
	}

	public static void info(Marker marker, String format, Object arg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.INFO_INT, format, new Object[] { arg },
				null);
	}

	public static void info(Marker marker, String format, Object arg1,
			Object arg2) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.INFO_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void info(Marker marker, String format, Object... argArray) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.INFO_INT, format, argArray, null);
	}

	public static void info(Marker marker, String msg, Throwable t) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.INFO_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isDebugEnabled() {
		return getLocationAwareLogger(3).isDebugEnabled();
	}

	public static void debug(String msg) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.DEBUG_INT, msg, EMPTY_ARRAY, null);
	}

	public static void debug(String format, Object arg) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.DEBUG_INT, format, new Object[] { arg },
				null);
	}

	public static void debug(String format, Object arg1, Object arg2) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.DEBUG_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void debug(String format, Object... arguments) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.DEBUG_INT, format, arguments, null);
	}

	public static void debug(String msg, Throwable t) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.DEBUG_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isDebugEnabled(Marker marker) {
		return getLocationAwareLogger(3).isDebugEnabled(marker);
	}

	public static void debug(Marker marker, String msg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.DEBUG_INT, msg, EMPTY_ARRAY, null);
	}

	public static void debug(Marker marker, String format, Object arg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.DEBUG_INT, format, new Object[] { arg },
				null);
	}

	public static void debug(Marker marker, String format, Object arg1,
			Object arg2) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.DEBUG_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void debug(Marker marker, String format, Object... argArray) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.DEBUG_INT, format, argArray, null);
	}

	public static void debug(Marker marker, String msg, Throwable t) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.DEBUG_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isWarnEnabled() {
		return getLocationAwareLogger(3).isWarnEnabled();
	}

	public static void warn(String msg) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.WARN_INT,
				msg, EMPTY_ARRAY, null);
	}

	public static void warn(String format, Object arg) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.WARN_INT,
				format, new Object[] { arg }, null);
	}

	public static void warn(String format, Object arg1, Object arg2) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.WARN_INT,
				format, new Object[] { arg1, arg2 }, null);
	}

	public static void warn(String format, Object... arguments) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.WARN_INT,
				format, arguments, null);
	}

	public static void warn(String msg, Throwable t) {
		getLocationAwareLogger(3).log(null, FQCN, LocationAwareLogger.WARN_INT,
				msg, EMPTY_ARRAY, t);
	}

	public static boolean isWarnEnabled(Marker marker) {
		return getLocationAwareLogger(3).isWarnEnabled(marker);
	}

	public static void warn(Marker marker, String msg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.WARN_INT, msg, EMPTY_ARRAY, null);
	}

	public static void warn(Marker marker, String format, Object arg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.WARN_INT, format, new Object[] { arg },
				null);
	}

	public static void warn(Marker marker, String format, Object arg1,
			Object arg2) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.WARN_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void warn(Marker marker, String format, Object... argArray) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.WARN_INT, format, argArray, null);
	}

	public static void warn(Marker marker, String msg, Throwable t) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.WARN_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isErrorEnabled() {
		return getLocationAwareLogger(3).isErrorEnabled();
	}

	public static void error(String msg) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.ERROR_INT, msg, EMPTY_ARRAY, null);
	}

	public static void error(String format, Object arg) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.ERROR_INT, format, new Object[] { arg },
				null);
	}

	public static void error(String format, Object arg1, Object arg2) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.ERROR_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void error(String format, Object... arguments) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.ERROR_INT, format, arguments, null);
	}

	public static void error(String msg, Throwable t) {
		getLocationAwareLogger(3).log(null, FQCN,
				LocationAwareLogger.ERROR_INT, msg, EMPTY_ARRAY, t);
	}

	public static boolean isErrorEnabled(Marker marker) {
		return getLocationAwareLogger(3).isErrorEnabled(marker);
	}

	public static void error(Marker marker, String msg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.ERROR_INT, msg, EMPTY_ARRAY, null);
	}

	public static void error(Marker marker, String format, Object arg) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.ERROR_INT, format, new Object[] { arg },
				null);
	}

	public static void error(Marker marker, String format, Object arg1,
			Object arg2) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.ERROR_INT, format,
				new Object[] { arg1, arg2 }, null);
	}

	public static void error(Marker marker, String format, Object... argArray) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.ERROR_INT, format, argArray, null);
	}

	public static void error(Marker marker, String msg, Throwable t) {
		getLocationAwareLogger(3).log(marker, FQCN,
				LocationAwareLogger.ERROR_INT, msg, EMPTY_ARRAY, t);
	}

}



之所以说这个类性能突出,秘诀在于sun.reflect.Reflection.getCallerClass这个方法。当然了,这个还是有些性能损耗的,如果实在觉得某些场景Logs影响了性能,那么可以在换回传统做法嘛。相信这种场景出现的几率是极小的。
0
0
分享到:
评论

相关推荐

    slf4j日志框架的源代码分享

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...

    slf4j完整日志文件

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging (JUL)、Logback等。这个接口允许最终用户在部署时插入...

    log4j + slf4j-api + slf4j-log4j12

    在给定的标题和描述中,我们看到了两个关键的日志框架——`log4j`和`SLF4J(Simple Logging Facade for Java)`,以及它们之间的桥接器`slf4j-log4j12`。这些组件是Java日志处理的常用工具,让我们详细了解一下它们...

    slf4j输入日志到mongodb

    SLF4J(Simple Logging Facade for Java)是Java中一个用于日志记录的抽象层,它提供了一种标准的日志记录接口,使得开发者可以选择不同的日志实现框架,如Log4j、Logback等。MongoDB则是一个流行的NoSQL数据库系统...

    slf4j-api-1.7.12.jar slf4j-log4j12-1.7.12.jar

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。这个接口使得应用程序的代码与...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    Slf4j是一个简单的日志外观模式,它提供了统一的日志接口,使得用户可以选择不同的日志实现。Slf4j的出现使得日志系统的开发变得更加灵活和便捷。Slf4j的优点包括: 1. 兼容性强:Slf4j可以与多种日志系统集成,如...

    slf4j jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...

    slf4j-api-1.7.25

    SLF4J的主要目标是提供一个简单易用的日志API,允许开发者在部署时插入所需的日志框架。SLF4J API仅包含接口和辅助类,实际的日志实现需要通过绑定特定的日志库来完成。例如,如果项目中引入了`logback-classic`,...

    slf4j-log4j12-1.7.12.jar、slf4j-api-1.7.12.jar

    "slf4j-api-1.7.12.jar"则是SLF4J的核心API库,包含了所有SLF4J的日志记录方法和接口,但不包含任何实际的日志实现。 在Java项目中,通常需要同时包含这两个JAR文件:slf4j-api-1.7.12.jar(提供接口)和slf4j-log4...

    Java Slf4j依赖包

    Java Slf4j,全称为Simple Logging Facade for Java,是一个为各种日志框架提供一个简单统一的接口,使得最终用户能够在部署时配置他们希望的日志框架。Slf4j允许开发者在部署应用时插入所需的日志实现,无需修改...

    SLF4j中文使用手册

    SLF4J(Simple Logging Facade for Java)是一个用于Java编程语言的日志门面框架,它提供了一个简单的抽象层,用以使用各种日志框架,例如java.util.logging、logback和log4j。门面模式的好处在于,开发者可以在不同...

    非web工程使用slf4j输出日志

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。在非Web工程中,SLF4J同样扮演着...

    android slf4j log4j日志框架

    虽然SLF4J不直接使用Log4j,但可以通过桥接器将SLF4J的调用转发到Log4j,这样可以利用Log4j的高级特性,如自定义日志级别、日志文件滚动、过滤器和布局模板等。不过,在Android中直接使用Log4j并不常见,因为它的...

    slf4j-api.jar和slf4j-nop.jar打包下载

    SLF4J(Simple Logging Facade for Java)是Java中一个重要的日志抽象层,它为各种日志框架,如Log4j、java.util.logging、Logback等提供了一个统一的接口。通过SLF4J,开发者可以在不修改代码的情况下更换底层的...

    日志 log4j-slf4j+logback1.3.0

    当我们提到“log4j-slf4j+logback1.3.0”时,这意味着在一个项目中,SLF4J被用作日志的抽象层,而Logback 1.3.0作为实际的日志实现。这样的组合允许开发者利用SLF4J的简单API编写日志代码,同时享受Logback提供的高...

    Springboot项目使用Slf4j将日志保存到本地目录的实现代码

    Slf4j 是一个 Java 日志记录门面,它提供了一个通用的日志记录API,允许开发者使用不同的日志记录框架,例如 Logback、Log4j 等。在 Springboot 项目中,Slf4j 是默认的日志记录框架。本文将介绍如何使用 Slf4j 将...

    log4j-2.11.2的jar包和日志门面slf4j的jar包

    Log4j和SLF4J(Simple Logging Facade for Java)是Java领域广泛使用的两个日志框架,它们有着各自的特点和用途。下面将详细阐述这两个框架以及它们在给定压缩包中的具体组件。 首先,Log4j是Apache软件基金会的一...

    slf4j 1.7 所有jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个简单的API,允许开发者在应用程序中使用各种日志框架,如Log4j、Logback等,而无需直接依赖特定的日志实现。SLF4J 1.7是其的一个...

    Slf4j日志相关jar包

    Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单 facade,它允许最终用户在部署他们的应用时使用他们希望的日志库。Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地...

    slf4j日志,可以使用它代替LOG4J

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它的设计目的是为各种日志框架提供一个统一的接口,使得开发者可以在不改变代码的情况下切换不同的日志实现,比如从Log4j切换到Logback,或者...

Global site tag (gtag.js) - Google Analytics