2017-01-29 58 views
1

我正在編寫一個使用log4j 2.5的應用程序,並且一切都很好。爲了提高性能,我希望使記錄器異步,但不想添加破壞者依賴項,所以我決定使用Async Appender。我發現了一些如何使用它們的例子,但我想在這個過程中出了點問題:(使用AsyncAppender時log4j重複郵件

我沒有使用xml配置文件,而是在代碼中創建了所有我的記錄器。首先創建我的appender,然後我創建異步Appenders每個他們的名字我參考他們的名字

我得到重複的消息,因爲對於每個appender我既有appender本身也是一個AsyncAppender發送我的消息該附加器

我的代碼:?

addAppenderToLogger(fileAppender, logger) 
addAppenderToLogger(rollingFileAppender, logger) 

AsyncAppender.createAppender(
    names.map(name => AppenderRef.createAppenderRef(
    name, Level.getLevel("INFO"), null 
)), errorRef, true, 0, 2048, s"async-appender", false, null, config, true 
) 

我爲我的appender創建了1個AsyncAppender。

重複實施例日誌:

2017年1月26日13:21:33619 [執行人任務發射工人-1] INFO 短文本 - 啓動標記ID 973376

2017- 01-26 13:21:33,619 [Executor task launch worker-2]信息 短文本 - 開始標記ID 2497995

2017-01-26 13:21:33,619 [Executor task launch worker-1] INFO 短文本 - 開始標記ID 973376

2017年1月26日13:21:33619 [執行人任務運行工人2] INFO 短文本 - 啓動如果同時添加FileAppender和AsyncAppender對標籤ID 2497995

回答

1

您直接記錄器,那麼這將成爲瓶頸,你失去了異步記錄的好處。

僅添加將AsyncAppender添加到您的記錄器,並讓AsyncAppender通過AppenderRef指向FileAppender。


至於編程配置,一些Log4j2測試正在做類似於你正在做的事情。例如this one

final LoggerContext context = LoggerContext.getContext(false); 
final Configuration config = context.getConfiguration(); 
final PatternLayout layout = PatternLayout.createDefaultLayout(config); 
final Appender appender = WriterAppender.createAppender(layout, null, writer, writerName, false, true); 
appender.start(); 
config.addAppender(appender); 

final Level level = null; 
final Filter filter = null; 
for (final LoggerConfig loggerConfig : config.getLoggers().values()) { 
    loggerConfig.addAppender(appender, level, filter); 
} 
config.getRootLogger().addAppender(appender, level, filter); 

我希望這是有用的。

+0

我之前做過的是創建appender並將它們添加到記錄器中,然後使用'AppenderRefs'創建一個Async Appender,然後刪除原始appender。這似乎工作,但它是一個非常醜陋的解決方案(創建,然後刪除)。我現在嘗試了你所做的,但是我得到了一個N​​ullPointerException。我應該在哪裏創建appender?在主記錄器?和我在我的應用程序的上下文記錄器中創建的AsyncAppender?因爲只是將它們創建爲變量是不夠的(創建NullPointerException) – sid802

+0

根記錄器應引用AsyncAppender,並且AsyncAppender應引用FileAppender。從同一個LoggerContext獲得的其他記錄器(〜1與應用程序)將把事件路由到它們的父記錄器(根記錄器)。 –

+0

但是我怎麼能讓我的AsyncAppender引用FileAppender,如果他沒有註冊任何記錄器/上下文? 例如: VAL fileAppender = createFileAppender(名稱) VAL RollingFileAppender進行= createRollingFileAppender(姓名,folderNameExt) VAL curLogger = ctx.getLogger(名稱) addAppenderToLogger(createAsyncAdapter(陣列(fileAppender.getName,rollingFileAppender.getName) ,fileAppender.getName),curLogger) ctx.getLogger(名稱).setLevel(Level.ALL) 導致空指針異常,因爲在運行時,createAsyncAdapter不知道追加程序的名稱 – sid802

相關問題