2012-07-26 16 views
10

OSXとWindowsで動作するアプリケーションを開発中です。ログをユーザのホームディレクトリに書きたい。 OSXの場合、/ Users/Library/Application Support/MyApp/logディレクトリの下にあり、/ Users/AppData/MyApp/logディレクトリの下のバージョンに応じてWindowsの下にあります。ユーザホームディレクトリのlog4jログファイル

これを行うにはどうすればよいですか?私はこれのための解決策を見回しましたが、役に立たない、または私が使用するのが快適な解決策は何も出てこなかった。

あなたの入力を楽しみにしています。

編集: ログファイルの場所はOSに依存するため、私は、実行時の解決策を見つけることを期待しています、おそらく

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

おかげ

答えて

16

変更ConsoleAppender以下のようなものFileAppender。私の知る限り、書き込み要求はWindows OS上のappdataにリダイレクトされます。 MacOについては不明。この

log4j.appender.NotConsole=org.apache.log4j.RollingFileAppender 
log4j.appender.NotConsole.fileName=${app.root}/fileName.log 

様またはユーザーのホーム用

URL mySource = MyAppMainClass.class.getProtectionDomain().getCodeSource().getLocation(); 
File rootFolder = new File(mySource.getPath()); 
System.setProperty("app.root", rootFolder.getAbsolutePath()); 

および編集log4jの設定:おそらく

log4j.appender.NotConsole.fileName=${user.home}/fileName.log 
+0

フォルダに適切な権限があることを確認する必要があります。 – Tomer

+0

$ {user.home}フォルダは通常、書き込み操作のために開いています。セッションで作成されたユーザー固有のファイルを格納するのは、そのフォルダーの目的です。 –

+0

応答がありがとうございますが、このソリューションでは、ログファイルの場所はOSに関係なく同じになります。問題の詳細については上記の私の編集をご覧ください。 – Poorav

0

クリーンなアプローチと言う(特定のシステムプロパティを想定し、あなたのlog4jの設定を記述することですmyapp.data.dir

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

に設定し、各プラットフォームのランチャーで適切な方法でそのプロパティを設定します。あなたは、Mac OS X上で.appバンドルを使用している場合たとえば、あなたは(これはXPと7の違いを扱うでしょう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環境変数に対する、それを設定するには、システムのプロパティを設定することができます)。 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")); 
1

を入力ありがとうございました。アレックスは私がlog4j.propertiesでは、次のようなアプローチで

を行った提案というヒントをもとに、私は次のような構成

log4j.appender.FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.FILE.File=${userApp.root}/logs/myapp.log 

と、私はこれを実行しているアプリケーションの開始時に

を持っていました。

System.setProperty("userApp.root", getUserAppDirectory()); 

getUserAppDirectory()メソッドは、Iがのlog4jのパスの問題を解決した

static String getUserAppDirectory() { 
    if (isMacOS()) 
     return System.getProperty("user.home") + "/Library/Application Support/myapp"; 
    else 
     return System.getenv("APPDATA") + "/myapp"; 
} 
0

として定義されます。マックでのxml:窓で

我々は次のようにweb.xml内のlog4jを設定:$ {LOG4J_HOMEは}私たちは、ウィンドウ内に設定するために使用するユーザーvaribleある場合は

<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 値= D:/ LOG4J(Dドライブに、我々は名前のLog4Jのフォルダを作成して、我々はそのパスをコピーし、値として与えた)

MACにおいて、我々はenvirenvirent可変設定fasilityを有しますbashコマンドでは、それはもう動作しませんでした。

だから、私たちはどこにでも1つのフォルダを作成し、そのフォルダの静的パスを与える必要があります。 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> 

<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ファイル

にしなければならない

の代わりに、静的パスを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> 
関連する問題