log4j集成到了原来的日志输出类中,仅用做日志文件输出配置如下:
log4j.rootLogger=A2log4j.appender.A2=org.apache.log4j.RollingFileAppenderlog4j.appender.A2.File=C:/test/log4j/info.log <----- 关键是这里log4j.appender.A2.MaxFileSize=20KBlog4j.appender.A2.MaxBackupIndex=100log4j.appender.A2.Append=falselog4j.appender.A2.layout=org.apache.log4j.PatternLayoutlog4j.appender.A2.layout.ConversionPattern=%m%n======================================
问题如下
1.指定的日志存放路径是 C:/test/log4j/info.log
但是我想动态生成时间日期文件夹,比如
C:/test/log4j/2008/01/02/info.log
C:/test/log4j/2008/01/02/info2.log
C:/test/log4j/2008/01/02/info3.logC:/test/log4j/2008/01/03/info.logC:/test/log4j/2008/02/14/info.log
这个如何在代码里实现,看过类似的动态路径C:/{filepath}/info.log,但也是一次性的,就是{filepath}一被指定,还是不变的2.动态日志文件编号问题
如上配置生成的动态文件一旦超过20KB,则新文件是
info.log.1
info.log.2
info.log.3
...
...我如何更改是新文件名为
info.log
info2.log
info3.log
...
...直接通过log4j的方式编号文件
log4j.rootLogger=A2log4j.appender.A2=org.apache.log4j.RollingFileAppenderlog4j.appender.A2.File=C:/test/log4j/info.log <----- 关键是这里log4j.appender.A2.MaxFileSize=20KBlog4j.appender.A2.MaxBackupIndex=100log4j.appender.A2.Append=falselog4j.appender.A2.layout=org.apache.log4j.PatternLayoutlog4j.appender.A2.layout.ConversionPattern=%m%n======================================
问题如下
1.指定的日志存放路径是 C:/test/log4j/info.log
但是我想动态生成时间日期文件夹,比如
C:/test/log4j/2008/01/02/info.log
C:/test/log4j/2008/01/02/info2.log
C:/test/log4j/2008/01/02/info3.logC:/test/log4j/2008/01/03/info.logC:/test/log4j/2008/02/14/info.log
这个如何在代码里实现,看过类似的动态路径C:/{filepath}/info.log,但也是一次性的,就是{filepath}一被指定,还是不变的2.动态日志文件编号问题
如上配置生成的动态文件一旦超过20KB,则新文件是
info.log.1
info.log.2
info.log.3
...
...我如何更改是新文件名为
info.log
info2.log
info3.log
...
...直接通过log4j的方式编号文件
修改target 的命名 public // synchronization not necessary since doAppend is alreasy synched
void rollOver() {
File target;
File file; LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount());
LogLog.debug("maxBackupIndex="+maxBackupIndex); // If maxBackups <= 0, then there is no file renaming to be done.
if(maxBackupIndex > 0) {
// Delete the oldest file, to keep Windows happy.
file = new File(fileName + '.' + maxBackupIndex);
if (file.exists())
file.delete(); // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
for (int i = maxBackupIndex - 1; i >= 1; i--) {
file = new File(fileName + "." + i);
if (file.exists()) {
target = new File(fileName + '.' + (i + 1));
LogLog.debug("Renaming file " + file + " to " + target);
file.renameTo(target);
}
} // Rename fileName to fileName.1
target = new File(fileName + "." + 1); this.closeFile(); // keep windows happy. file = new File(fileName);
LogLog.debug("Renaming file " + file + " to " + target);
file.renameTo(target);
} try {
// This will also close the file. This is OK since multiple
// close operations are safe.
this.setFile(fileName, false, bufferedIO, bufferSize);
}
catch(IOException e) {
LogLog.error("setFile("+fileName+", false) call failed.", e);
}
}
PS.继续关注....
<div><ifram src="http://www.xxx.com/xxx/2008/02/01/infolog1.html"></ifram></div>
<div><tt onclick="goPage(-1);">上一页</tt><tt onclick="goPage(1)">下一页</tt></div><ifram src="http://www.xxx.com/xxx/2008/02/01/infolog1.html"></ifram>
这个ifram的 src通过Js脚本赋值,这样实现分页,调试信息直接附加页面样式
logger.info("<div style="color:darkblue;font-size:12px">"+log+"</div>");infolog1.html:
<div style="color:darkblue;font-size:12px">输出的信息1</div>
<div style="color:darkblue;font-size:12px">输出的信息2</div>
<div style="color:darkblue;font-size:12px">输出的信息3</div>
<div style="color:darkblue;font-size:12px">输出的信息4</div>其实log4j有个DailyRollFileXXXXXXX的输出方式,就是按每天的方式输出,不清楚是不是2008/01/02/info1.html这样的输出部署,按日期文件夹分类日志便于查看信息和删除信息感谢waterborn指出的源代码位置.
哪个日期分类文件夹有时间在看看
RollingFileAppender.java类
public // synchronization not necessary since doAppend is alreasy synched
void rollOver() {
File target;
File file;
int p=fileName.indexOf("."); <---- 1
String fileL=fileName.substring(0,p); <---- 2
String fileR=fileName.substring(p+1); <---- 3
if (qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
LogLog.debug("rolling over count=" + size);
// if operation fails, do not roll again until
// maxFileSize more bytes are written
nextRollover = size + maxFileSize;
}
LogLog.debug("maxBackupIndex="+maxBackupIndex); boolean renameSucceeded = true;
// If maxBackups <= 0, then there is no file renaming to be done.
if(maxBackupIndex > 0) {
// Delete the oldest file, to keep Windows happy.
file = new File(fileL+maxBackupIndex+"."+fileR);
if (file.exists())
renameSucceeded = file.delete(); // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
file = new File(fileL+i+"."+fileR);
if (file.exists()) {
target = new File(fileL+(i+1)+"."+fileR);
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
}
} if(renameSucceeded) {
// Rename fileName to fileName.1
target = new File(fileL+"1."+fileR); this.closeFile(); // keep windows happy. file = new File(fileName);
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
//
// if file rename failed, reopen file with append = true
//
if (!renameSucceeded) {
try {
this.setFile(fileName, true, bufferedIO, bufferSize);
}
catch(IOException e) {
LogLog.error("setFile("+fileName+", true) call failed.", e);
}
}
}
} //
// if all renames were successful, then
//
if (renameSucceeded) {
try {
// This will also close the file. This is OK since multiple
// close operations are safe.
this.setFile(fileName, false, bufferedIO, bufferSize);
nextRollover = 0;
}
catch(IOException e) {
LogLog.error("setFile("+fileName+", false) call failed.", e);
}
}
}就这样了,目录哪个找不到源代码,结帖