本次为了解决的问题
log4j是如何将日志写入到文件的?
源码分析
log4j记录log到文件的配置如下:
<appender name="DailyRollingFile" class="com.log.jlogstash.logger.DailySizeRollingFileAppender">
<param name="File" value="${LogDir}/${svr}/${Seq}"/>
<param name="DirectoryPattern" value="yyyyMMdd"/>
<param name="DatePattern" value="'_'yyyyMMddHH'_%02d.log'"/>
<param name="Append" value="true" />
<param name="MaxFileSize" value="20MB" />
<param name="MaxBackupIndex" value="50" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yy/MM/dd HH:mm:ss.SS}][%13t][%4p]:%m%n" />
</layout>
</appender>
这里我使用的可以记录多个文件的RollingFileAppender,当然也可以使用FileAppender
因为我这边要控制每个log文件的大小,所以使用RollingFileAppender
DailySizeRollingFileAppedner 是自定义的RollingFileAppender
当我们使用log.info记录消息的时候,这个方法执行如下:
public void info(Object message) {
if (!this.repository.isDisabled(20000)) {
if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) {
this.forcedLog(FQCN, Level.INFO, message, (Throwable)null);
}
}
}
由于Logger是对Category的扩展,所以可以看到实际执行的是Category中的info方法
然后info方法中执行了如下:
protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
this.callAppenders(new LoggingEvent(fqcn, this, level, message, t));
}
public void callAppenders(LoggingEvent event) {
int writes = 0;
for(Category c = this; c != null; c = c.parent) {
synchronized(c){}
try {
if (c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if (!c.additive) {
break;
}
} catch (Throwable var7) {
throw var7;
}
}
if (writes == 0) {
this.repository.emitNoAppenderWarning(this);
}
}
可以看出来当我们执行log.info的时候,实际是上调用了Category的callAppenders方法来进行记录log的动作,那它是如何实现写入动作的勒?
从