参照别人的代码做了个Demo如下:
Spring的加载时自动自行此bean的应用
package cn.com.vnvtrip.spring.log4j.ext;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import cn.com.vnvtrip.spring.log4j.anonation.Logger;
/**
* Log4j日志注解化的应用 基本原理如下:
* 通过自定义一个BeanPostProcessor, 在对所有bean初始化之前,
* 对每一个bean的field进行检查, 是否适用了Logger注解, 如果有, 则调用LogFactory创建一个logger实例.
*
* @author longgangbai
*
*/
public class LogBeanPostProcessor implements BeanPostProcessor {
/**
* 初始化之后的操作
*/
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
/**
* 初始化之前的操作的处理
*/
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
List<Class<?>> clazzes = getAllClasses(bean);
for (Class<?> clazz : clazzes) {
initializeLog(bean, clazz);
}
return bean;
}
/**
* 初始化添加日志功能的
*
* @param bean
* @param clazz
*/
private void initializeLog(Object bean, Class<? extends Object> clazz) {
Field[] fiels = clazz.getDeclaredFields();
for (Field field : fiels) {
if (field.getAnnotation(Logger.class) == null) {
continue;
}
if (!field.getType().isAssignableFrom(Log.class)) {
continue;
}
// 獲取是否可以方法的属性
boolean visable = field.isAccessible();
try {
// 設置可以属性为可以访问
field.setAccessible(true);
field.set(bean, LogFactory.getLog(clazz));
} catch (Exception e) {
throw new BeanInitializationException(String.format(
"初始化logger失败!bean=%s;field=%s", bean, field));
} finally {
// 恢复原来的访问修饰
field.setAccessible(visable);
}
}
}
/**
*
* 獲取制定bean的class以及所有父类的列表,该列表中顺序为从父类中当前类
*
* @param bean
* @return
*/
private List<Class<?>> getAllClasses(Object bean) {
Class<? extends Object> clazz = bean.getClass();
List<Class<?>> clazzes = new ArrayList<Class<?>>();
while (clazz != null) {
clazzes.add(clazz);
clazz = clazz.getSuperclass();
}
Collections.reverse(clazzes);
return clazzes;
}
}
設置注解类
package cn.com.vnvtrip.spring.log4j.anonation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 添加一個日志注解类
*
* @author longgangbai
*
*/
@Retention(RetentionPolicy.RUNTIME) //运行是编译
@Target( { ElementType.FIELD }) //修饰的字段
public @interface Logger {
}
package cn.com.vnvtrip.spring.log4j.test;
import org.apache.commons.logging.Log;
import cn.com.vnvtrip.spring.log4j.anonation.Logger;
public class LoggAnonation {
@Logger
private static Log log;
public double divide(int a, int b) {
if (b == 0) {
log.error("被除数不可以为0");
} else {
return a / b;
}
return -1;
}
}
Spring配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">
<bean id="logBeanPocessor"
class="cn.com.vnvtrip.spring.log4j.ext.LogBeanPostProcessor" />
<bean id="loganonation" class="cn.com.vnvtrip.spring.log4j.test.LoggAnonation"/>
</beans>
测试类:
package cn.com.vnvtrip.spring.log4j.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class LogTest {
public static void main(String[] args) {
ApplicationContext ctxapp = new ClassPathXmlApplicationContext(
"applicationContext.xml");
LoggAnonation logtest = (LoggAnonation) ctxapp.getBean("loganonation");
double a = logtest.divide(8, 0);
System.out.println(a);
}
}
spring针对编码,log4j的配置;
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <display-name>RESTWebServices</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/application-*.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping> <!-- Filter 定义 --> <!-- Character Encoding filter CharacterEncodingFilter类具有encoding和forceEncoding两个属性,其中encoding是表示设置request的编码,forceEncoding表示是否同时设置response的编码。 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>6000</param-value> </context-param> <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> </web-app>
log4j.properties文件内容:
#log4j.rootLogger = [ level ] , appenderName, appenderName, ... log4j.rootLogger = INFO, console, R #level=INFO,all can be output #console is set to be a ConsoleAppender log4j.appender.console = org.apache.log4j.ConsoleAppender #console have four patterns #org.apache.log4j.HTMLLayout #org.apache.log4j.PatternLayout #org.apache.log4j.SimpleLayout #org.apache.log4j.TTCCLayout log4j.appender.console.layout = org.apache.log4j.PatternLayout #define the output type log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n #file is set to output to a extra file log4j.appender.R = org.apache.log4j.RollingFileAppender #the absolute route of the log4j file log4j.appender.R.File = /log.txt #the size log4j.appender.R.MaxFileSize = 500KB #back up a file log4j.appender.R.MaxBackupIndex = 1 log4j.appender.R.layout = org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
log4j日志整合输出(slf4j+commonslog+log4j+jdklogger)
J2EE项目中,经常会用到很多第三方的开源组件和软件,这些组件都使用各自的日志组件,比较常用的包括slf4j,common-log, log4j等,很多老的开源软件(包括TOMCAT)使用的是JDK14-LOGGER。这些日志都有自己独立的配置,或只是其中一些可以整合。但是在项目实际部署的时候,需要把所有开源软件和项目程序的各种日志都整合到日志文件中输出,包括tomcat。
本文介绍使用log4j作为日志组件,commons-log, slf4j 作为整合器,同时使用slf4j桥接jdk14-logger输出到log4j日志器。总的来说,达到项目中所有使用这四中日志输出的都统一使用log4j输出。
1.日志需要的包依赖(maven dependency):
- <properties>
- <slf4j.version>1.7.2</slf4j.version>
- <log4j.version>1.2.17</log4j.version>
- </properties>
- <!-- LOGGING begin -->
- <!-- slf4j -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <!-- slf4j-log4j绑定 -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <!-- common-logging 实际调用slf4j -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <!-- java.util.logging 实际调用slf4j -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jul-to-slf4j</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <!-- log4j -->
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>${log4j.version}</version>
- </dependency>
- <!-- LOGGING end -->
2.log4j配置
log4j的配置较简单,使用通常的log4j.properties文件配置就可以,一般放到classes下就OK,你可以在web.xml中加入常量配置配置文件路径。该常量用于filter加载的时候加载日志配置。
- <!--tomcat启动,filter载入的Log4j配置文件位置 -->
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>/WEB-INF/log4j.properties</param-value>
- </context-param>
- <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond, 用于在线动态修改log4j日志 -->
- <context-param>
- <param-name>log4jRefreshInterval</param-name>
- <param-value>30000</param-value>
- </context-param>
一般情况下,使用Spring提供的org.springframework.web.util.Log4jConfigListener负载在tomcat启动的时候加载log4j配置托管spring的日志输出配置。
log4j.properties
- log4j.rootCategory=INFO,stdout,logfile
- # Spring framework log level
- log4j.logger.org.springframework=INFO
- # spring modules log level
- #log4j.logger.org.springmodules=DEBUG
- # Hibernate log level
- # log4j.logger.org.hibernate=DEBUG
- log4j.logger.org.hibernate.SQL=DEBUG
- # Quartz log level
- #log4j.logger.org.quartz=INFO
- # Tomcat,commons... etc log level
- #log4j.logger.org.apache=INFO
- # Application log level
- #sql and execute time
- # log4jdbc
- log4j.logger.jdbc.sqltiming=INFO
- log4j.logger.jdbc.audit=OFF
- log4j.logger.jdbc.resultset=OFF
- log4j.logger.jdbc.sqlonly=INFO
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
- #\u4e3b\u65e5\u5fd7\u6587\u4ef6
- log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.logfile.File=logs/intergration.log
- log4j.appender.logfile.DatePattern=.yyyy-MM-dd
- log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
- log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n
3. 整合日志
- slf4j的日志会自动根据slf4j-log4j12-xxx.jar输出日志到log4j,无需配置。
- commons-log的日志会自动根据jcl-over-slf4j转到log4j输出,无需配置
- jdk14-logger的日志输出(如:tomcat,restlet等软件)可以根据jul-to-slf4j提供的Handler转移日志输出到slf4j,然后又slf4j转log4j输出。但是需要配置或编程方式设置
配置方式整合:
建立jdk14-logger的配置文件logger.properties.加入Hander配置:
handlers = org.slf4j.bridge.SLF4JBridgeHandler
然后在启动程序或容器的时候加入JVM参数配置JDK日志只是用SLF4JBridgeHandler处理:
-Djava.util.logging.config.file=/path/logger.properties
我不太喜欢这种方式,需要外部修改,麻烦,耦合性强。所以推荐是用编程方式。
编程方式:
扩展Spring提供的org.springframework.web.util.Log4jConfigListener,在TOMCAT启动的时候编程方式设置JDK的日志只是用SLF4JBridgeHandler进行处理。如果你不是WEB程序就更简单了,直接在程序MAIN方式里面设置就OK。
APP程序DEMO:
- public class CommonLogAndLog4j {
- private static final Log log = LogFactory.getLog(CommonLogAndLog4j.class);
- private static final Logger log4jLogger = Logger.getLogger(CommonLogAndLog4j.class);
- private static final java.util.logging.Logger jdkLogger = java.util.logging.Logger
- .getLogger(CommonLogAndLog4j.class.getName());
- private static final org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(CommonLogAndLog4j.class);
- // -Djava.util.logging.config.file=D:/workshop/log-intergration/src/logging.properties
- public static void main(String[] args) {
- installJulToSlf4jBridge();
- log.info("CommonsLog日志输出");
- log4jLogger.info("Log4j日志输出");
- jdkLogger.info("JDK14日志输出");
- slf4jLogger.info("slft4j日志输出");
- }
- public static void installJulToSlf4jBridge() {
- SLF4JBridgeHandler.removeHandlersForRootLogger();
- SLF4JBridgeHandler.install();
- }
- }
Webapp程序:
LoggerIntergrationListener.class
- /**
- * 扩展Spring的Log4jConfigListener,在容器启动的时候,桥接JDK14的输出到slf4j-logger
- *
- * @author zhangpu
- */
- public class LoggerIntergrationListener extends Log4jConfigListener {
- @Override
- public void contextInitialized(ServletContextEvent event) {
- installJulToSlf4jBridge();
- event.getServletContext().log("Install Jdk-util-logger to slf4j success.");
- super.contextInitialized(event);
- }
- private void installJulToSlf4jBridge() {
- SLF4JBridgeHandler.removeHandlersForRootLogger();
- SLF4JBridgeHandler.install();
- }
- }
web.xml配置
- <!--Intergration log4j/slf4j/commons-logger/jdk14-logger to log4j -->
- <listener>
- <listener-class>com.feinno.framework.common.web.support.LoggerIntergrationListener</listener-class>
- </listener>
OK,over!~
相关推荐
综上所述,"spring简单注解+log4j记录日志"这个主题涵盖了Spring框架中的注解使用、Log4j日志系统以及AOP的应用。通过学习这些内容,初学者可以更好地理解和实践Spring框架,同时提高代码的可维护性和调试效率。在...
接着,要在Spring应用中使用Log4j,你需要在Spring的配置文件(如`applicationContext.xml`)中引入Log4j的依赖。通常,我们会在Spring的配置文件中定义一个Bean,让Spring自动初始化Log4j: ```xml ...
1. **引入依赖**:在项目的Maven或Gradle构建文件中添加Log4j的依赖库。对于Maven,可以在`pom.xml`中加入如下代码: ```xml <groupId>log4j <artifactId>log4j <version>1.2.17 ``` 2. **配置Log4j**:...
在Spring框架中,可以通过Spring的Log4j配置来统一管理日志,方便调试和问题排查。 在提供的文件名称列表中,虽然没有具体的jar包名称,但通常Spring框架所需的jar包包括:spring-core、spring-context、spring-...
在IT行业中,Spring AOP(面向切面编程)和Log4j是两个非常重要的工具,它们在实际开发中起着至关重要的作用。本篇将详细探讨如何结合Spring AOP和Log4j实现动态日志记录。 Spring AOP是Spring框架的一个重要特性,...
6. **配置Log4j2**:在项目中添加Log4j2的配置文件(如log4j2.xml或log4j2.json),定义日志级别、输出目的地(如控制台、文件)和格式。 7. **编写业务逻辑**:使用Spring MVC的Controller、Service和DAO组件实现...
通过在`pom.xml`文件中添加Spring Boot的依赖,我们可以快速构建一个基于Spring的应用。 接下来是MyBatis,这是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和...
1. 引入相关jar包:添加Spring、SpringMVC、Mybatis和log4j的依赖库到项目中。 2. 配置Spring:创建ApplicationContext.xml,定义Bean的配置。 3. 集成SpringMVC:配置web.xml,设置DispatcherServlet,定义servlet-...
在Maven项目中,你需要在`pom.xml`文件中添加Log4j2和Spring的相关依赖。例如: ```xml <!-- Spring 5依赖 --> <groupId>org.springframework <artifactId>spring-context <version>5.x.y.RELEASE <!-- ...
Spring、Hibernate和Log4j是Java开发中三个非常重要的库,它们各自负责不同的领域,而将它们结合在一起,可以构建出强大的企业级应用系统。 Spring是一个全面的后端应用程序框架,它提供了依赖注入(DI)和面向切面...
1. 添加依赖:在项目中引入log4jdbc-log4j2和log4j2的依赖库,通常是在pom.xml文件中添加对应的Maven坐标或在build.gradle文件中添加Gradle依赖。 2. 配置数据源:在应用的配置文件(如Spring的application....
在实际应用中,可以结合使用这些方法,比如在Controller层处理HTTP请求时使用SpringMVC的注解脱敏,而在日志记录层面利用`Logback`或`Log4j2`的扩展功能进行全局脱敏。 在`desensitization`这个压缩包文件中,可能...
描述中提到,Spring 3.0需要JUnit 4.5以上的版本,而JUnit 4.10在实际应用中表现良好,同时也使用了Log4j进行日志记录。这些标签 "spring3", "junit4.10", "log4j" 和 "jar" 提供了关键组件的信息,表明这是一个Java...
标题中的"springmvc spring3 hibernate4 log4j"代表了一个基于Java的Web开发框架的组合,主要包括Spring MVC、Spring 3、Hibernate 4和Log4j四个关键组件。这四个技术是Java后端开发中非常重要的工具,下面将详细...
标题中的"ssh+aop+log4j+日志拦截器+注解"涉及到的是Java Web开发中的几个核心组件和技术,这些技术在构建大型、分布式的企业级应用时常常被使用。下面将详细介绍这些知识点: 1. SSH (Spring, Struts, Hibernate)...
这里提到的四个关键配置文件——`spring-mvc.xml`、`spring-mybatis.xml`、`web.xml`以及`log4j.properties`,对于一个基于Java的Web应用来说至关重要,特别是使用Spring MVC和MyBatis框架的时候。接下来,我们将...
在这个例子中,我们将讨论如何将Log4j与Spring MVC和AOP结合,实现方法调用前后的日志打印。 首先,让我们了解Log4j的基本配置。Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,定义了日志的级别(如DEBUG...
首先,我们需要在Spring Boot项目的`pom.xml`文件中添加Log4j的依赖。确保你的Maven依赖中有以下内容: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-log4j2 ``` 这个依赖引入了...
为了将Log4j引入到Spring Boot项目中,我们需要添加相应的依赖。在`pom.xml`文件中,我们需要注释掉Spring Boot默认的日志依赖,并引入Log4j的依赖,如下: ```xml <!-- 取消注释或移除Spring Boot默认的日志依赖 -...
这是一个基于Maven构建的Java Web项目,整合了Spring MVC、Spring、MyBatis以及Log4j四个关键组件,用于实现企业级的三层架构。这个Demo是个人学习与实践的成果,可以帮助初学者或开发者理解如何将这些流行的技术...