web应用中log4j应用--log4j.xml同时输出多种日志


OK,现在我们来整理下log4j来web项目中的应用。我之前搞了2年web,使用的日志都是log4j。关于现在比较火的logback我后面会有博客整理到,不管怎么样,这里先整理一下web中log4j的使用,特别是log4j.xml,之后如果用到直接过来复制就好了。

1,项目中添加log4j依赖:

<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
当然这里推荐使用slf4j来统一管理日志系统,万一将来日志系统log4j切换到logback。直接添加一个slf-log4j12.jar包就可以。

<dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-log4j12</artifactId>  
            <version>1.7.12</version>  
        </dependency>

2,Java代码使用logger:

package linkinframe.servlet;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet
{
	public static Logger log = Logger.getLogger(HelloServlet.class);

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		log.trace("trace级别的日志输出");
		log.debug("debug级别的日志输出");
		log.info("info级别的日志输出");
		log.warn("warn级别的日志输出");
		log.error("error级别的日志输出");
		log.fatal("fatal级别的日志输出");
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String currentTime = format.format(new Date());
		req.setAttribute("currentTime", currentTime);
		req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req, resp);
	}

}

3,项目classpath中添加log4j.xml配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<!--log4j.xml 配置文件 优先于 log4j.properties 配置文件 -->
	<!-- * 1. 一个appender子元素定义一个日志输出目的地 * 2. 一个logger子元素定义一个日志写出器 -->
	<!-- ========================== 自定义输出格式说明================================ -->
	<!-- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL -->
	<!-- %r 输出自应用启动到输出该log信息耗费的毫秒数 -->
	<!-- %c 输出所属的类目,通常就是所在类的全名 -->
	<!-- %t 输出产生该日志事件的线程名 -->
	<!-- %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” -->
	<!-- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS} -->
	<!-- 输出类似:2002年10月18日 22:10:28,921 -->
	<!-- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) -->
	<!-- ========================================================================== -->

	<!-- ========================== 输出方式说明================================ -->
	<!-- Log4j提供的appender有以下几种: -->
	<!-- org.apache.log4j.ConsoleAppender(控制台), -->
	<!-- org.apache.log4j.FileAppender(文件), -->
	<!-- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), -->
	<!-- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), -->
	<!-- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) -->
	<!-- ========================================================================== -->

	<!-- 输出到控制台 -->
	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
	</appender>

	<!-- 输出到日志文件 每天一个日志 -->
	<appender name="LOGDEBUG" class="org.apache.log4j.DailyRollingFileAppender">
		<!-- Threshold屏蔽级别之下的日志输出 -->
		<param name="Threshold" value="DEBUG" />
		<param name="encoding" value="UTF-8" />
		<param name="File" value="/Users/LinkinPark/WorkSpace/linkin-frame-javaweb/log/linkin-debug.log" />
		<param name="DatePattern" value="'debug_'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
	</appender>

	<appender name="LOGINFO" class="org.apache.log4j.DailyRollingFileAppender">
		<!-- <param name="Threshold" value="INFO" /> -->
		<param name="encoding" value="UTF-8" />
		<param name="File" value="/Users/LinkinPark/WorkSpace/linkin-frame-javaweb/log/linkin-info.log" />
		<param name="DatePattern" value="'info_'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
		<!--限制输出级别 -->
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="INFO" />
		</filter>
	</appender>

	<appender name="LOGERROR" class="org.apache.log4j.DailyRollingFileAppender">
		<!-- <param name="Threshold" value="ERROR" /> -->
		<param name="encoding" value="UTF-8" />
		<param name="File" value="/Users/LinkinPark/WorkSpace/linkin-frame-javaweb/log/linkin-error.log" />
		<param name="DatePattern" value="'error_'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="ERROR" />
			<param name="LevelMax" value="ERROR" />
		</filter>
	</appender>

	<!-- 设置某些包下的日志输出 -->
	<!-- <logger name="com.linkinPark" additivity="false"> <level value="OFF"/> </logger> -->
	<!-- <logger name="com.linlinPark.service"> <level value="ON"/> </logger> -->

	<!-- 日志的总开关设置 包括日志级别和 appender -->
	<!-- logger的作用: 1.[name属性]:指定你定义Logger对象时候的name -->
	<!-- 2. additivity : children-logger是否使用 rootLogger的配置, additivity在log4j默认为true。 -->
	<!-- 这解释了为什么有些时候,一个日志信息在屏幕上会有多次输出。 -->
	<!-- 3.还可以指定level(输出级别)、appender-ref(指定哪个append) -->
	<root>
		<level value="DEBUG" />
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="LOGDEBUG" />
		<appender-ref ref="LOGINFO" />
		<appender-ref ref="LOGERROR" />
	</root>

</log4j:configuration>

4,注意

上面的配置文件中有3点说明:

1),Threshold属性只是屏蔽了配置的级别之下的日志输出,等于和大于该value等级的日志都会输出,一般在统一所有日志输出的日志中才会使用该属性

2),LevelRangerFilter等级过滤器,可以设置最小的级别和最大的级别,这样子就可以实现单一日志输出单一级别的情景了。

3),为了防止一个日志信息重复出现在多个日志文件中,可以使用additivity属性,设置成false就不会从父类继承appender了。


OK,考虑如下情景,我现在在写一个web项目,我想要在日志文件中实现不同级别的日志输出,这样也方便我直接有效的查找日志。

抛开控制台的输出,我现在想要在error日志文件中只输出error级别的日志,然后在info日志文件中只输出info级别的日志,然后在debug文件中输出所有级别的日志。

使用上面的配置文件,可以很好地实现上面的功能。我自己测试了下,没有问题。生成的项目日志文件如下:

ok,现在分别打开几个日志文件,输出如下:

linkin-debug:全部日志文件

[2016-03-03 00:18:47:061] [linkinframe.servlet.HelloServlet] [25] DEBUG [debug级别的日志输出]
[2016-03-03 00:18:47:063] [linkinframe.servlet.HelloServlet] [26] INFO [info级别的日志输出]
[2016-03-03 00:18:47:063] [linkinframe.servlet.HelloServlet] [27] WARN [warn级别的日志输出]
[2016-03-03 00:18:47:064] [linkinframe.servlet.HelloServlet] [28] ERROR [error级别的日志输出]
[2016-03-03 00:18:47:064] [linkinframe.servlet.HelloServlet] [29] FATAL [fatal级别的日志输出]

linkin-info:info级别的日志

[2016-03-03 00:18:47:063] [linkinframe.servlet.HelloServlet] [26] INFO [info级别的日志输出]

linkin-error:error级别的日志

[2016-03-03 00:18:47:064] [linkinframe.servlet.HelloServlet] [28] ERROR [error级别的日志输出]

OK,挺好的,没问题,不过建议将来还是使用slf4j+logback的组合好点,关于在web中如何使用 slf4j+logback的组合输出不同的日志文件,道理和使用都差不多,我后面的博客有整理。这篇先这样子吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值