web-dev-qa-db-ja.com

log4j.xmlのログファイルにホスト名を追加する方法

ホスト名と日付をログファイル名に追加したいので、ログファイル名はapp_hostname.date.logのようにする必要があります。 注:これはlinuxとWindowsの両方で実行できます

<appender name="applog" class="org.Apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${path}/app.log" />
        <param name="MaxFileSize" value="1MB" />
        <param name="DatePattern" value=".dd-MM-yyyy" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
        </layout>
</appender>

そして、StringMatchFilterではなく、ログパターンに基づいてフィルターを追加する方法。パターンを一致させたい。前もって感謝します

10

最初にこれをあなたのJavaコードから実行してからlog4jを設定 =アプリケーションに、

注:コードの実行中に必要な例外を処理またはキャッチします。

_// step-1 : set hostName into System's property, which will use by log4j
System.setProperty("hostName", InetAddress.getLocalHost().getHostName()); 
//step - 2 : set currentDate into System's property, which will use by log4j
System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
//step - 3 : now configure/load log4j into Application , if it's not still loaded earlier then.
org.Apache.log4j.Logger LOG = Logger.getLogger(YourJavaClassName.class); // ALERT : before this step above 2-step must needs to be execute, otherwise file-name won't appear as you required.

//LOG.debug("anything whatever programmer what to log");
_

更新:

アプリケーションがWebアプリケーションの場合は、ここで必要なプロパティを構成する必要があります_Tomcat-server_開始後、applicationを実行する前に、

そのためには、ApplicationConfigurationインターフェースが実装された1つのクラスServletContextListenerを作成します。これにより、アプリケーションを実行する前に最初に実行するのに役立ちます。

同様にしてください、

_import Java.net.InetAddress;
import Java.net.UnknownHostException;
import Java.text.SimpleDateFormat;
import Java.util.Date;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ApplicationConfiguration implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {

        try {
            // step-1 : set hostName into System's property, which will use by log4j
            System.setProperty("hostName", InetAddress.getLocalHost().getHostName());
            //step - 2 : set currentDate into System's property, which will use by log4j
            System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
        } catch (UnknownHostException e) {
            System.out.println("Error Message : " + e.getMessage());
            //e.printStackTrace();
        } 


    }


}
_

…….

log4j.xmlファイルを同様に設定します、

_<appender name="applog" class="org.Apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${path}/app_${hostName}.${currentDate}.log" />
        <param name="MaxFileSize" value="1MB" />
        <param name="DatePattern" value=".dd-MM-yyyy" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
        </layout>
</appender>
_

web.xmlファイルを適宜更新してください。

_<web-app ...>
   <listener>
    <listener-class>
             com.pck1.ApplicationConfiguration
        </listener-class>
   </listener>
</web-app>
_

この構成は_web.xml_に適用する必要があります。アプリケーションが起動すると、この構成によってコンテキストリスナーのようにそれに従います。


更新2:

_<logger name="packageName.AAA" additivity="false" >
    <level value="INFO" />
    <appender-ref ref="applog"/>
 </logger>
_
5
vishal gajera

Log4j2 documentation に続いて、環境変数のルックアップを実行できるため、Unixのようなシステムではこれが機能するはずです。

<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
  <File name="File1" fileName="${MYHOST}_file.log">
  ...
  </File>
</Appenders>

$ HOSTNAMEは常にデフォルトで使用できるとは限らず、シェルで明示的にエクスポートする必要がある場合があることに注意してください。 この投稿 を参照してください。

5
Jose Duarte

次の設定はトリックを行います

<appender name="file" class="org.Apache.log4j.RollingFileAppender">
        <param name="append" value="false" />
        <param name="maxFileSize" value="10MB" />
        <param name="maxBackupIndex" value="10" />
        <param name="file" value="C:\\Users\\kavurira\\Desktop\\log4j-${HostName}.log" />
        <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m${HostName}%n" />
        </layout>
    </appender>

Just set "HostName" as system property, before initialization of Log4j.

System.setProperty("HostName", InetAddress.getLocalHost().getHostName());
1
Rajesh Kumar

Cf. this response 同様の質問に対して、このメーリングリスト thread によると、これは長年の要求であるとしても、要求が満たされるのは明らかではありません。

Log4jの最近のバージョンを使用して、このドキュメントの終わり section には、プロパティを使用して利用できる機能がすでにあるようです。

とにかく、あなたはいつも here のような特別なパターンレイアウトで自分でそれを行うためのソリューションを持っています。

1
Dfaure

システムプロパティhostnameを定義して、構成を変更できます。

<param name="File" value="${path}/app_${hostname}.log" />

Log4jを初期化する前に、システムプロパティが設定されていることを確認してください。

フィルターの追加については、回答を参照してください 一致するパターンでログをフィルター-log4j

更新:異なるログを書き込むための簡単な解決策:

<logger name="com"><!-- for Class Package is com.???... -->
    <level value="INFO" />
    <appender-ref ref="applog" />
</logger>
<logger name="loggerForCustomClass">
    <level value="INFO" />
    <appender-ref ref="customlog" />
</logger>

プログラムのコードを変更します。

//message will write to "customlog" appender
Logger.getLogger("loggerForCustomClass").info("log from custom class");

//message will write to "applog" appender
Logger.getLogger(getClass()).info("log from other class");
1
Beck Yang

基本的なアペンダーを拡張する独自のカスタムアペンダーを記述します。これは、Javaでプロパティを操作するのに役立ちます。

この回答を参照 https://stackoverflow.com/a/1324075/1594992

または単にこの答えのようにコマンドライン引数とシステムプロパティを設定します

https://stackoverflow.com/a/4953207/1594992

0
Sam