引包:
2,web.xml文件添加配置
3,类中使用(这是我在Action类中使用的例子)
当时觉得不错, 也没问他们怎么实现的, 后来网上搜了一下, 基本原理如下:
通过自定义一个BeanPostProcessor, 在对所有bean初始化之前, 对每一个bean的field进行检查, 是否适用了Logger注解, 如果有, 则调用LogFactory创建一个logger实例.
2.创建一个BeanPostProcessor(这个是重点)
3.在spring beans配置文件中加入如下配置:
log4j.jar 当然还有有一些依赖包commons-logging等等
web中log4j配置使用
1,src下新建配置文件sys_log4j.properties
#debug < info < warn < error < fatal
log4j.rootLogger=error,stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p [%l] %n---> %m%n
#log4j.appender.stdout.layout.ConversionPattern=- [%p](%l) ---> [%m]%d{yyyy-MMM-dd HH:mm:ss}%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${webapp.root}/logs/sys.log
log4j.appender.logfile.MaxFileSize=1MB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=10
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= %n - [%p]-%d{yyyy-MMM-dd HH:mm:ss}-(%l)%n---> [%m]%n
log4j.logger.com.hl.zoneSystem_v01=error
#struts
#log4j.logger.org.apache.commons=DEBUG
#log4j.logger.org.apache.struts=DEBUG
#spring
#log4j.logger.org.springframework=DEBUG
#hibernate
#log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
#log4j.logger.org.hibernate=DEBUG
2,web.xml文件添加配置
<!-- log4j配置 放在spring的监听器之后-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/sys_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>
3,类中使用(这是我在Action类中使用的例子)
public class MainAction extends ModelAction<Talk> {
//log4j
public static Logger logger = Logger.getLogger(MainAction.class);
/**
* @Title: main_loadDynamic
* @Description: 加载主页动态
* @param: @return
* @return: String
* @author: hl
* @time: 2014-4-13 下午12:51:15
* @throws
*/
@Action("/main_loadDynamic")
public String main_loadDynamic(){
logger.debug("---------main_loadDynamic--------");
PageBean page = userDynamicService.UserDynamicPage(getUser().getId(), pageNum,pageSize);
jsonMap.put("page", page);
return jsonResult;
}
}
log4j注解使用(在spring中)
做项目的时候, 看到公司框架中有一个不错的对logger的注解来简化定义, 具体用法如下:
@Logger
private static Log log;
当时觉得不错, 也没问他们怎么实现的, 后来网上搜了一下, 基本原理如下:
通过自定义一个BeanPostProcessor, 在对所有bean初始化之前, 对每一个bean的field进行检查, 是否适用了Logger注解, 如果有, 则调用LogFactory创建一个logger实例.
做法如下:
1.定义一个Logger注解:
/**
* 添加一個日志注解类
*
*/
@Retention(RetentionPolicy.RUNTIME) //运行是编译
@Target( { ElementType.FIELD }) //修饰的字段
public @interface Logger {
}
2.创建一个BeanPostProcessor(这个是重点)
/**
* Log4j日志注解化的应用 基本原理如下:
* 通过自定义一个BeanPostProcessor, 在对所有bean初始化之前,
* 对每一个bean的field进行检查, 是否适用了Logger注解, 如果有, 则调用LogFactory创建一个logger实例.
*
*/
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;
}
/**
* 取得指定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;
}
/**
* 对logger变量进行初始化
*
* @param bean
* @param clazz
*/
private void initializeLog(Object bean, Class<? extends Object> clazz) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
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);
}
}
}
}
3.在spring beans配置文件中加入如下配置:
<bean id="logBeanPocessor" class="cn.hl.zone.log.LogBeanPostProcessor" lazy-init="false" />