2016-07-14 86 views
4

我有幾個可執行類,我想自動日誌文件名設置爲正在執行的Java類的名稱。的logback:使用Java主類名作爲日誌文件名

我知道我可以用編程的方式做到這一點,可能使用Reflection和MDC,但是通過配置logback.xml沒有更簡單的方法來實現這一點嗎?

這似乎是一個相當基本的需要我,所以我很驚訝,我找不到任何關於它的文檔。

回答

2

所以,你可以從顯示在1類和類2到一個記錄儀與包名this.getClass()收集所有的日誌com.company(1類和類2分享這個命名空間)支持它,否則,你需要在你的所有main中的方法的logback可以用它來設置一個類似的系統屬性,你可以使用這個屬性

<file>${sun.java.command}.log</file> 

+0

謝謝。在Windows上通過Eclipse啓動時,此屬性似乎不受支持,但在通過Maven在Ubuntu上啓動時可以使用此屬性。我得到一個字符串,例如'org.codehaus.plexus.classworlds.launcher.Launcher exec:java -Dexec.mainClass = mypackage.MyMainClass',並且有一些清理我應該能夠隔離類名。 – Alphaaa

-1

正如你提到的,你可以很容易地通過執行實現這一目標:
Logger loggerA = LoggerFactory.getLogger(this.getClass().getSimpleName());

我認爲這是相當舒適的設置,所以的logback不與允許顯式xml配置打擾。如果你在一個JVM

<appender name="MY_STUFF" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <encoder> 
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern> 
     </encoder> 

     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>${LOG_DIR}/my_log.server_%d{yyyy-MM-dd}.log</fileNamePattern> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
    </appender> 

    <logger name="com.company" level="INFO" additivity="false"> 
     <appender-ref ref="MY_STUFF" /> 
    </logger> 
+0

'LoggerFactory.getLogger '只是返回一個名爲傳遞字符串的記錄器,但它不會影響'FileAppender'的日誌文件名。即使我設法將日誌文件名設置爲等同於記錄器名稱,那也不是我想要的:每個類都會記錄到一個單獨的文件,而我希望所有類都會記錄到一個名爲正在執行的主類的文件。 – Alphaaa

+0

您更正了,它不會影響FileAppender的日誌文件名。就在你的'logback.xml'使用的命名空間,其中將包括在您創建'LoggerFactory.getLogger'所有記錄器(例如com.company.yourclass): '<記錄器名稱=「com.company」級=」 INFO」相加= 「假」> <附加器-REF REF = 「附加器」/> '我是否正確地理解? – Stas

+0

讓我試着用一個例子來解釋我需要的東西。如果我執行'Class1.java',在執行過程中調用_all_ classed應該記錄到* class1.log *。如果明天我創建並運行一個名爲'Class2.java'的新可執行類,則該執行中的所有內容都應該放入* class2.log *中,而不必更改任何設置。現在有道理嗎? – Alphaaa

0

如果你不介意在你的命令行指定兩次的應用程序名稱,您可以指定一個java系統變量是您所選擇的應用程序名稱,並說明你的logback配置文件系統變量。

例如,你的命令

java -DAPPNAME="Class1" Class1 

...傳遞價值 「的Class1」 作爲的logback拿起一個Java系統變量,您可以重複這樣的...

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>${APPNAME}.log</file> 
    <encoder> 
     <pattern>%msg%n</pattern> 
    </encoder> 
</appender> 
相關問題