我正在开发一个将在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"
由于
答案 0 :(得分:19)
将ConsoleAppender
更改为FileAppender
。据我所知,写请求将被重定向到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.appender.NotConsole.fileName=${user.home}/fileName.log
答案 1 :(得分: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";
}
答案 2 :(得分: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上的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"));
答案 3 :(得分: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 value = D:/ LOG4J(在d驱动器中我们创建了一个名为Log4J的文件夹,我们复制了该路径并作为值提供)
在mac中,我们通过bash命令使用envirenvirent变量set 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>