9

さて、私はメモリアペンダー(コンソールまたはファイルの代わりにArrayListにログを記録する単なるロガー)を作成しようとしていますが、今のところ、コンソールへの出力を無効にしたいと考えています。

質問とウェブサイト、これまで読んだことがあります(しかし、まだわかりません..

私が達成しようとしていることに関するすべてのセグメントが含まれていますが、まだ混乱しています。

また、 Logback または Log4j Additivity Explainedからこのセグメントを読みました。

ただし、ロガー X のアディティビティ フラグが false または無効に設定されている場合、 x.debug() を呼び出すと、ファイルにのみログが記録されます。

理論的には私のlog4j.propertiesファイル

log4j.rootLogger=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %5p %c (%F:%L) - %m%n
#hide the Log4jMemoryAppender from console
log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender= ERROR, MEMORY_APPENDER
log4j.appender.MEMORY_APPENDER=nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender.Log4jMemoryAppender
log4j.additivity.rootLogger = false
log4j.additivity.console = false
log4j.additivity.MEMORY_APPENDER=false

のみを印刷し、 、および***Hello Worldから他のものを除外する必要があります。MEMORY_APPENDERrootLoggerconsole

package nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender;

import java.util.ArrayList;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log4jMemoryAppender extends AppenderSkeleton {

ArrayList<LoggingEvent> eventsList = new ArrayList();

public static void main (String [] args) {

    PropertyConfigurator.configure("Lib/log4j.properties");
    Log4jMemoryAppender app = new Log4jMemoryAppender();
    Logger logger = Logger.getLogger(Log4jMemoryAppender.class);
    logger.setLevel(Level.INFO);

    logger.addAppender(app);
    logger.info("Hello World");
    logger.debug("Level DEBUG Is SET");

    for (LoggingEvent le: app.eventsList) {
        System.out.println("***" + le.getMessage());
    }
} 

@Override
protected void append(LoggingEvent event) {
    eventsList.add(event);
}

public void close() {
}

public boolean requiresLayout() {
    return false;
}
}

しかし、そうではありません...

アペンダ
(出典: iforce.co.nz )

4

2 に答える 2

5

この線

MEMORY_APPENDER=false

は機能しません。値がfalseになるようにアペンダーを設定することはできません。

あなたの場合、次のようなことをしたほうがいいでしょう:

log4j.rootLogger=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = ERROR, MEMORY_APPENDER
log4j.additivity.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = false

例の1つで使用されているロガーは、またはのようなパッケージ部分nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppenderのロガーにマップする必要があります。log4j.propertiesnz.ac.massey.cs.sdc.log4jassignment


ここでたくさん混ぜているようです。あなたかどうかLog4jMemoryAppenderMEMORY_APPENDER

そして、なぜあなたは呼んでいBasicConfigurator.configure()ますか?使いたくないlog4j.properties


通常、クラスでは、ロガーを取得するためにこれを行います。

package com.mycompany;

public class MyClass {
    private static final Logger log = Logger.getLogger(MyClass.class);
    ...
}

ロガー名は完全修飾クラス名になりますcom.mycompany.MyClass

次に、次のlog4j.propertiesようにすることができます。

log4j.rootLogger=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.logger.com.mycompany=INFO, file
log4j.additivity.com.mycompany=false

logfj.appender.file = <some file appender>

OK、最初から始めます。非常に簡単な例です。

src/main/java/Log4JTest.java

package org.stackoverflow;

import org.apache.log4j.Logger;

/**
 * @author maba, 2012-08-22
 */
public class Log4JTest {

    public static final Logger log = Logger.getLogger(Log4JTest.class);

    public static void main(String[] args) {
        log.error("Error in main");
    }
}

src/main/resources/log4j.properties

log4j.rootLogger = ERROR, console

log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

次に、コンパイルして、実行時に、および独自のクラスとlog4j.properties一緒にクラスパスにあることを確認します。log4j.jar

あなたはこれを見るでしょう:

0    [main] ERROR org.stackoverflow.Log4JTest  - Error in main

ここから、ファイルアペンダーまたは独自のメモリアペンダーを追加してみることができます。

于 2012-08-22T06:34:55.350 に答える