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

Log4j2.x的简单使用

阅读更多

最近在做项目的过程中,无意中发现,log4j1.x居然存在多线程下出现死锁的问题,这可是很严重的问题,果断改啊。Apache不愧是个有良心的组织,出了log4j2.x版本,不紧解决了死锁问题,还支持异步写日志等。当然,本次只说明一下log4j2.x的简单使用,复杂的使用以后用到再说。

下面直接上代码:

 

一、引入jar包

在纯Java的项目中,需要引入的jar包

<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.5</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.5</version>
		</dependency>

 

 在web项目中,需要引入的jar包

<!-- slf4j核心包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.13</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.13</version>
			<scope>runtime</scope>
		</dependency>
		<!--核心log4j2jar包 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.5</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.5</version>
		</dependency>
		<!--用于与slf4j保持桥接 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>2.4.1</version>
		</dependency>
		<!--web工程需要包含log4j-web,非web工程不需要 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-web</artifactId>
			<version>2.4.1</version>
			<scope>runtime</scope>
		</dependency>

 可以看出来,log4j2.x与log4j1.x相比,增加了很多依赖包

 

二、Java代码中的使用:

方法一:直接使用log4j的api

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

 

private static Logger logger = LogManager.getLogger(CloudResourceController.class);

 方法二:对log4j进行一次封装

1、封装接口类Logger:

/**
 * 自定义logger接口,避免下次修改log版本后还要修改所有的Java文件
 *
 * @ClassName: Logger   
 * @author chenting
 * @date 2017年7月7日 
 *
 */
public interface Logger {

	/**
	 * Log a message at the DEBUG level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void debug(String msg);

	/**
	 * Log a message at the INFO level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void info(String msg);

	/**
	 * Log a message at the WARN level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void warn(String msg);

	/**
	 * Log a message at the ERROR level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void error(String msg);

	/**
	 * Log an exception (throwable) at the ERROR level with an accompanying
	 * message.
	 * 
	 * @param msg
	 *            the message accompanying the exception
	 * @param t
	 *            the exception (throwable) to log
	 */
	public void error(Object msg, Throwable t);
}

 2、接口实现类:

import org.apache.logging.log4j.LogManager;

/**
 * Logger实现类,避免下次修改log版本后还要修改所有的Java文件
 *
 * @ClassName: LoggerFactory   
 * @author chenting
 * @date 2017年7月7日 
 *
 */
public class LoggerFactory implements Logger{
	
	private org.apache.logging.log4j.Logger logger;
	
	private LoggerFactory(Class<?> clazz){
		this.logger = LogManager.getLogger(clazz);
	}
	private LoggerFactory(String className){
		this.logger = LogManager.getLogger(className);
	}
	
	public synchronized static Logger getLogger(Class<?> clazz) {
		return new LoggerFactory(clazz);
	}
	public synchronized static Logger getLogger(String className) {
		return new LoggerFactory(className);
	}

	/**
	 * Log a message at the DEBUG level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void debug(String msg) {
		this.logger.debug(msg);
	}

	/**
	 * Log a message at the INFO level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void info(String msg) {
		this.logger.info(msg);
	}
	/**
	 * Log a message at the WARN level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void warn(String msg) {
		this.logger.warn(msg);
	}
	/**
	 * Log a message at the ERROR level.
	 * 
	 * @param msg
	 *            the message string to be logged
	 */
	public void error(String msg) {
		this.logger.error(msg);
	}
	/**
	 * Log an exception (throwable) at the ERROR level with an accompanying
	 * message.
	 * 
	 * @param msg
	 *            the message accompanying the exception
	 * @param t
	 *            the exception (throwable) to log
	 */
	public void error(Object msg, Throwable t) {
		this.logger.error(msg, t);
	}
}

 

3、具体使用:

private static Logger logger = LoggerFactory.getLogger(MainController.class);

 按照上面三个步骤来实现即可

这样做的一个好处是,下次再想改其他的日志的话,只需要更新一下Logger接口的实现类即可,不用再像方法一那样,一个个的修改Java文件。有个坏处就是,没法具体定位到日志具体是在哪个Java文件中输出的,只能看到日志最终是经过LoggerFactory的接口输出的,这个希望有看到的朋友给出出主意。

 

三、log4j2的配置文件

与log4j1.x不同的是,log4j2.x已经不支持properties类型的配置文件,只支持xml,json等的日志,针对我个人来讲,配置起来2.x比1.x麻烦,或许是对1.x产生依赖了把,废话不多说,上代码:

这里我使用的是xml格式的,文件名log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出, 这一行我设置为OFF,表示不记录log4j2本身的日志 
	monitorInterval: Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。 -->
<Configuration status="off" monitorInterval="1800">

	<Properties>
		<!-- 日志基础路径 -->
		<Property name="BASEPATH">${sys:catalina.base}/logs</Property>
		<!-- 日志文件名称 -->
		<Property name="LOG_FILENAME">cms.log</Property>
		<!-- 日志保存天数 -->
		<Property name="LOG_SAVED_DATE">10d</Property>
		<!-- 日志输出格式 -->
		<Property name="LOG_PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss.SSS} [ %level ] [ %thread ] %class{36} - %M %L - %msg%xEx%n</Property>
	</Properties>

	<Appenders>
		<!--这个输出控制台的配置 -->
		<Console name="Console" target="SYSTEM_OUT">
			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="trace" onMatch="ACCEPT"
				onMismatch="DENY" />
			<!-- 输出日志的格式 -->
			<PatternLayout pattern="${LOG_PATTERN_LAYOUT}" />
		</Console>

		<!-- 按天备份一个日志 -->    
        <!-- fileName为生成的文件名,也可以采用相对路径模式,filePattern为时间到达后产生新日志,旧日志的文件名 -->  
		<RollingFile name="RollingFile" fileName="${BASEPATH}/${LOG_FILENAME}" filePattern="${BASEPATH}/${LOG_FILENAME}_%d{yyyy-MM-dd}.log">
			<!-- 日志输出格式 -->
			<PatternLayout pattern="${LOG_PATTERN_LAYOUT}" />
			<Policies>
				<!-- 每1天更新一次,此处查阅网上和官方示例中,都是以小时出现,我测试是以天为单位。(官方文档中说明按item类型是否是小时,但没找到在哪里设置item类型)另有其他各类型策略,请参阅官方文档 -->
				<!-- TimeBasedTriggeringPolicy需要和filePattern配套使用,由于filePattern配置的时间最小粒度是dd天,所以表示每一天新建一个文件保存日志。
				SizeBasedTriggeringPolicy表示当文件大小大于指定size时,生成新的文件保存日志。 -->
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
			</Policies>
			<!-- 最多备份10天以内的日志,此处为策略限制,Delete中可以按自己需要用正则表达式编写 -->    
        	<!-- DefaultRolloverStrategy字段中加入max="30"经测试是配合SizeBasedTriggeringPolicy限制%i的存在数量,并没有发现是网上流传的是最多保存多少个文件的限制,也或许是我写的有问题 -->    
         	<DefaultRolloverStrategy>
         		<!-- log4j2.5版本之后才支持 -->
        		<Delete basePath="${BASEPATH}" maxDepth="1">
                     <IfFileName glob="${LOG_FILENAME}_*.log" />
                     <!-- 日志保存天数 --> 
                     <IfLastModified age="${LOG_SAVED_DATE}" />
            	</Delete>    
            </DefaultRolloverStrategy>    
		</RollingFile>

	</Appenders>

	<Loggers>
		<!-- 配置日志的根节点 -->
		<!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
		<root level="debug"><!-- level设置为info后,mybatis就没有SQL日志输出了,暂时未找到原因 -->
			<appender-ref ref="Console" />
			<appender-ref ref="RollingFile" />
		</root>

	<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="INFO"></logger>
        <logger name="org.apache.ibatis.io" level="INFO"></logger>
	<logger name="org.springframework" level="INFO"></logger>
        <logger name="druid.sql.Connection" level="INFO"></logger>
        <logger name="druid.sql.DataSource" level="INFO"></logger>
        <logger name="druid.sql.Statement" level="INFO"></logger>
        <logger name="druid.sql.ResultSet" level="INFO"></logger>

	</Loggers>

</Configuration>

 

针对Loggers的配置,还可以这么配:

<Loggers>
		<!-- 配置日志的根节点 -->
		<!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
		<root level="INFO"><!-- level设置为info后,mybatis就没有SQL日志输出了,暂时未找到原因 -->
			<appender-ref ref="Console" />
		</root>
		
		<!-- 普通日志 -->
		<logger name="com.visionvera" level="INFO">
			<appender-ref ref="DnsRollingFile" />
		</logger>
		
		<!-- 心跳日志 -->
		<logger name="heart" level="INFO">
			<appender-ref ref="HeartRollingFile" />
		</logger>
		
		<!-- 屏蔽druid的日志输出 -->
		<logger name="com.alibaba.druid" level="error"></logger>
		
		<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="INFO"></logger>
        <logger name="org.apache.ibatis.io" level="INFO"></logger>
		<logger name="org.springframework" level="INFO"></logger>
        <logger name="druid.sql.Connection" level="INFO"></logger>
        <logger name="druid.sql.DataSource" level="INFO"></logger>
        <logger name="druid.sql.Statement" level="INFO"></logger>
        <logger name="druid.sql.ResultSet" level="INFO"></logger>

	</Loggers>

 这样配的目的是,想让不同业务的日志输出到不同文件中,其中name=“heart”的日志,在代码中需要这么写:

private static Logger hearLogger = LoggerFactory.getLogger("heart");

 

需要注意的是,log4j2.x版本在servlet2.x版本下,需要在web.xml里面进行配置,servlet3.x的就不用了,具体怎么配,这里不写了,有兴趣的可以自己查看一下。

 

以上便是我的一点简单的使用,自己留作记录,也希望能帮助到需要的朋友。

分享到:
评论

相关推荐

    log4j与web.xml的配置

    2. **Log4j配置文件(log4j.properties或log4j.xml)** - 在Java项目中,通常会有一个log4j配置文件,用于定义日志记录的级别、输出方式和格式。 - 示例配置: ``` log4j.rootLogger=DEBUG, FILE log4j....

    tomcat9 slf4j+log4j2 写日志.zip

    3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api.jar`和`log4j-slf4j-impl.jar`,这将使Tomcat使用Log4j2作为其内部的日志系统。 4. **排除其他日志实现**:确保你的应用中没有引入其他的日志实现...

    Log4j将System.out搞到log4j中输出四

    在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...

    log4j jar包

    Log4j-1.2.17是Log4j 1.x系列的一个稳定版本,尽管后续发布了Log4j 2.x,但1.2版仍被许多遗留系统和项目广泛使用。这个版本修复了一些已知的bug,提升了性能和稳定性,同时也兼容了当时的Java环境。 总结,Log4j...

    log4j.properties配置详解

    - `org.apache.log4j.SimpleLayout`:包含简单的日志级别和信息字符串。 - `org.apache.log4j.TTCCLayout`:包含详细的信息,如时间戳、线程名、类别等。 #### 四、打印参数详解 Log4J采用类似C语言中的`printf`...

    apache-log4j-2.3 核心jar包

    log4j 2.3版本Jar包。...Log4j 2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

    apache-log4j-2.14.0-bin.zip

    Log4j 2是一个继Log4j 1.x之后的全面升级,它不仅提高了性能,还引入了许多新的功能和设计改进。Log4j 2的主要目标是减少日志带来的性能开销,并提供动态日志配置,使得在运行时可以轻松地调整日志级别。 在日志...

    log4j-1.2.9.jar

    尽管Log4j 1.x版本稳定且功能强大,但随着技术的发展,社区推荐使用更现代的Log4j 2.x版本,它在性能、可扩展性和API设计上都有显著提升。不过,对于仍在使用Log4j 1.2.9的项目,理解其工作原理和配置方式依然至关...

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

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案 Slf4j是简单的日志外观(Facade)模式,它提供了统一的日志接口,使得用户可以选择不同的日志实现。Slf4j的出现使得日志系统的开发变得更加灵活和便捷。Log4j2...

    log4j.jar包

    - Log4j 2.x:随着技术的发展,Log4j推出了新的版本log4j-api-2.0-rc1.jar和log4j-core-2.0-rc1.jar,以解决1.x版本中的一些局限性,如线程安全问题、性能优化以及更好的API设计等。2.0版本引入了Async Appender,...

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置使用 Log4j2 是一个功能强大且广泛使用的日志记录工具,它提供了灵活的日志记录机制和高性能的日志记录能力。Slf4j 则是一个简单的日志记录门面,提供了统一的日志记录接口。今天,我们将...

    apache-log4j-2.3-bin和commons-logging-1.2

    Apache Log4j 2.3 和 Commons Logging 1.2 是两个在Java Web开发中广泛使用的日志处理库。这两个库对于记录应用程序的运行时信息、调试错误和监控系统状态至关重要。 **Apache Log4j 2.3** Log4j 是 Apache 组织...

    apache-log4j-2.6.2.jar包

    然而,值得注意的是,后来的版本Log4j 2.x曾曝出著名的CVE-2021-44228(Log4Shell)漏洞,因此,即使使用2.6.2,也应关注并及时更新至更安全的版本。 在"apache-log4j-2.6.2-bin"压缩包中,通常会包含Log4j的二进制...

    log4j.1.2.17

    1.2.17是Log4j的一个稳定版本,虽然后续有更先进的2.x版本,但1.2系列因其广泛的兼容性和稳定性,仍在很多项目中被广泛使用。 2. **主要组件** - **Logger(日志器)**:它是日志系统的主要接口,用于生成日志信息...

    log4j.properties配置详解 使用教程

    首先需要下载log4j库,推荐使用1.2.x版本,因为该版本稳定且广泛支持。可以在Apache官网下载页面找到合适的版本:[http://logging.apache.org/log4j/1.2/download.html]...

    apache-log4j-2.13.1-bin.zip

    本压缩包“apache-log4j-2.13.1-bin.zip”包含了适用于Windows平台的Log4j 2.x核心组件,为开发者提供了一个方便的日志解决方案。 首先,让我们详细了解一下Log4j的核心组件: 1. **log4j-api-2.x.jar**:这是Log4...

    log4j-1.2.5.jar.zip

    Log4j 1.2.5是其早期的一个稳定版本,虽然现在已经有更新的Log4j 2.x系列,但1.2.x版本仍然在很多项目中被广泛使用。 二、Log4j核心组件 1. **Logger**:日志记录器,是Log4j的核心,负责生成日志事件。每个类都...

    log4j-1.2.14.jar.zip 335k

    1.2.14是Log4j的一个较旧但稳定的版本,虽然现在已有更新的2.x版本,但在很多遗留系统中仍然广泛使用。 二、核心组件 1. **Logger**:日志记录器是Log4j的核心,用于创建和管理日志事件。每个应用程序可以有多个...

    log4j-1.2.17.jar

    "log4j-1.2.17.jar"是Log4j的一个版本,尽管现在已经有更新的Log4j 2.x系列,但1.2版本因其稳定性和广泛支持,仍然在许多项目中被采用。 1. **日志级别控制**:Log4j支持多个日志级别,包括DEBUG、INFO、WARN、...

    log4j实用配置扩展

    log4j.appender.file.layout.ConversionPattern=%d %p %c %x - %m%n ``` 通过这种方式,开发者可以灵活地控制日志的输出方式、级别和格式,从而更好地管理和监控应用程序的状态。 总之,log4j作为一种强大的日志...

Global site tag (gtag.js) - Google Analytics