用Spring注入Log4J记录器[英] Injecting Log4J loggers with Spring

本文是小编为大家收集整理的关于用Spring注入Log4J记录器的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我有一个带有以下web的Spring 2.5 WebApp.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<display-name>Spring BlazeDS Integration Samples</display-name>


<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>ServerBlaze</param-value>
</context-param>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/*-context.xml
    </param-value>
</context-param>

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/config/log4j.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>

<servlet>
    <servlet-name>serverBlaze</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
    <servlet-name>serverBlaze</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

</web-app>

我声明了这个豆

    <bean id="mylog"
    class="org.springframework.beans.factory.config.CommonsLogFactoryBean">
    <property name="logName" value="mylog" />
</bean>

内部services-context.xml(这是一个燃烧/春季项目).

我以这种方式将其注入UserDao Bean:

    <bean id="user" class="com.acotel.msp.database.UserDAO" >
    <property name="mylog" ref="mylog" />
    <property name="jsonClient" ref="jsonClient" />
</bean>

这是log4j.xml配置文件:

    <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}\\logs\\serverBlaze.log" />
        <param name="datePattern" value="'.'yyyy-MM" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            ...cut...
        </layout>
    </appender>

    <appender name="ROOT" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}\\logs\\serverBlazeRoot.log" />
        <param name="datePattern" value="'.'yyyy-MM" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" />
        </layout>
    </appender>

    <logger name="com.bla.database">
        <level value="info" />
        <appender-ref ref="FILE" />
    </logger>

    <root>
        <priority value="info" />
        <appender-ref ref="ROOT" />
    </root>
</log4j:configuration>

在我的班级中,我有一个:

package com.bla.database;

import java.util.ArrayList;

import json.Client;

import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.bla.MessageReceiver;
import com.bla.PropertiesManager;
import com.bla.interfaces.Users;
import com.bla.vo.User;

public class UserDAO {

private Log mylog;

private Client jsonClient;

public User getUser(String username, String password) {

    User result = null;

    try {

    Users users = jsonClient.openProxy("userDAO", Users.class);
    result = users.getUser(username, password);
    mylog.info("Esito invio bean ["+result+"]");    
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return result;
}}

我希望在类用户登录中登录可以登录到文件appender,但事实并非如此.该文件是创建但为空的. root appender正常工作. 我在做什么错?

推荐答案

在您的services-context.xml文件中,尝试将" mylog" bean的" logName"属性设置为" com.bla.database".此应该与log4j.xml配置文件中定义的记录器的名称匹配.

其他推荐答案

另一种方法是将记录视为交叉切割问题,并以各个方面进行.您可以声明地应用标准的弹簧拦截器.

本文地址:https://www.itbaoku.cn/post/1575070.html

问题描述

I have a spring 2.5 webapp with the following web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<display-name>Spring BlazeDS Integration Samples</display-name>


<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>ServerBlaze</param-value>
</context-param>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/*-context.xml
    </param-value>
</context-param>

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/config/log4j.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>

<servlet>
    <servlet-name>serverBlaze</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
    <servlet-name>serverBlaze</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

</web-app>

and I declared this bean

    <bean id="mylog"
    class="org.springframework.beans.factory.config.CommonsLogFactoryBean">
    <property name="logName" value="mylog" />
</bean>

inside services-context.xml (it's a blazeds/spring project).

I inject it this way into UserDAO bean :

    <bean id="user" class="com.acotel.msp.database.UserDAO" >
    <property name="mylog" ref="mylog" />
    <property name="jsonClient" ref="jsonClient" />
</bean>

This is log4j.xml config file :

    <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}\\logs\\serverBlaze.log" />
        <param name="datePattern" value="'.'yyyy-MM" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            ...cut...
        </layout>
    </appender>

    <appender name="ROOT" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}\\logs\\serverBlazeRoot.log" />
        <param name="datePattern" value="'.'yyyy-MM" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" />
        </layout>
    </appender>

    <logger name="com.bla.database">
        <level value="info" />
        <appender-ref ref="FILE" />
    </logger>

    <root>
        <priority value="info" />
        <appender-ref ref="ROOT" />
    </root>
</log4j:configuration>

In my class I have this :

package com.bla.database;

import java.util.ArrayList;

import json.Client;

import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.bla.MessageReceiver;
import com.bla.PropertiesManager;
import com.bla.interfaces.Users;
import com.bla.vo.User;

public class UserDAO {

private Log mylog;

private Client jsonClient;

public User getUser(String username, String password) {

    User result = null;

    try {

    Users users = jsonClient.openProxy("userDAO", Users.class);
    result = users.getUser(username, password);
    mylog.info("Esito invio bean ["+result+"]");    
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return result;
}}

I hoped that logging in class UserDAO would log to the FILE appender, but It does not. The file is created but is empty. ROOT appender works correctly. What am I doing wrong?

推荐答案

In your services-context.xml file, try setting the "logName" property of the "myLog" bean to "com.bla.database". This should match up with the name of the logger defined in your log4j.xml configuration file.

其他推荐答案

Another approach would be to treat logging as a cross cutting concern and do it with aspects. You can apply standard Spring interceptors declaratively.