如何配置log4j每天产生日志,并且当天日志大于10M时自动生成另一个文件

ekekyn 2013-11-06 04:57:40
如何配置log4j每天产生日志,并且当天日志大于10M时自动生成另一个文件

假设
11-11日
生成comlib_20131111.log,并当这个文件大于10MB时,生成另一个文件(comlib_20131111_1.log),在大于10M时生成comlib_20121111_2.log

11-12日
日志文件为comlib_20131112.log,大于10M生成comlib_20131112_1.log
...全文
34736 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
myt 2016-07-12
  • 打赏
  • 举报
回复
主解决了么,我也遇到同样的问题,求解
xiaoxiaoliulang 2016-04-01
  • 打赏
  • 举报
回复
lipanliudehua 2016-01-05
  • 打赏
  • 举报
回复
引用 13 楼 chy0920 的回复:
楼主最后解决了么,遇到相同问题,求解啊
你可以看下这个: http://www.codeforge.cn/read/245830/TimeSizeRollingFileAppender.java__html
  • 打赏
  • 举报
回复
楼主最后解决了么,遇到相同问题,求解啊
yezhijing 2015-06-27
  • 打赏
  • 举报
回复
引用 10 楼 u013337661 的回复:
请问为什么我用这个重写的类后,报空指针异常;求指点.谢谢.
你传入的日志文件名中没的日期的相关信息
TANGKUOTANG 2013-12-30
  • 打赏
  • 举报
回复
请问为什么我用这个重写的类后,报空指针异常;求指点.谢谢.
ekekyn 2013-11-08
  • 打赏
  • 举报
回复
自定义了一个类
public class ExRollingFileAppender extends RollingFileAppender {

	private long nextRollover = 0;
	private static Map<String, BeginFileData> fileMaps = new HashMap<String, BeginFileData>();
	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

	/**
	 * 重写父类的方法
	 */
	public void rollOver() {
		File target;
		File file;

		int maxBackupIndexLeng = String.valueOf(maxBackupIndex).length();
		if (qw != null) {
			long size = ((CountingQuietWriter) qw).getCount();
			LogLog.debug("rolling over count=" + size);
			nextRollover = size + maxFileSize;
		}

		LogLog.debug("maxBackupIndex=" + maxBackupIndex);
		String nowDateString = sdf.format(new Date());
		String newFileName = (fileName.indexOf(".") != -1 
							 ? fileName.substring(0, fileName.lastIndexOf(".")) 
							 : fileName);

		boolean renameSucceeded = true;
		/** 如果maxBackups <= 0,那么文件不用重命名 **/
		if (maxBackupIndex > 0) {

			/** 删除旧文件 **/
			file = new File(newFileName + '_'
					+ getIndex(maxBackupIndex, maxBackupIndexLeng));
			if (file.exists()) {
				renameSucceeded = file.delete();
			}

			for (int i = maxBackupIndex - 1; (i >= 1 && renameSucceeded); i--) {
				file = new File(newFileName + '_'
						+ getIndex(i, maxBackupIndexLeng));

				if (file.exists()) {
					target = new File(newFileName + '_'
							+ getIndex(i + 1, maxBackupIndexLeng));

					LogLog.debug("Renaming file " + file + " to " + target);
					renameSucceeded = file.renameTo(target);
				}
			}

			if (renameSucceeded) {
				BeginFileData beginFileData = fileMaps.get(fileName);
				/** 在每天一个日志目录的方式下,检测日期是否变更了,如果变更了就要把变更后的日志文件拷贝到变更后的日期目录下。 **/
				if (newFileName.indexOf(nowDateString) == -1
						&& beginFileData.getFileName().indexOf("yyyyMMdd") != -1) {
					newFileName = beginFileData.getFileName().replace(
							"yyyyMMdd", nowDateString);

					newFileName = (newFileName.indexOf(".") != -1 ? newFileName
							.substring(0, newFileName.lastIndexOf("."))
							: newFileName);

				}
				target = new File(newFileName + '_'
						+ getIndex(1, maxBackupIndexLeng));
				this.closeFile();
				file = new File(fileName);
				LogLog.debug("Renaming file " + file + " to " + target);

				renameSucceeded = file.renameTo(target);

				/** 如果重命名失败,重新打开文件,并在文件上追加 **/
				if (!renameSucceeded) {
					try {

						this.setFile(fileName, true, bufferedIO, bufferSize);
					} catch (IOException e) {
						LogLog.error("setFile(" + fileName
								+ ", true) call failed.", e);
					}
				}
			}
		}

		/** 重命名成功 **/
		if (renameSucceeded) {

			try {
				this.setFile(fileName, false, bufferedIO, bufferSize);
				nextRollover = 0;
			} catch (IOException e) {
				LogLog.error("setFile(" + fileName + ", false) call failed.", e);
			}
		}
	}

	/**
	 * 文件个数的长度补零,如果文件个数为10那么文件的个数长度就是2位,第一个文件就是01,02,03....
	 * 
	 * @param i
	 * @param maxBackupIndexLeng
	 * @return
	 */
	private String getIndex(int i, int maxBackupIndexLeng) {
		String index = String.valueOf(i);
		int len = index.length();
		for (int j = len; j < maxBackupIndexLeng; j++) {
			index = "0" + index;
		}
		return index + ".log";
	}

	/**
	 * 重写 RollingFileAppender的方法
	 * 
	 * @since 0.9.0
	 */
	protected void subAppend(LoggingEvent event) {
		super.subAppend(event);
		if (fileName != null && qw != null) {

			String nowDate = sdf.format(new Date());
			/** 检测日期是否已经变更了,如果变更了就要重创建文件 **/
			if (!fileMaps.get(fileName).getDate().equals(nowDate)) {
				rollOver();
				return;
			}
			/** 检测文件大小,超过指定大小重新创建文件 **/
			long size = ((CountingQuietWriter) qw).getCount();
			if (size >= maxFileSize && size >= nextRollover) {
				rollOver();
			}
		}
	}

	@Override
	public synchronized void setFile(String fileName, boolean append,
			boolean bufferedIO, int bufferSize) throws IOException {

		String nowDate = sdf.format(new Date());

		/** 如果文件路径包含了“yyyyMMdd”就是每天一个日志目录的方式记录日志(第一次的时候) **/
		if (fileName.indexOf("yyyyMMdd") != -1) {
			String beginFileName = fileName;
			fileName = fileName.replace("yyyyMMdd", nowDate);
			fileMaps.put(fileName, new BeginFileData(beginFileName, nowDate));
		}
		BeginFileData beginFileData = fileMaps.get(fileName);

		/** 检测日期是否已经变更了,如果变更了就要把原始的字符串给fileName变量,把变更后的日期做为开始日期 **/
		if (!beginFileData.getDate().equals(nowDate)) {
			/** 获取出第一次的文件名 **/
			beginFileData.setDate(nowDate);
			fileName = beginFileData.getFileName().replace("yyyyMMdd", nowDate);
			fileMaps.put(fileName, beginFileData);
		}
		super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
	}

	class BeginFileData {

		public BeginFileData(String fileName, String date) {
			super();
			this.fileName = fileName;
			this.date = date;
		}

		private String fileName;
		private String date;

		public String getFileName() {
			return fileName;
		}

		public void setFileName(String fileName) {
			this.fileName = fileName;
		}

		public String getDate() {
			return date;
		}

		public void setDate(String date) {
			this.date = date;
		}
	}
}
ekekyn 2013-11-07
  • 打赏
  • 举报
回复
引用 4 楼 chen2713756 的回复:
log4j主要提供RollingFileAppender和DailyRollingFileAppender两种方式将日志记录输出到文件。RollingFileAppender按log文件最大长度限度生成新文件,DailyRollingFileAppender按日期生成新文件。 log4j.appender.A2=org.apache.log4j.RollingFileAppender log4j.appender.A2.MaxFileSize=50MB log4j.appender.A2.MaxBackupIndex=10 log4j.appender.A2.File=${logDir}auto.log log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%-4r %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] %-5p %c - %m%n 上面的示例是使用RollingFileAppender的写法,将会在logDir所指定的目录下生成auto.log文件,当文件大小超过50MB时,将原来的文件名改为auto.log.1,再使用auto.log接收新的日志记录。此处保留10个备份文件。 log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.File=${logDir}fms_foreground.log log4j.appender.A2.DatePattern='.'yyyyMMdd log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%-4r %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] %-5p %c - %m%n 上面的示例是使用DailyRollingFileAppender的写法,配置完成的当天,会在logDir所指定的目录下生成fms_foreground.log文件,比如今天是2013-11-07,到明天这个文件将更名为fms_foreground.log.2013-11-08。
无论是那种方式都不能满足我的要求? 要怎样改写log4j,产生我需要的文件?
chen2713756 2013-11-07
  • 打赏
  • 举报
回复
log4j主要提供RollingFileAppender和DailyRollingFileAppender两种方式将日志记录输出到文件。RollingFileAppender按log文件最大长度限度生成新文件,DailyRollingFileAppender按日期生成新文件。 log4j.appender.A2=org.apache.log4j.RollingFileAppender log4j.appender.A2.MaxFileSize=50MB log4j.appender.A2.MaxBackupIndex=10 log4j.appender.A2.File=${logDir}auto.log log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%-4r %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] %-5p %c - %m%n 上面的示例是使用RollingFileAppender的写法,将会在logDir所指定的目录下生成auto.log文件,当文件大小超过50MB时,将原来的文件名改为auto.log.1,再使用auto.log接收新的日志记录。此处保留10个备份文件。 log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.File=${logDir}fms_foreground.log log4j.appender.A2.DatePattern='.'yyyyMMdd log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%-4r %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] %-5p %c - %m%n 上面的示例是使用DailyRollingFileAppender的写法,配置完成的当天,会在logDir所指定的目录下生成fms_foreground.log文件,比如今天是2013-11-07,到明天这个文件将更名为fms_foreground.log.2013-11-08。
ekekyn 2013-11-07
  • 打赏
  • 举报
回复
引用 7 楼 u011048844 的回复:
<appender name="name" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>../logs/comlib.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>../logs/comlib_%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>20MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%date{ISO8601} %-4relative [%thread] %-1level [%-20logger{20}] - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender>
"ch.qos.logback.core.rolling.RollingFileAppender"应该是自定义的一个类吧
醉欲眠卿且去 2013-11-07
  • 打赏
  • 举报
回复
<appender name="name" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>../logs/comlib.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>../logs/comlib_%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>20MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%date{ISO8601} %-4relative [%thread] %-1level [%-20logger{20}] - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender>
猫神jdx 2013-11-06
  • 打赏
  • 举报
回复
刚弄错了,以下这个是从一个系统里复制过来的,看看 log4j.appender.Root=org.apache.log4j.DailyRollingFileAppender log4j.appender.Root.File=d:/epmslog/epms.log log4j.appender.Root.encoding=UTF-8 log4j.appender.Root.DatePattern='.'yyyyMMdd log4j.appender.Root.layout=org.apache.log4j.PatternLayout log4j.appender.Root.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %m%n
ekekyn 2013-11-06
  • 打赏
  • 举报
回复
引用 1 楼 u012459865 的回复:
log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=c:/Axis2/WEB-INF/logs/jdx_axis2.log log4j.appender.R.MaxFileSize=10240KB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d-[HL] %p %t %c - %m%n RollingFileAppender每天0:00产生一个新日志文件,再把原来的日志文件自动改文件名 包括大小等
这种方式产生的文件并不带日期,而且文件不满1M,不会产生新的文件
猫神jdx 2013-11-06
  • 打赏
  • 举报
回复
log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=c:/Axis2/WEB-INF/logs/jdx_axis2.log log4j.appender.R.MaxFileSize=10240KB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d-[HL] %p %t %c - %m%n RollingFileAppender每天0:00产生一个新日志文件,再把原来的日志文件自动改文件名 包括大小等

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧