我正在編寫一個使用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
我之前做過的是創建appender並將它們添加到記錄器中,然後使用'AppenderRefs'創建一個Async Appender,然後刪除原始appender。這似乎工作,但它是一個非常醜陋的解決方案(創建,然後刪除)。我現在嘗試了你所做的,但是我得到了一個NullPointerException。我應該在哪裏創建appender?在主記錄器?和我在我的應用程序的上下文記錄器中創建的AsyncAppender?因爲只是將它們創建爲變量是不夠的(創建NullPointerException) – sid802
根記錄器應引用AsyncAppender,並且AsyncAppender應引用FileAppender。從同一個LoggerContext獲得的其他記錄器(〜1與應用程序)將把事件路由到它們的父記錄器(根記錄器)。 –
但是我怎麼能讓我的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