【问题标题】:log4j log file in user home directory用户主目录中的 log4j 日志文件
【发布时间】:2012-07-26 11:56:50
【问题描述】:

我正在开发一个可以在 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"

谢谢

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    ConsoleAppender 更改为FileAppender。据我所知,写请求将被重定向到 Windows 操作系统上的 appdata。不确定 MacO。

    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

    【讨论】:

    • 请注意,您需要确保您对文件夹具有适当的授权。
    • ${user.home} 文件夹通常是为写操作打开的。该文件夹的目的是存储会话创建的用户特定文件。
    • 感谢您的回复,但是在此解决方案中,无论操作系统如何,日志文件的位置都是相同的。请参阅我上面的编辑以进一步澄清问题。
    • 它不会。 {user.home} 是一个系统变量,因此路径会有所不同。抱歉,我不明白你想要什么。
    • 使用log4j2,需要使用${sys:user.home},见logging.apache.org/log4j/2.x/manual/…
    【解决方案2】:

    感谢大家的投入。根据 Alex 提出的提示,我采用了以下方法,

    在 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";
    }
    

    【讨论】:

      【解决方案3】:

      可能最简洁的方法是编写 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 上的 APPDATA 环境变量(它将处理 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"));
      

      【讨论】:

        【解决方案4】:

        我已经解决了 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 value = D:/LOG4J(在 d 驱动器中,我们创建了一个名为 Log4J 的文件夹,我们复制了该路径并作为值提供)

        在 mac 中,我们可以通过 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 来代替 value,或者您可以创建任何文件夹。

        <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> 
        

        【讨论】:

          猜你喜欢
          • 2012-06-10
          • 2016-11-06
          • 2014-11-17
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          相关资源
          最近更新 更多