0

私はSpringアプリケーションを開発しました.apache log4jで構成したいです.ダウンロードしてjarファイルをプロジェクトのクラスパスに入れました. 以下は私の log4j.Properties ファイルです。

# Root logger option
log4j.rootLogger=INFO, file
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C\:\\loging.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

以下は私のメインの春のアプリケーションクラスです。

import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class DrawingClass {

    public static void main(String args[])
    {
        //without dependency injection 
        /*Triangle t1 = new Triangle();
        t1.draw();*/


        //with dependency injection     
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("Spring.xml"));
        Triangle t1 =(Triangle) factory.getBean("triangle");
        t1.draw();
    }
}

上記のメイン クラスに log.info を配置する場合は、メイン クラスで必要な変更と、メイン クラスで log4j を呼び出すために必要な変更を教えてください。

このソリューションを考え出すと、それが機能します..編集されたlog4j.propertiesファイルは

### direct messages to file or.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=C:/logs/s.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1} - %m%n
log4j.appender.file.append=true

### set log levels - for more verbose logging change 'info' to 'debug' ##
log4j.rootCategory=ALL, file
log4j.logger.Demo=\=debug
log4j.logger.org.eclipse=debug

メインクラスからcallitする方法は

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class DrawingClass {
     /* Get actual class name to be printed on */
    static final Logger log = Logger.getLogger(DrawingClass.class);
    public static void main(String args[])
    {PropertyConfigurator.configure("log4j.properties");
        //without dependency injection 
        /*Triangle t1 = new Triangle();
        t1.draw();*/

         log.info("Before execution");
        //with dependency injection     
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("Spring.xml"));
        Triangle t1 =(Triangle) factory.getBean("triangle");
        log.info("Hello this is an info message");
        t1.draw();
         log.info("after object execution");
    }
}

他に良い方法があればアドバイスをお願いします。

4

3 に答える 3

1

私のプロジェクトでロギングを使用するために、私はそのようなものを作りました:

1) ロガーを挿入するフィールドをマークする特別な注釈を定義:

@Retention(RUNTIME)  
@Target(FIELD)  
@Documented  
public @interface InjectLogger {  
}  

2) 次に、ロガーを注釈付きフィールドに挿入するための特別な BeanPostProcessor を作成しました。

@Component(value="loggerInjector")
public class LoggerInjector implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {

        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(final Object bean, String beanName)
            throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {  
            public void doWith(Field field) throws IllegalArgumentException,  
            IllegalAccessException {  
                // make the field accessible if defined private  
                ReflectionUtils.makeAccessible(field);  
                if (field.getAnnotation(InjectLogger.class) != null) {  
                    Logger log = LoggerFactory.getLogger(bean.getClass()); 
                    field.set(bean, log);  
                }  
            }  
        });  
        return bean;  
    }  

}

3) この後、ロガーが @InjectLogger アノテーションによって注入され、コードでこのロガーを使用する必要がある必要な Bean マーク プロパティで。

    @InjectLogger
    private Logger logger;

public void doSomething(...) {
     try{
     ...
     } catch (Exception e) {
        logger.error("bla bla bla", e);
     }
}

私のプロジェクトでは、具体的な実装として slf4j と log4j を使用しています。しかし、log4j でも同様です。

また、デフォルトでは、すべての Spring ライブラリが common-logging を使用していることを知っておく必要があります。また、Spring ライブラリがログをファイルに書き込むようにしたい場合は、特別な追加ライブラリを使用する必要があります。私が覚えているように、apache サイトから入手できます。slf4j の場合、そのような lib は jcl-over-slf4j-1.6.4.jar という名前です。

編集2:

また、春にはロギングに AOP を使用することをお勧めします。単純化されたアスペクトの例を次に示します。

@Component
@Aspect
@Order(value=2)
public class LoggingAspect {

    @Around("execution(* com.blablabla.server..*.*(..))")
    public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable{
        final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass().getName());
        Object retVal = null;

        try {
            StringBuffer startMessageStringBuffer = new StringBuffer();

            startMessageStringBuffer.append("Start method ");
            startMessageStringBuffer.append(joinPoint.getSignature().getName());
            startMessageStringBuffer.append("(");

            Object[] args = joinPoint.getArgs();
            for (int i = 0; i < args.length; i++) {
                startMessageStringBuffer.append(args[i]).append(",");
            }
            if (args.length > 0) {
                startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length() - 1);
            }

            startMessageStringBuffer.append(")");

            logger.trace(startMessageStringBuffer.toString());

            StopWatch stopWatch = new StopWatch();
            stopWatch.start();

            retVal = joinPoint.proceed();

            stopWatch.stop();

            StringBuffer endMessageStringBuffer = new StringBuffer();
            endMessageStringBuffer.append("Finish method ");
            endMessageStringBuffer.append(joinPoint.getSignature().getName());
            endMessageStringBuffer.append("(..); execution time: ");
            endMessageStringBuffer.append(stopWatch.getTotalTimeMillis());
            endMessageStringBuffer.append(" ms;");

            logger.trace(endMessageStringBuffer.toString());
        } catch (Throwable ex) {
            StringBuffer errorMessageStringBuffer = new StringBuffer();

             // Create error message 
             logger.error(errorMessageStringBuffer.toString(), e)

            throw ex;
        }

        return retVal;
    }
}
于 2012-07-02T07:22:55.500 に答える
1

この行をクラスに追加してみてください -

public class DrawingClass {

   static final Logger log = Logger.getLogger(DrawingClass.class);

public static void main(String args[])
{
    //without dependency injection 
    /*Triangle t1 = new Triangle();
    t1.draw();*/

    log.info("Before execution");
    //with dependency injection     
    BeanFactory factory = new XmlBeanFactory(new FileSystemResource("Spring.xml"));
    Triangle t1 =(Triangle) factory.getBean("triangle");
    t1.draw();
}
 }

ログに何か追加されたら教えてください。

このリンクが役立つかもしれません - http://www.dzone.com/tutorials/java/log4j/sample-log4j-properties-file-configuration-1.html

于 2012-07-02T07:26:28.550 に答える