Java_日志_log4j2

简介

(1)日志接口(slf4j)
slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)

(2)日志实现(log4j、logback、log4j2)
log4j是apache实现的一个开源日志组件

logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现

log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

log4j2日志级别:
从大到小依次是: error, warn, info, debug, trace
log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等

性能比较:Log4J2 和 Logback 都优于 log4j(不推荐使用)
配置方式:Logback最简洁,spring boot默认,推荐使用

配置加载

配置文档

Appenders
	Appender   一个通道,定义日志文件的内容格式和保存的位置
		Filter	过滤
		Layout		输出格式
		Policies	何时进行输出
		Strategy	 如何进行输出
Loggers
	Logger	一个路由器,指定类、包中的日志信息流向哪个管道,以及控制他们的流量(日志级别)
	Root 	必须配置

Appender实现类

ConsoleAppender(Console) 控制台输出
FileAppender(File) 日志输出到文件
RandomAccessFileAppender(RandomAccessFile) 日志输出到文件,性能比上一个高
RollingFileAppender(RollingFile) 日志按规则分类输出到文件
RollingRandomAccessFileAppender(RollingRandomAccessFile) 日志按规则分类输出到文件

(1)Console 控制台输出

<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">
    <Appenders>
		<!-- target: SYSTEM_OUT/SYSTEM_ERR -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 格式化日志 -->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
        </Console>
    </Appenders>

    <Loggers>
        <!-- level默认为error -->
        <Root level="info">
            <!-- 这里引用了Appenders标签中的name值 -->
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

(2)RandomAccessFile 日志输出到文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">

    <Appenders>
    	<!-- fileName:文件输出位置 immediateFlush: 默认true 是否每次写入刷新硬盘-->
        <RandomAccessFile name="File" fileName="logs/app.log" immediateFlush="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
        </RandomAccessFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="File"/>
        </Root>
    </Loggers>
</Configuration>

(3)RollingRandomAccessFile 日志按规则分类输出到文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">

    <Appenders>
    	<!-- filePattern:%i 滚动参数值,从1递增 -->
        <RollingRandomAccessFile name="File" fileName="logs/app.log"
                                 filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log" >
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
            <Policies>
                <!-- 每 5s 翻滚一次 -->
                <CronTriggeringPolicy schedule="0/5 * * * * ?" />
                <!-- 一般使用上面表达式形式,比较灵活 modulate属性为true(默认) 可通过interval指定秒数5,从启动时间开始算5秒 -->
                <TimeBasedTriggeringPolicy interval="5" modulate="true"/>
                <!-- 单文件大小超过10兆 翻滚一次,单位:KB,MB,GB -->
                <SizeBasedTriggeringPolicy size="10 MB"/>
         </Policies>
             <!-- %i超过10,删除旧日志 -->
            <DefaultRolloverStrategy max="10" />     
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="File"/>
        </Root>
    </Loggers>

</Configuration>

Filter实现类

LevelRangeFilter 指定日志级别过滤
TimeFilter 指定时间进行过滤
ThresholdFilter

<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">

    <Appenders>
        <Console name="Console">
            <!--
                设置 onMismatch="NEUTRAL" 可以让日志经过后续的过滤器
                最后一个过滤器建议设置 onMismatch="DENY", 不然日志就输出了。
            -->
            <Filters>
                <!-- 从大到小:error, warn, info, debug, trace 该配置会输出代码中设置error,warn,info 级别的日志内容-->
                <LevelRangeFilter minLevel="error" maxLevel="info" onMatch="ACCEPT" onMismatch="NEUTRAL" />
                <!-- 只允许在每天的 8点半~11点半 之间输出日志 -->
                <TimeFilter start="08:30:00" end="11:30:00" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>

</Configuration>

Pattern 输出格式

%c{x} %class{x} 打印传递给logger的类的名称及路径。在{}中可以填入数字,比如:类的路径为”org.apache.commons.Foo”,则%c{1}输出”Foo”,%c{2}输出”commons.Foo”。可以不要{},则默认打印全路径。官方文档指出,打印类路径是一项昂贵的操作,可能影响性能,谨慎使用。

%d{x} %date{x} 打印时间。{}可以填写某种格式形式的字符串以表示不用格式的日期,官方提供的有:DEFAULT, ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。通常使用DEFAULT,输出形式为:2012-11-02 14:34:02,781。也可以自己指定格式,比如:yyyy-MM-dd HH:mm:ss,则输出:2017-12-31 15:43:41。

%n 换行。如果不指定,则日志输出默认是不换行的。通常放在输出格式的最后。

%highlight 高亮。用于指定不同级别的日志打印出不用的颜色。详细信息可参考官方文档。想要在eclipse的控制中做到这种效果,需要ANSI Escape in console插件的支持,参考log4j日志在eclipse控制台显示颜色的配置

%M 打印调用的方法名。官方文档指出,此项操作相当昂贵,可能影响性能,谨慎使用。

%l 打印类的全路径和调用处的行号,同时附加一个链接,指向该日志的调用位置,在eclipse控制台中,点击链接,可以跳转到此日志的调用位置。官方文档指出,此项操作相当昂贵,可能影响性能,谨慎使用。经过本人测试,想要打印出类的全路径以及调用的方法名,%l与%c.%M性能相差无几,但是%l多一个链接的功能,可以优先选择%l输出。

%m 打印传递给logger方法的用户日志信息。

%N 打印当前时间的毫微秒。如同调用:System.nanotime()

%pid 打印应用的进程ID。

%r 打印自虚拟机启动以来到此日志打印经过的毫秒数。

%sn 打印日志调用的次数。内部为一个自增长的序列,值从0开始,为整个应用的静态全局变量,

%T 打印调用此日志的线程ID。

SpringBoot

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- 使用log4j2 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>

spring boot 默认加载classpath添加log4j2.xml或者log4j2-spring.xml。

示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"> 
    <properties>
        <property name="LOG_HOME">D:/logs</property>
        <property name="FILE_NAME">mylog</property>
        <property name="log.sql.level">info</property>
    </properties>


    <Appenders>  
        <Console name="Console" target="SYSTEM_OUT">  
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n" />  
        </Console>

        <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingRandomAccessFile>
    </Appenders>  

    <Loggers>  
        <Root level="info">  
            <AppenderRef ref="Console" />  
            <AppenderRef ref="RollingRandomAccessFile" />  
        </Root>

        <Logger name="com.mengdee.dao" level="${log.sql.level}" additivity="false">
             <AppenderRef ref="Console" />
        </Logger>
    </Loggers>  
</Configuration>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值