参考url: https://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" : 配置logger的包目录
level value="info" :日志等级配置,例如,如果使用了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。
<appender-ref ref="_ROLLFILE" /> :配置log存放的地方,可以logger 可以配置多个
additivity="false" (这属性特别说一下,因为起初不了解)
转:https://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