15

我正在开发一个将在 OSX 和 Windows 上运行的应用程序。我希望将日志写入用户主目录。对于 OSX,它将位于 /Users//Library/Application Support/MyApp/log 目录下,在 windows 下取决于 /Users//AppData/MyApp/log 目录下的版本。

我能做到这一点的最佳方法是什么?我已经四处寻找解决方案,但没有任何有用的解决方案或我喜欢使用的解决方案出现。

期待您的投入。

编辑:由于日志文件的位置取决于操作系统,我希望找到一个运行时解决方案,可能如下所示

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

谢谢

4

4 回答 4

27

将 更改ConsoleAppenderFileAppender. 据我所知,写请求将被重定向到 Windows 操作系统上的 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 1.*
log4j.appender.NotConsole.fileName=${user.home}/fileName.log
// log4j 2.*
log4j.appender.NotConsole.fileName=${sys:user.home}/fileName.log

请注意,log4j 2 需要sys:前缀 - 感谢@sgrubsmyon

于 2012-07-26T12:01:22.680 回答
2

谢谢大家的投入。根据亚历克斯提出的提示,我采用了以下方法,

在 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";
}
于 2012-07-29T13:54:47.233 回答
0

可能最干净的方法是编写 log4j 配置假设特定的系统属性(例如myapp.data.dir

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

并在每个平台的启动器中以适当的方式设置该属性。例如,如果您.app在 Mac OS X 上使用捆绑软件,那么您可以在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 上的 APPDATA 环境变量(它将处理 XP 和 7 之间的差异)。使用Launch4J .exe,您可以将-Dmyapp.data.dir="%APPDATA%\MyApp"文件.l4j.ini放入.

在尝试访问任何记录器之前,您需要显式代码来初始化 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"));
于 2012-07-27T08:59:23.340 回答
0

我已经解决了 mac 中 log4j.xml 的路径问题:

在 Windows 中,我们在 web.xml 中配置 log4j,例如:

    <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} 是我们用来在窗口中设置的用户变量。喜欢

用户变量 = LOG4J_HOME 值 = D:/LOG4J(在 d 驱动器中,我们创建了一个名为 Log4J 的文件夹,我们复制了该路径并作为值给出)

在 mac 中,我们通过 bash 命令设置了环境变量集 fasility,但它不再起作用了。

因此对于 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> 
于 2013-07-12T10:59:00.770 回答