Log4j现在已经被大家熟知了,所有细节都可以在网上查到,Log4j支持Appender,其中DailyRollingFileAppender是被经常用到的Appender之一。

最常用的Appender——RollingFileAppender

下面是RollingFileAppender的一个Log4j配置样例(配置1):

根据文件大小进行进行回滚。

log4j.appender.R=org.apache.log4j.RollingFileAppender  
log4j.appender.R.Threshold=DEBUG  
log4j.appender.R.File=test.log  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.R.MaxFileSize=20MB
log4j.appender.R.MaxBackupIndex=10

RollingFileAppender使用MaxFileSize设置一个日志文件的最大大小,当产生多个日志时,会在日志名称后面加上".1"、".2"、……这样的后缀,我们可以看到RollingFileAppender有个属性MaxBackupIndex,这个属性通过限制日志文件名后缀".n"中的n大小来限制日志数量,比如上面MaxBackupIndex=10,其实最大日志数量为11。我们知道这个有这个限制是很必要的,当我们的程序在服务器上运行时,随着时间的迁移,日志会越来越多,如果对日志数量没有限制,日志大小会越来越大,最后甚至占满整个硬盘。

可以按照周期时间来滚动日志文件的Appender——DailyRollingFileAppender

下面是DailyRollingFileAppender的一个Log4j配置样例(配置2):

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=test.log
log4j.appender.logfile.DataPattern='.'yyyy-MM-dd-HH-mm
log4j.appender.logfile.Threshold=debug
log4j.appender.logfile.encoding=UTF-8
log4j.appender.logfile.Append=false
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n

DailyRollingFileAppender特点是固定周期时间生成一个日志文件,比如,默认情况是每天生成一个文件。这种日志可以方便根据时间来定位日志位置,使日志清晰易查。但是这种日志有个不好地方是,不能限制日志数量,MaxBackupIndex属性和MaxFileSize在DailyRollingFileAppender中是无效的,我们上面已经提到限制日志数量的必要性。这里有两个解决办法:

  • linux上crontab+shell
  • java进程里面起一个线程,定期扫描日志文件夹。

重写DailyRollingFileAppender——CustomDailyRollingFileAppender

查看DailyRollingFileAppender源代码,发现rollOver()方法是用来生成文件的,当调用subAppend()方法时会根据判断当前时间是否大于应该生成新文件的时间了(具体实现可以查看源码,逻辑还是比较清晰的),如果大于,就生成。首先把当前日志重命名,命名格式为test.log.yyyy-MM-dd-HH-mm,然后重新建test.log文件。看到这里我们就可以想,在rollOver()方法里面加上删除过多的日志就不行了吗,的确可以这么做:

package org.apache.log4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.text.ParseException;
import java.util.*;
public class CustomDailyRollingFileAppender extends DailyRollingFileAppender {
        private static Logger logger = LoggerFactory.getLogger(CustomDailyRollingFileAppender.class);
        private int maxFileSize = 5;
        @Override
        void rollOver() throws IOException {
            super.rollOver();
            logger.debug("保留文件数量" + maxFileSize + ",日志文件名称为:" + fileName);
            List<File> fileList = getAllLogs();
            sortFiles(fileList);
            logger.debug(fileList.toString());
            deleteOvermuch(fileList);
         * 删除过多的文件
         * @param fileList 所有日志文件
        private void deleteOvermuch(List<File> fileList) {
            if (fileList.size() > maxFileSize) {
                for (int i = 0;i < fileList.size() - maxFileSize;i++) {
                    fileList.get(i).delete();
                    logger.debug("删除日志" + fileList.get(i));
         * 根据文件名称上的特定格式的时间排序日志文件
         * @param fileList
        private void sortFiles(List<File> fileList) {
            Collections.sort(fileList, new Comparator<File>() {
                public int compare(File o1, File o2) {
                    try {
                        if (getDateStr(o1).isEmpty()) {
                            return 1;
                        Date date1 = sdf.parse(getDateStr(o1));
                        if (getDateStr(o2).isEmpty()) {
                            return -1;
                        Date date2 = sdf.parse(getDateStr(o2));
                        if (date1.getTime() > date2.getTime()) {
                            return 1;
                        } else if (date1.getTime() < date2.getTime()) {
                            return -1;
                    } catch (ParseException e) {
                        logger.error("", e);
                    return 0;
        private String getDateStr(File file) {
            if (file == null) {
                return "null";
            return file.getName().replaceAll(new File(fileName).getName(), "");
         *  获取所有日志文件,只有文件名符合DatePattern格式的才为日志文件
         * @return
        private List<File> getAllLogs() {
            final File file = new File(fileName);
            File logPath = file.getParentFile();
            if (logPath == null) {
                logPath = new File(".");
            File files[] = logPath.listFiles(new FileFilter() {
                public boolean accept(File pathname) {
                    try {
                        if (getDateStr(pathname).isEmpty()) {
                            return true;
                        sdf.parse(getDateStr(pathname));
                        return true;
                    } catch (ParseException e) {
                       // logger.error("", e);
                        return false;
            return Arrays.asList(files);
        public int getMaxFileSize() {
            return maxFileSize;
        public void setMaxFileSize(int maxFileSize) {
            this.maxFileSize = maxFileSize;

首先,要注意的就是怎么判断日志文件夹中的日志是否是日志还是另外不相关的文件,比如备份的日志、控制台日志等。我使用的方法就是判断sdf.parse(name.replaceAll(file.getName(), ""))是否报异常,如果不报异常就说明这个文件是日志,当然不排除有的文件命名恰好符合这个格式,但是这样的文件在日志文件夹下,我们认为它就是一个日志文件也是合理的。然后我们根据sdf.parse(name.replaceAll(file.getName(), ""))解析出来的Date为所有日志进行升序排序放到一个队列中,再保留这个队列最后maxFileSize个文件的情况下,删除多余的日志文件。

然后,我们注意到我们上面的逻辑中用了maxFileSize这个变量,这个变量在MyDailyRollingFileAppender中,这个变量是怎么赋值的呢?

  log4j.appender.logfile.MaxFileSize=5  在设置时但是没有生效,如果各位知道问题,请各位看官留言。

log4j.appender.logfile=org.apache.log4j.MyDailyRollingFileAppender
log4j.appender.logfile.File=test.log
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd-HH-m
log4j.appender.logfile.MaxFileSize=5
log4j.appender.logfile.Append=false
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n
Log4j现在已经被大家熟知了,所有细节都可以在网上查到,Log4j支持Appender,其中DailyRollingFileAppender是被经常用到的Appender之一。最常用的Appender——RollingFileAppender下面是RollingFileAppender的一个Log4j配置样例(配置1):根据文件大小进行进行回滚。log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R
Log4j现在已经被大家熟知了,所有细节都可以在网上查到,Log4j支持Appender,其中DailyRollingFileAppender是被经常用到的Appender之一。在讨论今天的主题之前,我们先看下另外一个Appender。 最常用的Appender——RollingFileAppender 下面是RollingFileAppender的一个Log4j配置样例(配置1): log4...
本文为大家汇总了Android Studio ADB网络调试的使用方法,供大家参考,具体内容如下 随着技术的发展,现在的安卓手机大部分开始使用type-c接口了,这对于我们安卓程序猿来说也不是件好事情哈,如果要在不同版本手机做测试,每次调试程序的时候是不是要换数据线呢,当然二合一的数据线接口用起来也麻烦。今天就想着研究下网络调试应用程序,用起来很棒,给大家分享一下吧^_^ 首先请确保你的设备和电脑处于同一局域网络! 下面开始介绍两种连接方法。 1.使用AS命令控制台adb命令手动调试 USB连接上手机,在AS底部Terminal窗口中输入adb tcpip 5555 然后接着输入adb sh
DailyRollingFileAppender日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件。 我们可以按下面的方式配置DailyRollingFileAppender: log4j.rootCategory=INFO,file log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.DatePattern='.'yyyy-MM-dd log4j.appe
django自定义日志输出根据时间切割日志根据文件大小切割日志配置及实例化 django中使用自带的日志系统,分割日志的方式有两种。 一种是MyRotatingFileHandler,一种是MyTimedRotatingFileHandler。 前者是指 日志文件到达一定大小之后自动将此文件重命名保存, 在生成基础文件写入日志,如此循环。 后者是指 日志文件到达一定大小之后自动将此文件重命名保存, 在生成基础文件写入日志,如此循环。 两者大同小异,但是django自带的分割器命名的日志格式很奇怪, 新增参数maxBackupIndex,表示保留的文件数,默认值为1 直接使用DatePattern作为SimpleDateFormat的参数,这样可以完美支持DailyRollingFileAppender支持的所有打印周期 实现FileFilter用于提高日志文件列表读取的效率 将日志文件(如“web.log.2016-01-12”)后缀的日期格式(如“2016-01-12”)转换成long类型进行排序,实现排序的准确性 转换成long类型时进行一场捕获: try {
http://blog.sina.com.cn/s/blog_6c3f49640100n5oz.html DailyRollingFileAppender日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件。 我们可以按下面的方式配置DailyRollingFileAppender: log4j.rootCategory=INFO,S log4j.ap
# 设置个控制台输出源,该appender名叫:A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPat
log4j.addivity.org.apache=true # 应用于控制台 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern= [start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n #应用于文件 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis # 应用于文件回滚 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖 log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #应用于socket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern= [start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 # 发送日志给邮件 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.ap
本文实例为大家分享了Mac完整卸载Android Studio的方法,供大家参考,具体内容如下 第一种:卸载Android Studio的方法 1、卸载Android Studio,在终端(terminal)执行以下命令: rm -Rf /Applications/Android\ Studio.app rm -Rf ~/Library/Preferences/AndroidStudio* rm ~/Library/Preferences/com.google.android.studio.plist rm -Rf ~/Library/Application\ Support/Android