一、常用日志构件
   
- java.uitl.logging:JDK内置的日志接口和实现,功能比较简单
- 
     Log4j1
 
 :
 
 Apache 的一个开放源代码项目,用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别
- Log4j2:Log4j1的升级版本
- Logback:是由log4j创始人设计的又一个开源日记组件
- Commons-logging:为各种Logging API提供一个简单统一的接口,从而使用户能够在部署的时候配置自己希望的Logging API实现
- Slf4j:为各种Logging API提供一个简单统一的接口,提供统一的接口,不提供具体实现,不是具体可使用可配置的日志系统
上面几个日志框架简单分为两类:
- 日志门面 commons-logging,slf4j
- 日志实现 jdk-logging,log4j,logback,log4j2
个人推荐使用log4j+slf4j
    二、日志的基本知识
   
    1、日志级别
   
Java的日志框架一般会提供以下日志级别,缺省打开info级别,也就是debug,trace级别的日志在生产环境不会输出,在开发和测试环境可以通过不同的日志配置文件打开debug级别。
- 
     
 fatal
 
 – 严重的,造成服务中断的错误;
- 
     
 error
 
 – 其他错误运行期错误;
- 
     
 warn
 
 – 警告信息,如程序调用了一个即将作废的接口,接口的不当使用,运行状态不是期望的但仍可继续处理等;
- 
     
 info
 
 – 有意义的事件信息,如程序启动,关闭事件,收到请求事件等;
- 
     
 debug
 
 – 调试信息,可记录详细的业务处理到哪一步了,以及当前的变量状态;
- 
     
 trace
 
 – 更详细的跟踪信息;
    三、Log4j1
   
    1、jar包
   
log4j-1.2.17.jar
    2、配置
   
配置地址:默认为classpass下,即src目录下
    
     Logger:分等级层次的,最顶层的是rootLogger,其他的logger都会继承他
    
   
    
     Appende:输出目的地
    
   
- org.apache.log4j.ConsoleAppender(控制台),
- org.apache.log4j.FileAppender(文件),
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过org.apache.log4j.MaxBackupIndex=1设置为保存一个备份文件。
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    
     layout:Appende输出格式
    
   
打印格式
- org.apache.log4j.HTMLLayout(以HTML表格形式布局),
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
- %m 输出代码中指定的消息;
- %M 输出打印该条日志的方法名;
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;
- %r 输出自应用启动到输出该log信息耗费的毫秒数;
- %c 输出所属的类目,通常就是所在类的全名;
- %t 输出产生该日志事件的线程名;
- %n 输出一个回车换行符,Windows平台为”rn”,Unix平台为”n”;
- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;
- %l 输出日志事件的发生位置,及在代码中的行数。
    
     2.1 properties配置方式
    
   
- 配置根Logger:等级, appenderName , appenderName
- 配置输出目的地Appender
- 配置日志信息的输出格式
log4j.rootLogger=INFO,Console,logFile
##Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
##logFile
log4j.appender.logFile=org.apache.log4j.RollingFileAppender
log4j.appender.logFile.File=D:\\coding\\log4j.txt
log4j.appender.logFile.MaxFileSize=1KB
log4j.appender.logFile.MaxBackupIndex=3
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    
     2.2 xml配置方式
    
   
- 
appender、layout: 一个appender子元素定义一个日志输出目的地 
- 
logger、level:日志级别,定义以name开头类的级别 
- 
root:定义根日志输出器 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{yyyy HH:mm:ss} %-5p %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com">
		<level value="error" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="error" />
	</logger>	
	
	<logger name="org.springframework.beans">
		<level value="error" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="error" />
	</logger>
 
	<logger name="org.springframework.web">
		<level value="error" />
	</logger>
 
	<logger name="org.springframework.jdbc">
		<level value="error" />
	</logger>
 
	<logger name="org.mybatis.spring">
		<level value="error" />
	</logger>
	<logger name="java.sql">
		<level value="error" />
	</logger>
	<!-- Root Logger -->
	<root>
		<level value="error" />
		<appender-ref ref="console" />
	</root>
</log4j:configuration>
    3、日志打印使用方式
   
//初始化
private static Logger log = Logger.getLogger(testLog4j.class);  
//使用方式
log.info("========test daily level info=========");  
    四、Log4j2
   
    1、jar包
   
    log4j-api-2.11.1.jar
    
    log4j-core-2.11.1.jar
   
Maven:
dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.0</version>
</dependency>
    2、配置
   
<?xml version="1.0" encoding="UTF-8"?>
 <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
 <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
 <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
 <configuration status="WARN" monitorInterval="30">
     <!--先定义所有的appender-->
     <appenders>
     <!--这个输出控制台的配置-->
         <console name="Console" target="SYSTEM_OUT">
         <!--输出日志的格式-->
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console>
     <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
     <File name="log" fileName="log/test.log" append="false">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File>
     <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->        
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
             <DefaultRolloverStrategy max="20"/>
         </RollingFile>
         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
     </appenders>
     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
     <loggers>
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <root level="all">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>
             <appender-ref ref="RollingFileError"/>
         </root>
     </loggers>
 </configuration>
    3、日志打印使用方式
   
//初始化
private static Logger log = Logger.getLogger(testLog4j.class);  
//使用方式
log.info("========test daily level info=========");  
    五、logback
   
    详见:
    
     https://blog.csdn.net/zzzgd_666/article/details/80458444
    
   
    六、Slf4j
   
Slf4j只提供接口,实现可以采用其他实现框架,以log4j举例
    1、jar包
   
主包:slf4j-api-1.7.12.jar
侨联包:slf4j-log4j12-1.7.12.jar
    2、使用方式
   
    
     技巧:用{}代替参数
    
   
// 导入slf4j类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// 添加slf4j日志实例对象
final static Logger logger = LoggerFactory.getLogger(Test.class);
// 输出日志
logger.info("测试:{}", "输出日志");
    七、commons-logging
   
实现框架以log4j举例
    1、jar包
   
common-logging.jar
无需侨联log4j的jar包
    2、使用方式
   
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static Log logger = LogFactory.getLog(YouClassName.class);   
logger.trace("我是trace信息");
logger.debug("我是debug信息");
logger.info("我是info信息");
logger.warn("我是warn信息");
logger.error("我是error信息");
 
