在系统运行中
log4j产生的日志文件都在一个目录里,查看日志的时候有很多的文件很不直观,如果log4j每天都生成一个以日期为目录名的目录,然后把当天的日志放到该目录里。查询日志的时候如果要查哪天的日志就到哪天的日期目录下查询非常直观方便,如下就是重写
org.apache.log4j.RollingFileAppender的类
package com.mttang.js.auth.util;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
//继承log4j的RollingFileAppender类
public class MttangLog4jRollingFileAppender extends RollingFileAppender {
private long nextRollover = 0;
private static Map<String, BeginFileData> fileMaps = new HashMap<String, BeginFileData>();
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// synchronization not necessary since doAppend is alreasy synched
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);
// if operation fails, do not roll again until
// maxFileSize more bytes are written
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;
// 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(newFileName +'.'+nowDateString+'.' +getIndex(maxBackupIndex,maxBackupIndexLeng));
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(newFileName +'.'+nowDateString+'.' + getIndex(i,maxBackupIndexLeng));
if(file.exists())
{
target = new File(newFileName +'.'+nowDateString+'.' +getIndex(i+1,maxBackupIndexLeng));
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
}
}
if(renameSucceeded) {
BeginFileData beginFileData = fileMaps.get(fileName);
System.out.println("fileName= "+fileName+"\t beginFileData="+beginFileData);
//在每天一个日志目录的方式下,检测日期是否变更了,如果变更了就要把变更后的日志文件拷贝到变更后的日期目录下。
if(newFileName.indexOf(nowDateString) == -1 && beginFileData.getFileName().indexOf("yyyy-MM-dd") != -1){
newFileName = beginFileData.getFileName().replace("yyyy-MM-dd", nowDateString);
newFileName = (newFileName.indexOf(".") != -1 ? newFileName.substring(0, newFileName.lastIndexOf(".")) : newFileName);
}
target = new File(newFileName +'.'+nowDateString+'.' + getIndex(1,maxBackupIndexLeng));
this.closeFile();
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);
}
}
}
/**
* 文件个数的长度补零,如果文件个数为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";
}
/**
This method differentiates RollingFileAppender from its super
class.
@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());
//如果文件路径包含了“yyyy-MM-dd”就是每天一个日志目录的方式记录日志(第一次的时候)
if(fileName.indexOf("yyyy-MM-dd") != -1){
String beginFileName = fileName;
fileName = fileName.replace("yyyy-MM-dd", 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("yyyy-MM-dd", nowDate);
fileMaps.put(fileName, beginFileData);
}
//D:/data/test/yyyy-MM-dd/test.log 替换yyyy-MM-dd为当前日期。
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;
}
}
}
log4j配置文件:
<appender class="
com.mttang.log4j.MyRollingFileAppender">
<param value="
D:/data/test/yyyy-MM-dd/test.log"/>
<param value="true"/>
<param value="50KB"/><!-每个文件50KB->
<param value="10"/><!-每天的日期目录下10个日志文件->
<layout class="org.apache.log4j.PatternLayout">
<param value="%c %d{ISO8601}-- %p -- %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param value="INFO" />
<param value="INFO" />
<param value=" http://wwww.baoshengdianzi.com " />
</filter>
</appender>
金属膜电阻供应商 http://wwww.baoshengdianzi.com
分享到:
相关推荐
Tomcat下使用Log4j接管生成日志文件,附件含配置说明以及所需要的jar包
NULL 博文链接:https://minjiaren.iteye.com/blog/432341
通过log4j扩展包实现生成带时间戳的日志文件(其中包含extras包以及简单demo)
每天生成一个log4j日志文件,如果只需要将最近一段时间内的日志文件保留,以前或更早的文件不用保留。例如只保留最近一周的日志,日志文件保留3天等等这些。。。通过这个jar包就可以实现。 log4j.properties文件在...
tomcat下用Log4j 按文件大小,生成catalina.out日志文件
log4j按照不同appender生成日志例子,log4j按照不同接口生成各自日志文件小例子。
log4net 配置 根据日期生成 文件 根据 分类 (INFO、ERROR) 生成文件 不同的日期可以生成不同的文件,INFO、ERROR生成单独的文件
很好的log4j文档,配置以及例子,一看便知!值得拥有
log4j2+slf4j+测试类日志按日期生成
在log4cpp下载的包基础上添加按日期生成日志类,仅供学习和交流
log4j日志文件的JAR包及配置文件。 使用log4j日志文件的步骤: Step1:添加日志文件所需要的JAR包; Step2:添加日志的配置文件; Step3:创建日志对象,使用日志对象的方法记录日志。
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式...
Log4j Android日志;两种方式可选;
简单的log4j实例,能够快速了解如何使用log4j生产文件
一个简单的写log日志的c++代码,可以将日志写入文件用来记录程序调试信息。
在log4j.properties配置文件中可以指定字符编码: 下面这行配置指定了两个appender: log4j.rootCategory=INFO,appender1的名字,appender2的名字 下面这两行配置将上一行的两个appender的字符编码配置为GBK:
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式...
log4j日志。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Linux tomcat下catalina.out日志文件分割...2.拷贝log4j.jar,lo4j.properties到./lib目录下; 3.删除./conf/logging.properties 4.重启 log4j配置样本 实例代码: log4j.rootLogger=INFO,CATALINA log4j.logger.com.dan
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过...