`
dove19900520
  • 浏览: 593075 次
  • 性别: 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的就不用了,具体怎么配,这里不写了,有兴趣的可以自己查看一下。

 

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

分享到:
评论

相关推荐

    apache-log4j-2.3 核心jar包

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

    使用log4j进行日志记录

    Log4j的包下载完成后,解压,将其中打包好的的log4j-1.x.x.jar导入你的工程LIB中。 Log4j之所以受欢迎的原因之一是它的灵活性。Log4j提供了灵活的配置方法,默认是调用BasicConfigurator.configure()来进行配置,但...

    Log4j日志管理系统简单使用说明

    Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和...

    graylog2使用说明(docker)

    wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.0/config/log4j2.xml //提前准备镜像 docker pull mongo:3 docker pull graylog/graylog:3.0 docker pull elasticsearch:5.6.9 ``` ### docker-...

    log4j-to-slf4j:从 Log4j 迁移到 SLF4J 的实用程序。 它还将 Log4j 日志消息转换为 SLF4J 日志消息

    这是一个简单的实用程序,可用于将 Log4j 格式的日志语句转换为 SLF4J 格式的日志语句。 示例输入是: logger.info("Hello " + who); 将转换为: logger.info("Hello {}", who); 先决条件 您应该安装了 Python ...

    SLF4M:Matlab的简单日志记录框架,建立在SLF4J和Log4j之上-matlab开发

    SLF4M是用于Matlab的简单但灵活的日志记录框架,建立在SLF4J和Apache Log4j的基础上。 您可以使用它从Matlab脚本和程序中进行可在运行时配置的日志记录。 与在内部注释和注释掉fprintf()语句相比,这可以提供更多...

    log4Net详解(共2讲)

    4、项目实战篇: Extjs3.2+ASP.NET七层架构+设计模式+ log4j+WebSerice等技术国讯教育通用智能OA办公平台 适用对象 1、要求有一定的javascript语言和HTML,CSS基础的学员 2、有一定的Asp.net网页编程基础和C#语言...

    IK Analyzer 3.2.8中文分词器

    IK Analyzer是一个开源的,基于java诧言开发的轻量级的中文分词工具包. IK Analyzer安装包包含: 1. 《IKAnalyzer中文分词器V3.X使用手册》 ...目录,同hibernate、log4j等配置文件相同)下即可。

    caiwang213-log4x-master_“com.3338x”_verilog_

    跨平台、简单、易用且功能强大的调试日志工具包,功能类似java log4j功能。

    MySQL 5.1参考手册

    12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 ...

    心跳检测(如Tomcat,Jetty)的JAVA 微服务应用程序.rar

     课课家觉得log5j在log4j的基础上提供了几个改进,应该说是简单和实用的封装。有趣的是log5j主页对自己名字的解释,因为要感谢JDk 1.5,所以才叫了这个名字。  更多log5j信息  JFinal 事件驱动插件 JFinal-...

    MySQL 5.1参考手册 (中文版)

    12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 ...

    mysql官方中文参考手册

    12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 ...

    糖果的软件

    原因四:文件名使用了一个保留名称 众所周知, 像 AUX 、 LPT1 这样的名称是为旧式 DOS 设备保留的。 为了向后 兼容, 在 Windows 中不允许使用这些文件名, 也不能使用典型的 Win32 文件调 用来创建它们。 反之...

    springboot学习

    chapter4-2-2:使用log4j记录日志 chapter4-2-3:对log4j进行多环境不同日志级别的控制 chapter4-2-4:使用AOP统一处理Web请求日志 chapter4-2-5:使用log4j记录日志到MongoDB chapter4-2-6:Spring Boot 1.5.x新...

    MYSQL中文手册

    12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX...

    MySQL 5.1参考手册中文版

    12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX...

    MySQL5.1参考手册官方简体中文版

    12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法...

    Java项目:教务信息查询系统(java+SSM+Bootstrap+C3P0+Maven+mysql)

    项目简介 该项目是一个简单的教务查询系统,分别授予管理员,教师,学生不同的权限,达到基本的数据查询与修改操作。 管理员主要功能: 课程管理、学生管理、教师管理;...数据源:C3P0 日志:log4j 前端框架:Bootstrap

Global site tag (gtag.js) - Google Analytics