发表文章

[最新] Java log日志(一):介绍Log4j

kaikai2018 1月前 39

参考url: http://blog.csdn.net/u011781521/article/details/55002553

1.概述

1.1 什么是Log4j

       Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。要下载和了解更详细的内容,还是访问其官方网站吧:http://jakarta.apache.org/log4j

1.2 Log4j的概念

     Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。

    (1)Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制。

           Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。

    (2).Appenders : 指定了日志将打印到控制台还是文件中

         Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。

    (3)Layout : 控制日志信息的显示格式

        Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。


2.Lo4j等级

     log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL

 ALL 最低等级的,用于打开所有日志记录。

TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。

DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。

WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。

ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

OFF 最高等级的,用于关闭所有日志记录。

如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

从我们实验的结果可以看出,log4j默认的优先级为ERROR或者WARN(实际上是ERROR)。


import org.apache.log4j.Logger;

public class Log4jTest {
	private static final Logger logger = Logger.getLogger(Log4jTest.class);
	public static void main(String[] args) {
		/**
		 * 列出4个常用的等级 高--->低
		 */
		logger.error("level error");
		logger.warn("levle warn");
		logger.info("level info");
		logger.debug("levle debug");
		
	}

}


3. Lo4j的配置文件

虽然可以不用配置文件,而在程序中实现配置,但这种方法在如今的系统开发中显然是不可取的,能采用配置文件的地方一定一定要用配置文件。Log4j支持两 种格式的配置文件:XML格式和Java的property格式。这里我们只讲XML格式。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<!-- 日志记录格式: <yyyy-MM-dd HH:mm:ss.SSS> <优先级> <包名.类名.方法(类名.java:行号)> 信息 -->
	<!-- 控制台存放地 -->
	<appender name="_Console" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="[%d{yyyyMMdd HHmmss.SSS}]{%t}<%p>%l %m%n" />
		</layout>
	</appender>
	
	<!-- 按日期的循环文件存放地 -->
	<appender name="_ROLLFILE" class="org.apache.log4j.DailyRollingFileAppender">
		<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler" />
		<param name="File" value="D:/LogData/log4j_test.log" />
		<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>
		<param name="Append" value="true"/>
		<param name="Encoding" value="GBK"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="{%t}<%p>[%d{yyyyMMdd HHmmss.SSS}]%l %m%n" />
		</layout>
	</appender>
	
	<logger name="org.springframework" additivity="false">
		<level value="warn" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>
	
	<logger name="org.hibernate.cache" additivity="false">
		<level value="warn" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>
	
	<logger name="org.hibernate" additivity="false">
		<level value="warn" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>
	
	<logger name="net.sf.ehcache" additivity="false">
		<level value="debug" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>
	
	<logger name="org.quartz" additivity="false">
		<level value="warn" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>	
	
	<logger name="org.framework" additivity="false">
		<level value="info" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>
	
	<logger name="com.test" additivity="false">
		<level value="trace" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</logger>
	
	<root>
		<level value="error" />
		<appender-ref ref="_Console" />
		<appender-ref ref="_ROLLFILE" />
	</root>
</log4j:configuration>


3.1 appender

以下为Log4j几种常用的输出目的地。

(1)org.apache.log4j.ConsoleAppender:将日志信息输出到控制台。
(2)org.apache.log4j.FileAppender:将日志信息输出到一个文件。
(3)org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。
(4)org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。
(5)org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。
(6)org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中。

 注:一般情况下只是使用ConsoleAppender和DailyRollingFileAppender

DailyRollingFileAppender 属性

<param name="File" value="D:/LogData/4d_app.log" />:指定消息输出到D:/LogData/4d_app.log文件 
<param name="Append" value="true"/>:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 
<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>:每天滚动一次文件,即每周产生一个新的文件。还可以按用以下参数: 
             '.'yyyyMM:每月 
             '.'yyyyww:每周 
             '.'yyyyMMdd:每天 
              '.'yyyyMMdda:每天两次 
              '.'yyyyMMddHH:每小时 
              '.'yyyyMMddHHmm:每分钟 

<param name="Encoding" value="GBK"/>:可以指定文件编码格式,GBK 和UTF-8都可以


3.2 Layout

 Log4j提供的layout有以下几种:

  org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
  Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
    %m 输出代码中指定的消息
    %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)

注:一般都是使用PatternLayout

3.3 logger

配置项目中哪些包目录下面的类需要日志打印,例如如果不配置 logger name="com.test",那么属性 com.test下面的类中配置的private static final Logger logger = Logger.getLogger(Log4jTest.class); 的日志信息就不会被打印

logger 属性

name="com.test" : 配置logger的包目录

level value="info" :日志等级配置,例如,如果使用了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

<appender-ref ref="_ROLLFILE" /> :配置log存放的地方,可以logger 可以配置多个


additivity="false"  (这属性特别说一下,因为起初不了解)

转:http://blog.csdn.net/w420372197/article/details/7165967

log4j.additivity是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下 子Logger 会继承 父Logger 的appender,也就是说 子Logger 会在 父Logger 的appender里输出。若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。 

如: 
log4j.rootLogger=INFO, stdout,logfile 
log4j.logger.com.ambow.upgrade=INFO, dataSync 

则com.ambow.upgrade包及其子包下的Logger不光在Appender dataSync里输出,也会在rootLogger的Appender stuout和logfile中输出; 
若想让com.ambow.upgrade包及其子包下的Logger只在Appender dataSync中输出,则在log4j.properties中添加下行即可: 
log4j.additivity.com.ambow.upgrade=false 


与此对应的在logback中的配置为:
<logger name="com.apabi.ptvs.web.DataController"
additivity="false">
<level value="INFO" />
<appender-ref ref="logfile" />
</logger>

相关推荐
最新评论 (0)
返回
发表文章
kaikai2018
文章数
10
评论数
0
注册排名
992136