我可以使用log4j拥有Below Log文件结构吗?

时间:2016-04-30 10:14:16

标签: java date logging log4j log4j2

期望是使用相同名称的当前日志(即test.log) 档案文件名称应为test_(CurrentDate).log.1。

/logs/projectlogs/test.log

/ logs / projectlogs / test_20160430.log.1

/ logs / projectlogs / test_20160430.log.2

/ logs / projectlogs / test_20160430.log.3

使用以下属性文件,当前日期将附加所有文件。

log4j.properties ::

N > 0

2 个答案:

答案 0 :(得分:1)

log4j 2手册有很多示例配置,RollingFileAppender部分有一个符合您要求的示例:

http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/projectlogs/test.log"
                 filePattern="logs/projectlogs/$${date:yyyy-MM}/test-%d{yyyy-MM-dd-HH}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p[%t] %c{1.} %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="5" modulate="true"/>
        <SizeBasedTriggeringPolicy size="100 MB"/>
      </Policies>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

您可能还感兴趣的是Log4j-2.5引入了一个删除操作,使用户可以更好地控制在翻滚时删除哪些文件。见http://logging.apache.org/log4j/2.x/manual/appenders.html#CustomDeleteOnRollover

答案 1 :(得分:0)

您想要实现的是“基于大小和时间的文件命名和触发策略”(SizeAndTimeBasedFNATP),可以在最新版本的logback包中找到,该版本目前是1.1.7,但是,它可以是在1.1.2中也可以找到,因为它可以在没有太多异步过程的情况下产生更多可预测的结果(即使1.1.2更慢)。

logback包的工作方式与log4j类似,但使用基于XML的配置文件(logback.xml),在您的情况下可能看起来像下面一样(注意 test_%d {yyyyMMdd} .log。%i < / strong> - 这是你的模式)。

请注意,遗憾的是,可能限制日期内的索引。因此,每个日期不能只有5个日志块 - 每个日期将完全记录日志块索引,每个日期独立。但是,您可以限制日期总数和(在1.1.7中)日志文件夹的总大小(使用ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy)。

另外我建议你至少使用10Mb的块大小(100Kb很小),一般来说,更大的块,更容易通过log lib维护(减少CPU消耗)。

<?xml version="1.0" ?>
<configuration>
    <property name="log.folder" value="C:/logs/projectlogs"/>
<!--  UNCOMMENT BELOW SECTION IF CONSOLE IS REQUIRED -->
<!--
  <appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
    <encoder>
      <pattern>[%p] [%thread] %logger - %msg%n</pattern>
    </encoder>
  </appender>
-->
  <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE"> 
    <File>${log.folder}/test.log</File>
    <Append>true</Append>
    <encoder>
      <pattern>%d{ISO8601} [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.folder}/test_%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- keep 30 days' worth of history -->
            <maxHistory>30</maxHistory>
            <!-- up to 10 GB max -->
            <totalSizeCap>10GB</totalSizeCap>
             <MaxFileSize>100KB</MaxFileSize>
    </rollingPolicy>
  </appender>

  <root>
    <level value="INFO"/>
    <appender-ref ref="FILE"/>
  </root>

  <logger name="Main">
    <level value="DEBUG" />
  </logger>     

  <logger name="ch.qos">
    <level value="WARN"/>
  </logger>
</configuration>

测试Java应用程序

package logtester;
import org.apache.log4j.Logger;
public class LogTester {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger("Main");
        for(int i = 1; i<=20000; i++)
            logger.info("Log message "+i);
    }
}

运行后的文件夹结构:

 13,230 test.log
102,929 test_20160430.log.0
103,168 test_20160430.log.1
102,816 test_20160430.log.10
102,816 test_20160430.log.11
103,168 test_20160430.log.2
103,168 test_20160430.log.3
103,168 test_20160430.log.4
103,168 test_20160430.log.5
102,815 test_20160430.log.6
102,816 test_20160430.log.7
102,816 test_20160430.log.8
102,816 test_20160430.log.9

希望它有所帮助。