log4j 用户主目录中的日志文件

2022-09-03 05:06:49

我正在开发一个将在OSX和Windows上运行的应用程序。我希望将日志写入用户主目录。对于OSX,它将位于/Users//Library/Application Support/MyApp/log目录下,并根据/Users/AppData/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"

谢谢


答案 1

将 更改为 .据我所知,写入请求将被重定向到Windows OS上的appdata。不确定MacOs。ConsoleAppenderFileAppender

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 需要前缀 - 这要归功于@sgrubsmyonsys:


答案 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";
}

推荐