我有幾個可執行類,我想自動日誌文件名設置爲正在執行的Java類的名稱。的logback:使用Java主類名作爲日誌文件名
我知道我可以用編程的方式做到這一點,可能使用Reflection和MDC
,但是通過配置logback.xml
沒有更簡單的方法來實現這一點嗎?
這似乎是一個相當基本的需要我,所以我很驚訝,我找不到任何關於它的文檔。
我有幾個可執行類,我想自動日誌文件名設置爲正在執行的Java類的名稱。的logback:使用Java主類名作爲日誌文件名
我知道我可以用編程的方式做到這一點,可能使用Reflection和MDC
,但是通過配置logback.xml
沒有更簡單的方法來實現這一點嗎?
這似乎是一個相當基本的需要我,所以我很驚訝,我找不到任何關於它的文檔。
:
所以,你可以從顯示在1類和類2到一個記錄儀與包名this.getClass()
收集所有的日誌com.company
(1類和類2分享這個命名空間)支持它,否則,你需要在你的所有main
中的方法的logback可以用它來設置一個類似的系統屬性,你可以使用這個屬性
<file>${sun.java.command}.log</file>
。
正如你提到的,你可以很容易地通過執行實現這一目標:
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>
'LoggerFactory.getLogger '只是返回一個名爲傳遞字符串的記錄器,但它不會影響'FileAppender'的日誌文件名。即使我設法將日誌文件名設置爲等同於記錄器名稱,那也不是我想要的:每個類都會記錄到一個單獨的文件,而我希望所有類都會記錄到一個名爲正在執行的主類的文件。 – Alphaaa
您更正了,它不會影響FileAppender的日誌文件名。就在你的'logback.xml'使用的命名空間,其中將包括在您創建'LoggerFactory.getLogger'所有記錄器(例如com.company.yourclass): '<記錄器名稱=「com.company」級=」 INFO」相加= 「假」> <附加器-REF REF = 「附加器」/> '我是否正確地理解? – Stas
讓我試着用一個例子來解釋我需要的東西。如果我執行'Class1.java',在執行過程中調用_all_ classed應該記錄到* class1.log *。如果明天我創建並運行一個名爲'Class2.java'的新可執行類,則該執行中的所有內容都應該放入* class2.log *中,而不必更改任何設置。現在有道理嗎? – Alphaaa
如果你不介意在你的命令行指定兩次的應用程序名稱,您可以指定一個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>
謝謝。在Windows上通過Eclipse啓動時,此屬性似乎不受支持,但在通過Maven在Ubuntu上啓動時可以使用此屬性。我得到一個字符串,例如'org.codehaus.plexus.classworlds.launcher.Launcher exec:java -Dexec.mainClass = mypackage.MyMainClass',並且有一些清理我應該能夠隔離類名。 – Alphaaa