0

同じパッケージ内に 2 つの Java クラスがあります。これら 2 つのクラスからのメッセージを 2 つの異なるログ ファイルに記録したいと考えています。

ログ メッセージは、これら 2 つのファイルのいずれにも繰り返されるべきではありません。

次の log4j.properties ファイルを使用しています。

# Set root category priority to DEBUG and its appender to CONSOLE and LOGFILE_ENGINE.
log4j.rootCategory=DEBUG, LOGFILE_ENGINE, SYNC_HANDLER


log4j.additivity.LOGFILE_ENGINE = false
log4j.additivity.SYNC_HANDLER = false


log4j.category.org.jboss=ERROR
log4j.category.org.apache.axis=ERROR
log4j.category.org.springframework=ERROR
log4j.category.org.hibernate=ERROR
log4j.category.org.jgroups=ERROR
log4j.category.org.apache.catalina.loader.WebappClassLoader=OFF
log4j.logger.net.sourceforge.stripes=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.additivity.org.jboss.cache=false
log4j.logger.org.quartz=ERROR

# LOGFILE_ENGINE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
log4j.appender.LOGFILE_ENGINE.Append=true
log4j.appender.LOGFILE_ENGINE.maxBackupIndex=5
log4j.appender.LOGFILE_ENGINE.maxFileSize=10MB
log4j.appender.LOGFILE_ENGINE.Threshold=INFO
log4j.appender.LOGFILE_ENGINE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_ENGINE.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n


log4j.appender.SYNC_HANDLER=org.apache.log4j.RollingFileAppender
log4j.appender.SYNC_HANDLER.File=${catalina.home}/logs/file2.log
log4j.appender.SYNC_HANDLER.Append=true
log4j.appender.SYNC_HANDLER.maxBackupIndex=5
log4j.appender.SYNC_HANDLER.maxFileSize=10MB
log4j.appender.SYNC_HANDLER.Threshold=DISASTER#PackageName.className
log4j.appender.SYNC_HANDLER.layout=org.apache.log4j.PatternLayout
log4j.appender.SYNC_HANDLER.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n

DISASTER#PackageName.classNameLevelのクラスを拡張して作成したカスタム レベルです。org.apache.log4j

問題 1. file2.log からのログ メッセージが file1.log ファイルに繰り返されます。

2. log4j を介してクラス ベースのロギングを行うことは可能ですか。

Log4j...に関して私が素朴であることは言うまでもありません。

4

2 に答える 2

0

問題の解決策を見つけました。
個別のログが必要なクラスのカスタム ログ レベルを作成しました。
次のlog4j構成を試しました:

log4j.rootCategory=DEBUG, LOGFILE_ENGINE

log4j.category.packageName.className = DEBUG, packageName.className.syncLogger
log4j.additivity.packageName.className= false

log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
.....................

log4j.appender.packageName.className.syncLogger=org.apache.log4j.RollingFileAppender
log4j.appender.packageName.className.syncLogger.File=${catalina.home}/logs/file2.log
log4j.appender.packageName.className.syncLogger.Threshold=DISASTER#packageName.SyncLogLevel
.....................

そして、次のようにロガー参照を作成しました。

private static final String FQCN = className.class.getName();
private static final String SYNC_LOGGER_NAME = FQCN + ".syncLogger";
public static customLoggingClassName syncLogger = Logger.getLogger(SYNC_LOGGER_NAME);

以下は、カスタムレベル ( DISASTER )を作成するためのカスタム レベル クラス ( SyncLogLevel ) です。

public class SyncLogLevel extends Level{

    private static final long serialVersionUID = 1L;

    public SyncLogLevel(int level, String levelStr, int syslogEquivalent) {
        super(level, levelStr, syslogEquivalent);
    }
    public static SyncLogLevel toLevel(int val, Level defaultLevel) {
        return DISASTER;
    }

    public static SyncLogLevel toLevel(String sArg, Level defaultLevel) {
        return DISASTER;
    }
    public static final SyncLogLevel DISASTER = new SyncLogLevel(60000, "DISASTER", 0);

}

この後、次のように目的のクラスでロギングを行う必要があります。

syncLogger.log(SyncLogLevel.DISASTER, "Log Message");

最後に、ログ レベルが「DISASTER」の syncLogger から呼び出されたすべてのログ メッセージは、別のファイル (file2.log) に移動します。

これをすべて行った後、すべてのログは目的のファイルに個別に移動します。

于 2013-07-05T05:35:27.380 に答える