在系统运行中
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
分享到:
相关推荐
2. **使用DailyRollingFileAppender**:`DailyRollingFileAppender`是`log4j`提供的一种特殊Appender,它可以按照指定的时间间隔(通常是每天)滚动生成新的日志文件。我们可以通过以下配置设置每日滚动: ```...
在这个配置中,`MaxFileSize`参数指定了单个日志文件的最大大小(5MB),一旦达到这个大小,Log4j会滚动日志并创建新的文件。`MaxBackupIndex`参数指定了最多保留的旧日志文件数量,这里设置为10,意味着系统会保留...
创建一个名为`log4j.properties`或`log4j.xml`的配置文件,放置在Web应用的`WEB-INF/classes`目录下。例如,`log4j.properties`配置如下: ```properties # 设置全局日志级别为INFO log4j.rootLogger=INFO, FILE #...
总结来说,Log4j是一个强大的日志框架,通过使用extras包和适当的配置,我们可以方便地生成带有时间戳的日志文件,进行日志级别的控制,以及有效地管理日志文件的大小。在实际项目中,熟练掌握Log4j的使用对于提高...
- Commons-Logging:提供了一个统一的日志接口,可以根据环境自动选择合适的日志实现(如Log4j、JDK内置日志等)。在程序中使用`Log`和`LogFactory`,无需直接引用Log4j的类。 在实际应用中,根据项目需求,可以...
首先,要在项目中启用Log4j,需要创建一个名为`log4j.properties`的配置文件,将其放在`classes`目录下。这个文件用于定义Log4j的行为,包括日志的级别、输出目的地、格式等。 1. **配置根Logger** 根Logger是Log4...
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd'.log' # 每天生成一个新的日志文件 # 设置日志格式 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d...
在这个配置中,`DatePattern`参数指定了日期格式,`'.'yyyy-MM-dd`表示每天一个新的日志文件,文件名为`app.log.yyyy-MM-dd`。这样,每天都会自动创建一个新的日志文件。 **动态生成文件夹:** Log4j默认会在指定的...
当运行这个测试类,它将按照`log4j2.xml`配置生成日志文件,每24小时创建一个新的日志文件,便于管理和查询历史日志。 总结来说,`Log4j2`和`SLF4J`的组合使用,不仅简化了日志记录的代码,还提供了强大的日志管理...
"Log4cpp(添加按日期生成日志类)" 提示我们这是一个关于Log4cpp的项目,而且已经进行了扩展,增加了按照日期生成日志文件的功能。Log4cpp是C++的一个日志记录库,它借鉴了Java中的log4j框架,提供了灵活的日志管理...
上述配置中,`log4j.appender.FILE.File`指定了日志文件的路径,`${user.home}/logs/myapp.log`表示日志将被写入用户主目录下的logs文件夹中的myapp.log文件。通过改变这个路径,我们就能动态地改变日志输出的位置。...
本文将通过一个具体的实例,详细解释如何在WebLogic环境中集成并使用Log4j生成日志文件。 首先,我们需要理解Log4j的基本组件。Log4j主要由三个部分组成:配置器(Configuration)、日志器(Logger)和布局器...
1. **根据日期生成文件**:每个日期生成一个独立的日志文件。 2. **按日志级别(INFO、ERROR)分别记录**:INFO级别的日志记录在一个文件中,ERROR级别的日志记录在另一个文件中。 #### 三、具体配置分析 ##### 1. ...
这个配置将日志级别设置为DEBUG,日志输出到`app.log`文件,并且每天生成一个新的日志文件。 3. **覆盖Tomcat的默认配置**:在Tomcat的`conf`目录下创建一个名为`logging.properties`的文件,内容如下: ``` ...
默认情况下,Log4j的日志文件名通常是固定的或者基于时间戳生成的。然而,我们可以创建一个自定义的`org.apache.log4j.FileAppender`子类来覆盖默认行为。这个子类可以重写`setFile()`方法,根据业务逻辑来决定...
首先,DailyRollingFileAppender是Log4j中的一个Appender实现,它按照日期滚动日志文件。例如,每天生成一个新的日志文件,这样可以避免单个日志文件过大。这个特性对于长时间运行的应用尤其有用,因为它能够保持...
本示例将深入讲解如何利用Log4j的不同Appender来生成不同的日志文件,以满足不同接口或模块的日志记录需求。 首先,我们需要理解什么是Appender。在Log4j中,Appender是负责将日志信息输出到特定目的地的组件,如...
创建一个名为 `log4j.properties` 或 `log4j.xml` 的配置文件,放在项目的类路径下。以下是一个基本的 `log4j.properties` 示例,用于设置日志级别、输出目的地及格式: ``` log4j.rootLogger=DEBUG, Console, ...
- 通过配置`RollingFileAppender`,可以实现日志文件的大小限制或日期滚动,例如每天生成一个新的日志文件。 - 归档策略可以通过`Policies`子元素来设定,如基于日期的`TimeBasedTriggeringPolicy`或基于文件大小...
在"Log4j多文件输出打印"的场景下,我们通常会配置多个Appender,每个Appender对应一个不同的输出文件。这样,不同的日志信息可以被分别写入不同的文件,便于管理和分析。例如,在`log4j.properties`配置文件中,...