log4j2配置

log4j2

  简介

       一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相。与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础上进行的升级,解决了log4j中的一些问题,例如:多线程下性能低下、api不支持占位符{}的使用、配置文件不能自动重新加载等。

为什么说log4j在多线程情况下性能低下呢?主要是synchronized锁在作怪,当我们的log4jzai 获取appender对象时,需要进行加锁处理;而接下来对appender操作(将要进行日志打印)时,也进行了加锁处理,这样一来性能自然得不到提升,从而导致整个应用的qps下降。而在log4j2中,由于引入了异步logger,使得log4j2的性能得到了巨大的提升,相比于log4j,logback而言,提升了数10倍之多。

  快速搭建

       第一步、先导入它的jar包。如果是普通项目的话,到log4j2官网下载jar包,然后将log4j-api-2.7.jar和log4j-core-2.7.jar添加到你项目的类路径下。如果使用Maven或者Gradle的话,到mvn仓库查询查找这两个包,然后添加到项目依赖中。这样就完成了准备工作。

       第二步、在classpath下导入log4j2.xml,配置如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd">
<!-- TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->
<configuration status="INFO">    
	<properties>
		<Property name="log.path">D:/logs/test</Property>
		<property name="HUIHUI_LOG_FILE_NAME">test</property>
	</properties>
  <appenders>    
    <Console name="Console" target="SYSTEM_OUT">    
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>    
    </Console>
    <File name="fileName" fileName="${log.path}/temp.log">
    	<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>    
  </appenders> 
 
  <loggers>    
    <root level="trace">    
      <appender-ref ref="Console"/>    
      <appender-ref ref="fileName"/>    
    </root>    
  </loggers>    
</configuration>   

       第三步、整理代码。如下。

package lib;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;

public class Main {

	private static Logger logger = (Logger) LogManager.getLogger(Main.class);
	
	public static void main(String[] args) {
		
		logger.trace("测试级别trace");
		logger.warn("测试级别:warn");
		logger.debug("方法测试");
		logger.error("方法发生错误,test");
	}
}

   配置详解

     关于配置文件的名称以及在项目中的存放位置
     log4j是apache的一个开源项目,在写这篇博客的时候已经发布了2.0的beta版本,首先需要注意的是,log4j 2.0与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。在默认情况下,系统选择configuration文件的 优先级 如下:(classpath为scr文件夹)
  1. classpath下名为 log4j-test.json 或者log4j-test.jsn文件
  2. classpath下名为 log4j2-test.xml
  3. classpath下名为 log4j.json 或者log4j.jsn文件
  4. classpath下名为 log4j2.xml
     我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。
     缺省默认配置文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">

   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
     </Console>
   </Appenders>
   
   <Loggers>
     <Root level="error">
     	<AppenderRef ref="Console"/>
     </Root>
   </Loggers>
</Configuration>
     常用配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
    <Appenders>

        <!--控制台-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <!--普通文件:-->
        <File name="File" fileName="e:/log.out" append="true" immediateFlush="false" bufferedIO="true" bufferSize="1024">
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %L- %msg%n</Pattern>
            </PatternLayout>
        </File>

        <!--异步appender:-->
        <Async name="Async">
            <AppenderRef ref="File"/>
        </Async>

        <!--循环写入文件:-->
        <RollingFile name="RollingFile" fileName="e:/log.out" filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out">
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <!--滚动策略:-->
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 kb"/> 
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

    </Appenders>

    <Loggers>
       
        <!--单独指定logger-->
        <Logger name="com.jiaboyan.logDemo.log4j2Demo" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="File"/>
        </Logger>
        
        <!--根logger-->
        <Root level="info" >
            <AppenderRef ref="Async"/>
            <AppenderRef ref="File"/>
            <AppenderRef ref="Console"/>
        </Root>
        
        <!--异步logger-->
        <AsyncRoot level="info">
            <AppenderRef ref="File"/>
        </AsyncRoot>
    </Loggers>

</Configuration>
  1. Configuration -- 根节点
    <Configuration status="debug" monitorInterval="30"></Configuration>
    
        Configuration:表示log4j2中的Configuration对象,实际为XmlConfiguration;
        status:表示log4j2本身的日志信息打印级别,当设置为TRACE 或者 DEBUG 级别时,便会打印出log4j2内部初始化的一些日志信息; 
        monitorInterval:表示每隔一定时间重新加载log4j2配置文件,单位秒;
  2. Appenders -- Console
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    
    name:表示控制台Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译;
    target:表示ConsoleAppender使用哪种方式将日志输出到控制台,一般调用System.out.println()方法;
    PatternLayout--pattern:表示日志信息输出的格式;
  3. Appenders -- File
    <File name="File" fileName="e:/log.out" append="true" immediateFlush="false" bufferedIO="true" bufferSize="8096">
        <PatternLayout>
            <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %L- %msg%n</Pattern>
        </PatternLayout>
    </File>
    
    name:表示文件Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译;
    fileName:表示生成的日志文件名称;
    append:表示新生成的日志是否追加到日志文件中,如果为true则表示追加,false表示覆盖原有日志信息;
    immediateFlush:表示日志打印请求是否立即输出,true为立即,false表示使用缓存;
    bufferedIO:表示日志打印请求是否使用缓存,true为使用,false为不使用;
    bufferSize:表示日志打印请求的使用缓存的大小,默认为8096字节;
    PatternLayout--pattern:同上
  4. Appenders -- RollingFile
    <RollingFile name="RollingFile" fileName="e:/log.out" filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out">
        <PatternLayout>
            <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <CronTriggeringPolicy schedule="0 0 * * * ?"/>
            <SizeBasedTriggeringPolicy size="100 kb"/> 
        </Policies>
        <DefaultRolloverStrategy max="5"/>
    </RollingFile>
    
    name:表示滚动文件Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译;
    fileName:表示当前日志所在的日志文件名称; 
    filePattern:表示滚动日志的文件名称模板,当日志文件进行滚动后,滚动后的文件按照此模板进行命名;
    PatternLayout--pattern:同上;
    Policies:表示日志文件滚动策略;
    Policies -- TimeBasedTriggeringPolicy:表示日志文件按照时间间隔来进行滚动;
    Policies -- CronTriggeringPolicy:表示日志文件按照设置的时间点来进行滚动;
    Policies -- SizeBasedTriggeringPolicy:表示日志文件按照文件大小来进行滚动;
    DefaultRolloverStrategy:表示log4j2进行滚动后保存的日志文件数量,默认为7个;
  5. TimeBasedTriggeringPolicy
    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
    
    TimeBasedTriggeringPolicy表示按照时间间隔来进行日志文件的滚动,间隔单位可以是分钟、小时,具体需要根据filePattern的格式来进行判别;
    例如filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out",则表示mm(分钟)为单位;
    interval:表示分隔日志的时间间隔大小,如果时间间隔单位是分钟,则表示相隔1分钟、10分钟等进行一次日志分隔;
    modulate:表示是否对分隔时间进行调制;如果设置为true则表示分隔的时间从每天的0点、每小时的0分钟开始进行计算,每间隔多久进行一次切割;比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00。。。
  6. Appenders -- Async
    <Async name="Async">
        <AppenderRef ref="File"/>
    </Async>
    
    name:表示异步Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译;
    异步Appender使用消费者生产者模式进行日志信息的打印,适用于并发量较大的情况;
  7. SizeBasedTriggeringPolicy
    <SizeBasedTriggeringPolicy size="100 kb"/> 
    
    SizeBasedTriggeringPolicy表示按照规定的日志文件大小进行切割日志;
    size:表示进行切割日志文件大小的极值,当日志文件大小满足size的值时,就会进行日志的切割;
  8. DefaultRolloverStrategy
    <DefaultRolloverStrategy max="5"/>
    
    DefaultRolloverStrategy表示log4j2每单位时间内最多能保存多少个日志切割文件,一般与SizeBasedTriggeringPolicy结合使用;
    max:表示保存的最大值,默认为7;
    例如:你的log4j2.xml设置如下:fileName="e:/log.out" filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out"
    那么在每分钟内,你可以保留2个日志切割文件,多余的日志进行覆盖;
  9. CronTriggeringPolicy
    <CronTriggeringPolicy schedule="0 0 * * * ?"/>
    
    CronTriggeringPolicy表示按照Cron表达式设置的时间点进行切割日志;
    schedule:表示设置的cron表达式;
  10. PatternLayout
    <PatternLayout>
        <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
    </PatternLayout>Pattern:设置输出的日志信息格式;具体格式如下:
    
    %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间
    %t : 线程名称
    %p : 日志级别
    %level : 日志级别
    %c : logger的名称
    %logger : logger的名称
    %C : Java类名
    %m : 日志内容
    %n : 换行符
    %L : 日志输出所在行数
    %M : 日志输出所在方法名
  11. Loggers -- Logger
    <Logger name="com.jiaboyan.logDemo.log4j2Demo" level="info" additivity="false">
        <AppenderRef ref="File"/>
    </Logger>
    
    在<Loggers>节点下,对某个类单独进行日志配置,便可使用<logger>节点;
    上例中,我们对名称为com.jiaboyan.logDemo.log4j2Demo的类进行日志配置。
    level指定级别,additivity表示是否向上传递打印日志信息(若为true则向上传递,那么root根对象也会进行日志打印);
  12. Loggers -- Root
    <Root level="info" >
        <AppenderRef ref="Async"/>
        <AppenderRef ref="File"/>
        <AppenderRef ref="Console"/>
    </Root>
    
    Root根日志节点,指定具体的日志级别,以及使用何种Appender进行日志输出;
  13. Loggers -- AsyncRoot
    <AsyncRoot level="info" includeLocation="false">
        <AppenderRef ref="File"/>
    </AsyncRoot>
        
    如果想使用异步logger,还需要在pom.xml中添加disruptor的依赖。
    includeLocation结合异步logger使用,当其设置为true时,才会显示具体的行号,以及日志所在的类名;
    如果设置为false,哪怕<Pattern>设置了输出行号也不会显示出来;
  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值