15

私はOSXとWindowsで実行されるアプリケーションに取り組んでいます。ログをユーザーのホームディレクトリに書き込みたい。OSXの場合は、/ Users // Library / Application Support / MyApp / logディレクトリの下にあり、/ Users // AppData / MyApp/logディレクトリの下のバージョンに応じてWindowsの下にあります。

これを行うための最良の方法は何ですか?私はこれに対する解決策を探しましたが、役立つものや私が快適に使用できる解決策は何も出てきませんでした。

ご入力をお待ちしております。

編集:ログファイルの場所は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"

ありがとう

4

4 に答える 4

27

をに変更ConsoleAppenderFileAppenderます。私の知る限り、書き込み要求はWindowsOSの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

log4j2にはプレフィックスが必要であることに注意してくださいsys:-@sgrubsmyonのおかげで

于 2012-07-26T12:01:22.680 に答える
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";
}
于 2012-07-29T13:54:47.233 に答える
0

おそらく最もクリーンなアプローチは、特定のシステムプロパティを想定して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"));
于 2012-07-27T08:59:23.340 に答える
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値=D:/ LOG4J(dドライブにLog4Jという名前のフォルダーを作成し、そのパスをコピーして値として指定しました)

Macでは、bashコマンドによる環境変数セットの使いやすさがありますが、機能しなくなりました。

したがって、Macの場合、任意の場所に1つのフォルダーを作成し、そのフォルダーの静的パスを指定する必要があります。

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> 
于 2013-07-12T10:59:00.770 に答える