log4j2.xml详解

log4j2.xml文件详解:

一、前言:

在讲日志具体配置前,讲一下log4j日志的基本概念:

log4j2.xml详解_第1张图片
  一个app如果要打印日志,首先需要获取一个打印器,用以打印日志。如上图中app下方拥有多个打印器:logger1、logger2、root,其中root是默认的打印器,当获取对应名称的打印器失败时,以该打印器打印日志。一个打印器可以绑定到多个打印介质上,例如控制台、文件、网络,数据库等。log4j2.xml用于定义打印器、打印输出介质。另外打印器的名字存在继承关系,例如com继承之root, com.apache继承之com,com.apache.log4j继承之com.apache等。分层的设计目的是为了便于不改代码而切换日志输出介质

二、配置详解:

2.1 概述

在log4j2.xml的文件中需要添加根元素、添加三个子元素。具体更加详细的内容见log4j2-config.xsd

<Configuration status="ERROR" monitorInerval="7200">
  <Properties>
    <Property name="jdk_version">1.8Property>
  Properties>
  
  <Appenders>
    
    <File>
    File>

    
    <RollingFile>
    RolingFile>

    
    <Console>
    Console>
  Appenders>

  
  <Loggers>
    <Logger name="com.package" level="DEBUG" additivity="false" includeLocation="true">
      <appender-ref ref="appder-name"/>
    Logger>

    <Root>
    Root>
  Loggers>
Congiguration>

  • 可以配置status、monitorInterval属性,status属性是控制log4j2本身的日志等级,如果太低就会出现很多杂乱的日志。monitorIntervel是控制多久读取一次log4j2.xml文件,可以不重启时更改日志输出格式方式。

  • 定义变量,在其中定义的变量可以后续使用。在子标签配置变量,name属性定义key,文本定义value

  • 定义一系列各种类型输出介质(类似A4纸的概念),用以指定日志输出到目标(控制台、文件、网络,数据库,kafak等),同时制定输出格式

  • 定义日志器,用以在代码中获取打印器(打印机),并绑定一个或者多个输出源,输出日志

2.2 详述


  1. 在该配置元素中添加子元素,一般是定义一些全局变量,变量的名在中的name属性定义,变量的值在标签中定义。
    <Properties>
        <Property name="LOG_HOME">${sys:log.home}Property>
    Properties>
    

  2. 定义打印介质的类型、名、介质地址、打印格式
  • 1)多种打印介质类型:
    在此元素下定义输出源,输出源可以为多种类型:等,分别代表可以输出到输出到文件、输出到滚动文件、控制台等等。

  • 2)打印介质的配置:
    不同打印介质的配置不尽相同,在这些不同日志输出源标签中可以定义属性和子元素,具体不同的输出源不同。在打印介质子元素中可以定义子元素来定义日志格式
    各种介质类型的配置参数不一样,举例其中的输出源格式如下:

    •  <File name="file_appender" fileName="log.text">
          <PatternLayout>
            <Pattern>%p|%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|%F:%L|%m%nPattern>
          PatternLayout>
       File>
      
    • <RollingFile name="YOUR_APP_APPENDER" fileName="${LOG_HOME}/your_app.log"
               filePattern="${LOG_HOME}/your_app.%d{yyyy-MM-dd}-%i.log.gz">
               
          <PatternLayout>
              <Pattern>%d|%level|%t|%m%nPattern> 
          PatternLayout>
          <Policies>
              
              <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
              
              <SizeBasedTriggeringPolicy size="250 MB"/>
              
              <CronTriggeringPolicy schedule="0 0 * * * ?"/>
          Policies>
      RollingFile>
      
      中:
      • name、fileName、filePattern
        分别定义打印介质名、文件名、日志滚动时新日志文件的文件名命名模式。

      • 子元素中中定义日志打印格式(这里用%d,%level都是一些内置变量)。
        日志格式的变量解释:
        %d:表示时间,精确到微秒
        %t:表示thread,线程名
        %level:表示日志的等级,等同于%p
        %msg:表示我们在代码中打印的内容,等同于%m
        %F:表示打印点所在文件名
        %L:表示打印点所在文件中的行数

      • 定义切分规则,本例中举例了按天切割、按大小分割、定时滚动需配合filePattern一起。至于其他的日志滚动策略具体用时可查。

  1. 打印器:
    分为自定义日志器和默认日志器
    定义打印日志的打印器,如果没有找到就用默认的日志器Root打印日志。这是因为在程序内部打印日志,一般会先获取日logger,一般都是getLogger(“logger_name”)之类的函数,就是根据logger_name来获取一个对应的logger,如果没有就会以默认的logger输出日志。一般都是以类名、包名来定义多个,这样对于不同的包、类采取不同的输出方式。一个日志器可以指定多个输出源。具体的Logger配置:
    <Logger name="com" level="debug" additivity="false" includeLocation="true">
     <appender-ref ref="YOUR_APP_APPENDER_NAME"/>
    Logger>
    
  • name:
    logger的名,在程序中调用getLogger(“logger_name”)时会根据logger_name匹配打印器,该函数会返回一个名字最匹配的打印器。一般都是和包名、类名相关的打印器名,这样在打印日志时可以携带一些类、包名,很方便定位问题。
  • level:
    定义日志等级,只有大于等于该等级的日志才会打印。日志等级有ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
  • includeLocation:
    是否包含文件名和打印行。
  • :
    定义输出源,一个Logger可以绑定多个输出源。

你可能感兴趣的:(Java)