2012-07-26 105 views
10

我正在研究可以在OSX和Windows上運行的應用程序。我希望將日誌寫入用戶主目錄。對於OSX,它將位於/ Users/Library/Application Support/MyApp/log目錄下,並位於Windows下,具體取決於/ Users // AppData/MyApp/log目錄下的版本。在用戶主目錄中的log4j日誌文件

我可以做到這一點的最佳方式是什麼?我已經四處尋找解決方案,但沒有任何幫助,或者我很舒服使用的解決方案已經出現。

期待您的意見。

編輯: 由於日誌文件的位置取決於操作系統,我希望能找到一個運行時的解決方案,可能類似下面

if (System.getProperty("os.name").contains("mac")) 
    logFileLocation = System.getProperty("user.home") + "/Library/Application Support/MyApp/logs" 
else 
    logFileLocation = System.getenv("APPDATA") + "/MyApp/logs" 

感謝

回答

16

更改ConsoleAppenderFileAppender。據我所知,寫入請求將被重定向到Windows OS上的appdata。不確定關於MacOs。

URL mySource = MyAppMainClass.class.getProtectionDomain().getCodeSource().getLocation(); 
File rootFolder = new File(mySource.getPath()); 
System.setProperty("app.root", rootFolder.getAbsolutePath()); 

和編輯log4j的配置這樣

log4j.appender.NotConsole=org.apache.log4j.RollingFileAppender 
log4j.appender.NotConsole.fileName=${app.root}/fileName.log 

或用戶家:

log4j.appender.NotConsole.fileName=${user.home}/fileName.log 
+0

請注意,您需要確保您對文件夾擁有適當的權限。 – Tomer 2012-07-26 12:17:32

+0

$ {user.home}文件夾通常用於寫入操作。該文件夾的目的是存儲會話創建的用戶特定文件。 – 2012-07-26 12:29:06

+0

感謝您的迴應,但是在此解決方案中,無論操作系統如何,日誌文件的位置都是相同的。請參閱上面的編輯,以獲得有關該問題的進一步說明。 – Poorav 2012-07-26 13:53:20

0

可能最乾淨的方法是寫你的log4j的配置假設一個特定的系統屬性(比如myapp.data.dir

log4j.appender.logfile.fileName=${myapp.data.dir}/logs/myapp.log 

並在適用於每個平臺的啓動器中設置該屬性。例如,如果你使用的是Mac OS X的.app束那麼您可以在Info.plist

<plist version="1.0"> 
<dict> 
    <!-- ... --> 
    <key>Java</key> 
    <dict> 
     <!-- ... --> 
     <key>Properties</key> 
     <dict> 
      <key>apple.laf.useScreenMenuBar</key> 
      <string>true</string> 
      <key>myapp.data.dir</key> 
      <string>$USER_HOME/Library/Application Support/MyApp</string> 

設置系統屬性或將其相對於在Windows應用程序數據的環境變量(這將處理XP和7之間的差別)。使用Launch4J.exe您可以將-Dmyapp.data.dir="%APPDATA%\MyApp"放入.l4j.ini file

你會需要明確的代碼來初始化log4j的你嘗試訪問任何伐木者

if(System.getProperty("myapp.data.dir") == null) { 
    // fallback to ~/.myapp (sensible Linux default) if run without a launcher 
    System.setProperty("myapp.data.dir", new File(
     System.getProperty("user.home"), ".myapp").getAbsolutePath()); 
} 
// ensure log directory exists 
new File(new File(System.getProperty("myapp.data.dir")), "logs").mkdirs(); 
// now it's safe to configure log4j 
PropertyConfigurator.configure(this.getClass().getResource("/log4j.properties")); 
1

謝謝大家的投入了。基於亞歷克斯建議我去下面的方法,

在log4j.properties提示我有以下配置

log4j.appender.FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.FILE.File=${userApp.root}/logs/myapp.log 

,並在我做這個應用程序的開始。

System.setProperty("userApp.root", getUserAppDirectory()); 

的getUserAppDirectory()方法被定義爲

static String getUserAppDirectory() { 
    if (isMacOS()) 
     return System.getProperty("user.home") + "/Library/Application Support/myapp"; 
    else 
     return System.getenv("APPDATA") + "/myapp"; 
} 
0

我已經解決的log4j的路徑的問題。XML在Mac:

在windows我們配置log4j在web.xml中,如:

<listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>file:${LOG4J_HOME}/conf/log4j.xml</param-value> 

<!-- Above path is that where we have stored log4j.xml file externally --> 
    </context-param> 

    <context-param> 
     <param-name>log4jRefreshInterval</param-name> 
     <param-value>6000</param-value> 
    </context-param> 

,其中$ {} LOG4J_HOME是我們用窗口來設置用戶varible。像

用戶變量= LOG4J_HOME 值= d:/ LOG4J(在d驅動我們已經創造名稱Log4J的一個文件夾,我們複製的路徑,給作爲值)

在MAC我們已經envirenvirent變量集合fasility通過bash命令,但它沒有工作了。

因此,對於mac我們必須創建一個文件夾任何地方,我們必須給該文件夾的靜態路徑。

像XML:

<listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>file:/Users/vardhaman/Desktop/LOG4J/conf/log4j.xml</param-value> 
<!-- Above path is that where we have stored log4j.xml file externally to get this path go up to the log4j.xml file in external device and right click select get info, where we will get path, copy that path --> 

    </context-param> 

    <context-param> 
     <param-name>log4jRefreshInterval</param-name> 
     <param-value>6000</param-value> 
    </context-param> 

同樣,我們在文件的log4j.xml

做在窗口我們用做這樣:

<appender name="CLICK-SPRING" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${LOG4J_HOME}/logs/CLICK/CLICK-spring.log"/> 
     <param name="Append" value="true"/> 
     <param name="Threshold" value="DEBUG"/> 
     <param name="MaxFileSize" value="100MB"/> 
     <param name="MaxBackupIndex" value="10" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p [%t] %C{1}.%M(%L) | %m%n"/> 
     </layout> 
    </appender> 

在Mac:

代替值我們必須將靜態路徑複製到文件夾LOG4J,或者您可以創建任何文件夾。

<appender name="CLICK-SPRING" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="Users/vardhaman/Desktop/LOG4J/logs/CLICK/CLICK-spring.log"/> 
     <param name="Append" value="true"/> 
     <param name="Threshold" value="DEBUG"/> 
     <param name="MaxFileSize" value="100MB"/> 
     <param name="MaxBackupIndex" value="10" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p [%t] %C{1}.%M(%L) | %m%n"/> 
     </layout> 
    </appender>