2012-07-26 108 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>