LogManager -> getLoggerRepository
RepositorySelector.getLoggerRepository
Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); = RepositorySelector
DefaultRepositorySelector(NOPLoggerRepository)
NOPLoggerRepository->NOPLogger
写入分析
-------------------------
Logger.warn ->
Category.warn
Category.forcelog
category.callAppenders
AppenderAttachableImpl.appendLoopOnAppenders
Appender.doAppend
这里实际上交给了各种的appender实现日志记录,这些appender在配置的时候注入
----------------------------
WriterAppender
AppenderSkeleton.doAPpend
WriterAppender.append -subAppend -this.qw.write
QuietWriter.write
这个狗屁writer又是靠外界插入write,在WRiterAppender.setWriter
WriterAppender(Layout layout, OutputStream os) {
this(layout, new OutputStreamWriter(os));
---------------------------
添加appender
AppenderAttachableImpl.addAppender
Category.addAPpender
这里就到了PropertyConfigurator
-------------------------
找了半天,终于找到了入口,在FileAppender,这里调用了
WriterAppender.createWriter()
初始化
-------------------------
public
synchronized
void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
throws IOException {
LogLog.debug("setFile called: "+fileName+", "+append);
// It does not make sense to have immediate flush and bufferedIO.
if(bufferedIO) {
setImmediateFlush(false);
}
reset();
FileOutputStream ostream = null;
try {
//
// attempt to create file
//
ostream = new FileOutputStream(fileName, append);
} catch(FileNotFoundException ex) {
//
// if parent directory does not exist then
// attempt to create it and try to create file
// see bug 9150
//
String parentName = new File(fileName).getParent();
if (parentName != null) {
File parentDir = new File(parentName);
if(!parentDir.exists() && parentDir.mkdirs()) {
ostream = new FileOutputStream(fileName, append);
} else {
throw ex;
}
} else {
throw ex;
}
}
Writer fw = createWriter(ostream);
if(bufferedIO) {
fw = new BufferedWriter(fw, bufferSize);
}
this.setQWForFiles(fw);
this.fileName = fileName;
this.fileAppend = append;
this.bufferedIO = bufferedIO;
this.bufferSize = bufferSize;
writeHeader();
LogLog.debug("setFile ended");
}
synchronized
void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
throws IOException {
LogLog.debug("setFile called: "+fileName+", "+append);
// It does not make sense to have immediate flush and bufferedIO.
if(bufferedIO) {
setImmediateFlush(false);
}
reset();
FileOutputStream ostream = null;
try {
//
// attempt to create file
//
ostream = new FileOutputStream(fileName, append);
} catch(FileNotFoundException ex) {
//
// if parent directory does not exist then
// attempt to create it and try to create file
// see bug 9150
//
String parentName = new File(fileName).getParent();
if (parentName != null) {
File parentDir = new File(parentName);
if(!parentDir.exists() && parentDir.mkdirs()) {
ostream = new FileOutputStream(fileName, append);
} else {
throw ex;
}
} else {
throw ex;
}
}
Writer fw = createWriter(ostream);
if(bufferedIO) {
fw = new BufferedWriter(fw, bufferSize);
}
this.setQWForFiles(fw);
this.fileName = fileName;
this.fileAppend = append;
this.bufferedIO = bufferedIO;
this.bufferSize = bufferSize;
writeHeader();
LogLog.debug("setFile ended");
}