本人近年都在做
   
    Android
   
   项目,最近有个纯
   
    Java
   
   项目紧张,临时介入其中。日志模块,控制端显示不同等级日志同时保存到文件中,要求每天保存一个日志文件,日志目录保留最近30天日志文件。最初没想到用库,自己采用线程池方式写日志,在写日志时先判断是否有30天前的日志删除,然后对比时间判定是否有当天日志文件,之后采用BufferedWriter写日志。写好后,客户进行代码审查,不太相信我写的效率,要求采用公共控件的方式来写日志。无奈就找到了Log4j2。
  
    
  
   
    以上,无聊记录一下,本文中不会涉及太基本的配置与字段的意义,部分会较详细说明一下。
   
  
  
   
    1.官网下载
    
     Log4j包
    
    ;
   
  
  
   
    2.将其中的log4j-api-2.5.jar,log4j-core-2.5.jar加入工程;
   
  
  
   
    3.src目录下加入log4j2.xml,配置好相关属性;
   
  
  
   
    4.需用的代码中加入static Logger sLogger = LogManager.getLogger(LogManage.class.getName()); sLogger.debug(strLog);即可调用使用。
   
  
  
   现就log4j2.xml注释说明:
  
  <?xml version="1.0" encoding="UTF-8"?>  
<Configuration>  
    <Appenders>  
    <!-- 输出到控制台 -->  
        <Console name="CONSOLE" target="SYSTEM_OUT">  
            <!-- 输出格式 -->  
            <PatternLayout pattern="ROOT:%d %-5p %C %L - %m%n" />  
        </Console>  
        <!-- 按天备份一个日志 -->  
        <!-- fileName为生成的文件名,x为路径,也可以采用相对路径模式,filePattern为时间到达后产生新日志,旧日志的文件名 -->  
        <RollingFile name="TASK" fileName="x:/xxxx/logs.log"  
            filePattern="x:/xxxx/logs_%d{yyyy-MM-dd}.log" >   
            <!-- 输出格式 -->  
            <PatternLayout pattern="%d %-5p %m%n" />  
            <Policies>  
            <!-- 每1天更新一次,此处查阅网上和官方示例中,都是以小时出现,我测试是以天为单位。(官方文档中说明按item类型是否是小时,但没找到在哪里设置item类型)另有其他各类型策略,请参阅官方文档 --> 
<!-- TimeBasedTriggeringPolicy需要和filePattern配套使用,由于filePattern配置的时间最小粒度是dd天,所以表示每一天新建一个文件保存日志。SizeBasedTriggeringPolicy表示当文件大小大于指定size时,生成新的文件保存日志。 --> 
                <TimeBasedTriggeringPolicy modulate="true"  
                    interval="1" />  
                <!-- 此处为每个文件大小策略限制,使用它一般会在文件中filePattern采用%i模式 -->  
                <!-- <SizeBasedTriggeringPolicy size="128KB" /> -->  
            </Policies>  
            <!-- 最多备份30天以内的日志,此处为策略限制,Delete中可以按自己需要用正则表达式编写 -->  
        <!-- DefaultRolloverStrategy字段中加入max=“30”经测试是配合SizeBasedTriggeringPolicy限制%i的存在数量,并没有发现是网上流传的是最多保存多少个文件的限制,也或许是我写的有问题 -->  
         <DefaultRolloverStrategy>  
        <Delete basePath="x:/xxxx" maxDepth="1">  
                     <IfFileName glob="logs_*.log" />  
                     <IfLastModified age="30d" />  
            </Delete>  
            </DefaultRolloverStrategy>  
        </RollingFile>  
    </Appenders>  
    <!-- 链接到Console和RollingFile标签实现debug以上等级的输出 -->  
    <loggers>    
    <root level="debug">    
        <appender-ref ref="CONSOLE"/>    
        <AppenderRef ref="TASK" />  
    </root>    
    </loggers>    
</Configuration>  
  
   - 
    
     
      import
     
     
      org.apache.logging.log4j.LogManager;
     
    
   
- 
    
     
      import
     
     
      org.apache.logging.log4j.Logger;
     
    
   
- 
    
     
      import
     
     
      org.dom4j.Document;
     
    
   
- 
    
     
      import
     
     
      org.dom4j.DocumentHelper;
     
    
   
- 
    
     
      import
     
     
      org.dom4j.Element;
     
    
   
- 
    
    
   
- 
    
     
      import
     
     
      taskservice.GlobalInstance;
     
    
   
- 
    
    
   
- 
    
     
      public
     
     
     
     
      class
     
     
      LogManage
     
     
      implements
     
     
      ILogManage {
     
    
   
- 
    
    
   
- 
    
     
      private
     
     
      ServiceState mServiceState;
     
    
   
- 
    
     
      private
     
     
     
     
      final
     
     
      String strLogFilePath = GlobalInstance.taskServiceConfig.strLogFilePath;
     
    
   
- 
    
     
     
     
    
   
- 
    
     
      static
     
     
      Logger sLogger = LogManager.getLogger(LogManage.
     
     
      class
     
     
      .getName());
     
    
   
- 
    
    
   
- 
    
     
      public
     
     
      LogManage() {
     
    
   
- 
    
     mServiceState =
     
      new
     
     
      ServiceState();
     
    
   
- 
    
     }
    
   
- 
    
    
   
- 
    
     
      @Override
     
     
     
    
   
- 
    
     
      public
     
     
     
     
      void
     
     
      log(
     
     
      int
     
     
      level, String strLog) {
     
    
   
- 
    
     GlobalInstance.taskServiceUi.logInfo(strLog);
    
   
- 
    
     
     
     
    
   
- 
    
     
      switch
     
     
      (level) {
     
    
   
- 
    
     
      case
     
     
      LogLevel.DEBUG:
     
    
   
- 
    
     sLogger.debug(strLog);
    
   
- 
    
     
      break
     
     
      ;
     
    
   
- 
    
     
      case
     
     
      LogLevel.INFO:
     
    
   
- 
    
     sLogger.info(strLog);
    
   
- 
    
     
      break
     
     
      ;
     
    
   
- 
    
     
      case
     
     
      LogLevel.WARNING:
     
    
   
- 
    
     sLogger.warn(strLog);
    
   
- 
    
     
      break
     
     
      ;
     
    
   
- 
    
     
      case
     
     
      LogLevel.ERROR:
     
    
   
- 
    
     sLogger.error(strLog);
    
   
- 
    
     
      break
     
     
      ;
     
    
   
- 
    
     
      default
     
     
      :
     
    
   
- 
    
     
      break
     
     
      ;
     
    
   
- 
    
     }
    
   
- 
    
     }
    
   
- 
    
     }
    
   
  网上看的文章,亲测有用.
果你做过类似的资料搜索工作, 你会容易找到相关的配置方法. 然而, 但是, 大部分都是你抄我, 我抄你的, 并没有仔细检测, 就写的教程.
其中重要的就是删除过期日志
  
   文件
  
  的配置. 很多都说通过max=数字控制.
这是扯淡, 这个只是控制某时间段内(根据配置不同)
  
   文件
  
  的数目.它并不会关心你的目录下一共有多少个日志
  
   文件
  
  了. 可想而知, 这样随着时间的推移, 虽然每个时间区间内日志数目控制在范围内, 但是, 总日志
  
   文件
  
  个数, 依然日益膨胀.
  
   log
  
  4j2.xml
                                    RollingFile:
  
   使用
  
  
   文件
  
  方式记录日志
- fileName:记录日志的
  
   文件
  
  - filePattern:当日志记录
  
   文件
  
  超过指定大小时,以指定的
  
   文件
  
  格式生成新的
  
   文件
  
  SizeBasedTriggeringPolicy
- size:指定每个日志
  
   文件
  
  大小,如果超过该大小,则生成新的日志
  
   文件
  
  DefaultRolloverStrategy
 - max 指定相同规则
  
   文件
  
  最多保留多少个,如果规则是root-%d{yyyy-MM-dd}-%i.
  
   log
  
  ,那么此时是以天为单位记录,会依次生成root-2022-0
                                    当
  
   log
  
  4j
  
   使用
  
  DailyRollingFileAppender进行日志归档时,需要对日志的个数进行控制。
此时需要对DailyRollingFileAppender进行重写。
package org.apache.
  
   log
  
  4j;
import org.slf4j.
  
   Log
  
  ger;
import org.slf4j.
  
   Log
  
  gerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
<Configuration status="WARN">
	<Properties>
		<Property name="
  
   LOG
  
  _PATTERN">%highlight{%d{yyyy-MM-dd HH:mm:ss} ...
                                    日志
  
   文件
  
  大小1MB,每天最多保留10个
  
   文件
  
  ,只保留7天的日志
rollingRandomAccessFile: # 日志
  
   文件
  
  Appender,将日志信息输出到日志
  
   文件
  
  - name: ROLLING_FILE
     fileName: ${
  
   log
  
  Path}/${projectName}.
  
   log
  
  filePattern: "${
  
   log
  
  Path}/history
  
   Log
  
  s/$${date:yyyy-MM}/${projectName}-%d{yyyy-MM-dd}-%i.
  
   log
  
  .gz"
                                    原文:http://www.shanhh.com/set_max_count_of_
  
   log
  
  _files_for_
  
   log
  
  4j/
Appender为日志输出目的地,
  
   log
  
  4j已经提供了非常丰富的Appender用以满足不同的需求:
org.apache.
  
   log
  
  4j.ConsoleAppender 输出到控制台org.apache.
  
   log
  
  4j.FileAppender 输出到
  
   文件
  
  org.a
scan:当此属性设置为true时,配置
  
   文件
  
  如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置
  
   文件
  
  是否有修改的时间间隔,如果没有给出时间单位,默认...
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/
  
   log
  
  ging/
  
   log
  
  back/defaults.xml" />
    <appender name="CONSOLE" class="ch.qos.
  
   log
  
  back.core.ConsoleAppe