1. service 层因为要配置事务,使用了代理

<aop:config proxy-target-calss=''true">
<aop:pointcut id="serviceOperation"
expression="execution(* ............*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
</aop:config>

proxy-target-calss=''true" 为基于cglib 实现代理 false 为jdk实现代理

使用日志时 需要service实现类的class文件

loggerFactory.getLogger(service.getClass());

og4j.logger.com.*.*.memmber= DEBUG,service
log4j.additivity.com.*.*=false
log4j.appender.service=org.apache.log4j.FileAppender
log4j.appender.service.File=C:/Users/Administrator/Desktop/login.log
#log4j.appender.service.File=/app/tomcat-portal/logs/login.log
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

因为本人日志时com.包下的 才会输出到日志文件中

所以代理生成的serviceimpl 不会输出到该文件下

所以我们需要根据代理类获取真实类

import java.lang.reflect.Field;

import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;

public class AopTargetUtils {

/**
* 获取 目标对象
* @param proxy 代理对象
* @return
* @throws Exception
*/
public static Object getTarget(Object proxy) throws Exception {

if(!AopUtils.isAopProxy(proxy)) {
return proxy;//不是代理对象
}

if(AopUtils.isJdkDynamicProxy(proxy)) {
return getJdkDynamicProxyTargetObject(proxy);
} else { //cglib
return getCglibProxyTargetObject(proxy);
}

}

/**
* @Title: getCglibProxyTargetObject
* @Description: TODO (proxy-target-class=true 使用cglib生成代理类获取真实类)
* @param proxy
* @return
* @throws Exception
* Object
* @throws
*/
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
h.setAccessible(true);
Object dynamicAdvisedInterceptor = h.get(proxy);

Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
advised.setAccessible(true);

Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();

return target;
}

/**
* @Title: getJdkDynamicProxyTargetObject
* @Description: TODO (proxy-target-class=false 使用jdk生成代理类获取真实类)
* @param proxy
* @return
* @throws Exception
* Object
* @throws
*/
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);

Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);

Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();

return target;
}

}

通过 getTarget(proxy).getClass()方法获取的class文件 才会输出到日志文件中

log4j根据包名 日志输出到不同文件中 , service层无法输出日志问题的更多相关文章

  1. ASP.NET MVC 4 (十一) Bundles和显示模式--asp.net mvc中 @Scripts.Render("~/bundles/jquery")是什么意思? 在布局文件中使用Scripts.Render()输出脚本包,Styles.Render()输出风格包:

    ASP.NET MVC 4 (十一) Bundles和显示模式 ASP.NET MVC 4 引入的js打包压缩功能.打包压缩jquery目录下的文件,在布局文件中使用Scripts.Render()输 ...

  2. Shell 从日志文件中选择时间段内的日志输出到另一个文件

    Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...

  3. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

  4. 类A是公共的,应在名为A.java的文件中声明错误

    第一种!!! “类A是公共的,应在名为A.java的文件中声明”这句话需要分两步来理解: 1.如果类A被声明为公共的(public),那么必须将类A保存在名为A.java的文件中: 2.反之,在一个文 ...

  5. scrapy输出的json文件中显示中文

    scrapy用-o filename.json 输出时,会默认使用unicode编码,当内容为中文时,输出的json文件不便于查看,如下图: 可以在setting.py文件中修改默认的输出编码方式,只 ...

  6. Java入门-类HelloWorld是公共的,应在名为HelloWorld.java的文件中声明

    开始学习java了,搭好环境,notepad++中新建一个java文件,新建一个HelloWorld类, public class HelloWorld { public static void ma ...

  7. 【shell脚本】不停地telnet一个ip或域名,并输出结果到文件中===telnetscript.sh

    编写shell脚本不停地telnet一个域名,并输出结果到文件中 [root@localhost ~]# cat telnetscript.sh #!/bin/bash #检查是否在root用户下执行 ...

  8. flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

    1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...

  9. 报错:①Tog goal specified requires a project to execute but there is no POM in this directory......②说类HelloWorld是公共的, 应在名为 HelloWorld.java 的文件中声明 public class HelloWorld......

    在运行Maven的命令时,在DOS窗口里面必须把目录切换到项目的根部,要不然命令是找不到目的地. 下图是错误示范,项目在Demo02这个目录里,就必须将目录切换到Demo02下,否则DOS窗口只有飘红 ...

随机推荐

  1. js datagrid 移动去重

    function dataLeft(){ var checkedData = $(listTemplate_right).datagrid('getChecked'); var rows = $(li ...

  2. APP测试报告

    招标手机APP测试总结报告     作    者: 日    期: 2016-03-10 文档编号: 002 版    本: Ver 1.0 目   录 1.测试概述 1 1.1. 编写目的 1 1. ...

  3. js★★★【面向对象的使用方法】*****************★★★★ 相当重要

    标准用法: function Sprite(){ //函数内容部设置属性 this.name='shimily'; } //原型上设置方法 Sprite.prototype.show=function ...

  4. 关于position的一些问题

    position属性:  static:静止  relative:相对的  fixed:固定的  absolu:绝对的 position的一些实例子如下: HTML: <!DOCTYPE htm ...

  5. 20165214 2018-2019-2 《网络对抗技术》Exp5 MSF基础应用 Week8

    <网络对抗技术>Exp5 MSF基础应用 Week8 一.实验目标与内容 1.实践内容(3.5分) 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体我 ...

  6. Delphi Redis Client

    https://github.com/danieleteti/delphiredisclient

  7. L2-022 重排链表 (25 分)

    L2-022 重排链表 (25 分)   给定一个单链表 L​1​​→L​2​​→⋯→L​n−1​​→L​n​​,请编写程序将链表重新排列为 L​n​​→L​1​​→L​n−1​​→L​2​​→⋯.例 ...

  8. git教程:撤销修改

    转载:撤销修改 自然,你是不会犯错的.不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: $ cat readme.txt Git is a distributed ve ...

  9. iOS TabelViewCell 删除 编辑 插入

    /** TableView 进入或退出编辑状态(TableView 方法). */ - (void)setEditing:(BOOL)editing animated:(BOOL)animate{ / ...

  10. 【oracle】ORA-02289: sequence does not exist

    select * from user_sequences where sequence_name = 'NLDP_LGIR_BASE_SEQUENCE'; 通过该指令查看SEQUENCE是否存在