2013-05-31 34 views
2

我是logback的新手。我對它很着迷,但我不確定它是否適合我的用例。我可以在運行時使用logback關閉並重新打開日誌文件嗎?

我想有一個記錄器,我可以停下來並開始。當它停止時,我想從文件系統中刪除日誌文件。重新啓動日誌時,應該重新創建該文件。

Logback是否可以做到這一點?在日誌記錄暫停的時候,我是否應該避免在我的類中調用Logger,或者可以使用logback來處理?

我目前使用slf4j.Logger。在manual我看到Appender objects implement the LifeCycle interface, which implies that they implement start(), stop() and isStarted()

我認爲這意味着他們可以停止,所以我可以移動的文件,但後來有云:

如果附加器無法啓動,或者如果它已經停止,一個 警告信息通過logback的內部狀態 管理系統發佈。經過多次嘗試後,爲了避免內部狀態系統被複制相同的警告消息 ,doAppend()方法將停止發出這些警告。

這是否意味着我可以阻止它,然後刪除文件,然後重新啓動?

+0

如果你downvote,請說明理由:) – n611x007

+1

在Log4j,你可以使用DOMConfigurator切換配置運行時(你可以用它來停止記錄或切換記錄器使用其他目錄/文件),所以你可以在Logback中使用類似的類。 Logback是Log4j的分支,所以它應該**具有類似的東西。 –

回答

0

我想有一個記錄器,我可以停下來並開始。當它停止時,我想從文件系統中刪除日誌文件。重新啓動日誌時,應該重新創建該文件。

我不知道如何以編程方式做到這一點,但你可以,如果你已經添加jmxConfiguratorlogback.xml配置文件通過JMX做到這一點。

<configuration> 
    <jmxConfigurator /> 
    ... 

這暴露了ch.qos.logback.classic.jmx.JMXConfigurator豆具有題爲reloadDefaultConfiguration的操作。當我在運行時按下它時,日誌文件將重新打開。見下面的Jconsole圖片。這意味着一個jmx客戶端(例如SimpleJMX中的那個客戶端)將能夠通過命令行完成該操作。

如果您嘗試從同一個應用程序內部以編程方式進行編程,那麼您應該可以獲取mbean的位置並自己觸發該調用。喜歡的東西似乎爲我工作:

ManagementFactory.getPlatformMBeanServer().invoke(new ObjectName(
    "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator"), 
    "reloadDefaultConfiguration", null, null); 

我會做的是日誌文件(一個或多個)重命名爲不同的名字(或多個),然後發出重裝配置命令。然後,可以在創建新文件後將重命名的文件歸檔或刪除。

希望這會有所幫助。

enter image description here

相關問題