開源分析 Log4J

2022-01-30 02:55:54 字數 2709 閱讀 4654

logmanager -> getloggerrepository

repositoryselector.getloggerrepository

hierarchyh = new hierarchy(new rootlogger((level) level.debug)); = repositoryselector 

defaultrepositoryselector(noploggerrepository)

noploggerrepository->noplogger

寫入分析

-------------------------

logger.warn -> 

category.warn

category.forcelog

----------------------------

quietwriter.write

this(layout, new outputstreamwriter(os));

---------------------------

這裡就到了propertyconfigurator

-------------------------

初始化

**public

synchronized

void

setfile(string filename, 

boolean

boolean

bufferedio, 

intbuffersize)

throws

ioexception 

reset();

fileoutputstream ostream 

=null

;try

catch

(filenotfoundexception ex)  

else

} else

}writer fw 

=createwriter(ostream);

if(bufferedio) 

this

.setqwforfiles(fw);

this

.filename 

=filename;

this

=this

.bufferedio 

=bufferedio;

this

.buffersize 

=buffersize;

writeheader();

loglog.debug(

"setfile ended");

}**protected

outputstreamwriter createwriter(outputstream os)  

catch

(ioexception e) 

loglog.warn(

"error initializing output writer.");

loglog.warn(

"unsupported encoding?");

}}if(retval 

==null

) return

retval;

}什麼時候flush???

。每次操作完,都會flush

if(shouldflush(event)) {

this.qw.flush();

檔案操作是每次new,還是new了之後一直使用?

。 獲取logger的方法是:logger.getlogger => logmanager->defaultrepositoryselector(hierarchy) -> hierarchy.getlogger ->

.logger = factory.makenewloggerinstance(name);  defaultcategoryfactory..makenewloggerinstance(name) =

。new logger() extends category

.  這裡使 category的loggerrepository = hierarchy

。如果沒有在配置檔案註明的,就是初始化為console的日誌。 

。    void configure() {

logger root = logger.getrootlogger();

new patternlayout(patternlayout.ttcc_conversion_pattern)));

如果沒有配置,則整個日誌系統根本無法執行,所以只有配置了才有效。

寫入日誌的時候,使用了迭代,最終回到了rootlogger。 而getlogger的時候,輸入僅僅是乙個string標籤,作為log的寫入,log最終還是由config初始化

logmanager.static 

propertysetter.activated 

**中可以看出,是初始化的時候stream就初始了。 

小結:logger在初始化的時候,就對stream等全部初始了。 涉及到的關鍵類包括:

outputstreamwriter(outputstream):: writer

filterwriter(writer) 

寫入的時候: filterwriter.out.write(); 

log4j簡單分析

最近在學習開源 學習了log4j,就其中一些知識點分享。針對的是apache log4j 1.2.17 commons logging 1.2。1.log4j中日誌重複列印問題 設定為如下即不會重複列印,最後必須是類名。log4j.additivity.test.testclass false 2....

log4j日誌系統 Log4j

1.1 log4j的三大核心元件 1.2 loggers 記錄器 1.4 layouts 布局 org.apache.log4j.htmllayout 以html 形式布局 org.apache.log4j.patternlayout 可以靈活地指定布局模式 org.apache.log4j.lay...

Log4J學習 十六 Log4j的預設啟動流程一

既然要求我們自己來配置log4j,那麼又會出現相關的問題,不管我們採用哪種配置方式,log4j總會要求我們在應用啟動的最開始,完成log4j的配置,所以我們不得不在乙個靜態類的靜態 塊中完成相關的 配置。這對程式設計師和log4j框架本身的使用,都是乙個不友好的設計。考慮到這些因素,log4j提供了...