日志构件

  • Post author:
  • Post category:其他


一、常用日志构件

  • 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级别。


  1. fatal

    – 严重的,造成服务中断的错误;

  2. error

    – 其他错误运行期错误;

  3. warn

    – 警告信息,如程序调用了一个即将作废的接口,接口的不当使用,运行状态不是期望的但仍可继续处理等;

  4. info

    – 有意义的事件信息,如程序启动,关闭事件,收到请求事件等;

  5. debug

    – 调试信息,可记录详细的业务处理到哪一步了,以及当前的变量状态;

  6. 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配置方式

  1. 配置根Logger:等级, appenderName , appenderName
  2. 配置输出目的地Appender
  3. 配置日志信息的输出格式
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信息");



版权声明:本文为u014231646原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。