在用户主目录log4j的日志文件(log4j log file in user home direc

2019-07-30 15:47发布

我的工作,将在OSX和Windows上运行的应用程序。 我想日志被写入到用户的主目录。 对于OSX这将是/用户//库/ Application Support / MyApp的/ log目录下,并根据/用户//应用程序数据/ MyApp的/ log目录下的Windows版本下。

什么是我能做到这一点的最好方法是什么? 我环顾四周为这个解决方案,但没有有用或解决方案,我比较喜欢使用已经到来了。

期待您的输入。

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

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

谢谢

Answer 1:

变化ConsoleAppenderFileAppender 。 据我知道的写请求将被重定向到应用程序数据的Windows操作系统。 不知道Mac系统。

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


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


Answer 3:

可能是最干净的方法是写你的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"));


Answer 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是用户varible我们用窗口来设置。 喜欢

用户变量= LOG4J_HOME值= d:/ LOG4J(在d驱动我们已经创造名称Log4J的一个文件夹,我们复制的路径,给作为值)

在Mac,我们通过bash命令envirenvirent变量集fasility,但它didint工作了。

所以适用于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> 


文章来源: log4j log file in user home directory
标签: java log4j