比方說,我有四個傳統的罐子:從傳統應用程序OSGi日誌記錄?
- 我-library.jar
- 我-app.jar
- 我-其他-app.jar
- log4j.jar
「我的應用程序」和「我的其他應用程序」是不相關的應用程序,都具有main()函數。他們都使用「my-library-app」中的各種庫函數。所有這三者都通過log4j進行日誌記錄(真的是slf4j,但我只是想保持簡單的例子)。
目前,這兩個應用程序設置了兩個不同的log4j配置文件,這使得它們登錄到兩個不同的文件。
現在我想將所有東西都轉換成OSGi。因此,我將前三個分別捆綁爲一個獨立的捆綁包,將實際應用程序的main()轉換爲Activators,然後捆綁或查找現有的log4j捆綁包。我在同一個OSGi框架中啓動了兩個應用程序。
但現在兩個不同的應用程序不再登錄到不同的文件!對?在JVM中只有一個運行的log4j實例,它從一個log4j.properties文件中獲取其配置。
因此,也許,而不是捆綁每個我的四個單獨罐的,我做三捆:
- 我的圖書館
- 我的應用加上log4j的
- 我的其他應用程序加log4j的
現在我可以爲兩個不同的應用程序獲取不同的日誌配置文件。但是我的圖書館的日誌調用呢? My Library軟件包將鎖定到log4j的兩個副本中的一個上,現在,從我的庫中生成的所有日誌消息都會出現在兩個日誌文件中的一個特定日誌文件中 - 讓我們說一個用於My App的日誌文件。但即使它是來自我的圖書館的日誌消息,也是如此,因爲來自我的其他應用程序的呼叫!他們會去錯誤的日誌文件。
所以也許捆綁:
- 我的圖書館加上log4j的
- 我的應用加上log4j的
- 我的其他應用程序加log4j的
現在從我的音樂庫中的日誌消息要自己自己的日誌文件,我認爲它比其中一些去錯了應用程序的日誌文件更好,但仍然不是很好。該文件包含來自兩個應用程序的日誌消息,並且任何旨在用於任一應用程序的日誌文件都不具有來自這些應用程序的所有日誌消息。
所以也許捆綁:
- 我的應用加上我的圖書館加log4j的
- 我的其他應用程序加上我的圖書館加log4j的
但現在什麼是OSGi的點?我沒有分享我的書庫或log4j的使用。而在現實中,它可能會更糟 - 會有一堆,我要堅持的多個副本到我所有的實際應用捆綁的,只是因爲我想看到的是使他們的應用程序相關的日誌消息罐子。
所以也許備份和嘗試不同的東西:我不認爲這是可能的log4j的,但在(比如說)SLF4J我能回到原來的捆綁計劃:
- 我的圖書館
- 我的應用
- 我的其他應用程序
- log4j的
然後我做這樣的事情在每個線程把MDC信息說什麼AP線程來自。響應該MDC信息以確定它所進入的日誌文件。
但好像是不會工作!從我的應用程序中的某個線程調用我的庫中的某個函數可能會導致從我的庫中生成一個新線程,該線程不一定與該MDC相關聯。
而且它比這更糟糕:我的圖書館可能有一些線程是由使用我的庫中的任何應用程序共享,因此不可能用一些這樣的標記關聯。
所以,一切的一切,我很爲難。任何建議將不勝感激。提前致謝。
本文相關:https://www.tibcommunity.com/blogs/OSGi/2012/06/08/do-we-really-need-subsystems – 2012-08-08 08:55:25