在我的前一篇博客中: [不看会后悔]Log4J记录系统业务日志到数据库 介绍了一种打日志的方法;最近iPortal框架为了避开无休止的struts2漏洞侵扰,将其替换成springmvc了;下面把两个框架配置的差异点罗列如下:
主要区别在于控制层。直接代码看吧:
@Controller
@RequestMapping("/dataItem")
public class DataItemController extends BaseController{
@RequiresPermissions("dataItem:get") //shiro权限验证
@RequestMapping("/get")
@ResponseBody
public Map<String, Object> get(DataItem dataItem){
dataItem = dataItemService.findById(dataItem.getId());
// MDC.put("operateContent","查询数据条目,ID:"+dataItem.getId());
//上面这行是之前版本的变量注入;现在我们废弃这种方式;直接把信息写入LOG.info("") 中;然后用%m 直接给operateContent赋值。
//Log4j 的配置文件变成如下形式:
//INSERT INTO sys_log (username,clientIp,operateModule,operateModuleName,operateType,operateTime,operateContent,operateResult)
// VALUES ('%X{username}','%X{clientIp}','%C{1}','%X{operateModuleName}','%M','%d{yyyy-MM-dd HH🇲🇲ss}','%m','%X{operateResult}')
LOG.info("查询数据条目,ID:"+dataItem.getId());
result.put("flag",true);
result.put("dataItem",dataItem);
return result;
}
@ModelAttribute
public void doString(){
//Struts2 里面我们使用类的构造函数来完成模块名称的统一注入;
//SpringMVC和struts2的机制不同;使用构造函数的方式行不通了;这里使用了SpringMVC的一个注释@ModelAttribute 来进行参数的前置注入;
MDC.put("operateModuleName","数据条目管理");
result.clear(); //这行请忽略和日志无关。
}
}
下面把我最新的基于SpringMVC的Log4j核心配置文件贴出来:
###############################################################Log4j output to db#########################################################################################
log4j.logger.info.huzd.bf=info,dblog
#output in root logger
log4j.additivity.info.huzd.bf=false
log4j.appender.dblog=info.huzd.bf.log4j.extend.IportalJDBCAppender
log4j.appender.dblog.encoding=UTF-8
#the lowest log level of the appender
log4j.appender.dblog.Threshold=info
log4j.appender.dblog.BufferSize=10
log4j.appender.dblog.sql= INSERT INTO sys_log (username,clientIp,operateModule,operateModuleName,operateType,operateTime,operateContent,operateResult) VALUES ('%X{username}','%X{clientIp}','%C{1}','%X{operateModuleName}','%M','%d{yyyy-MM-dd HH🇲🇲ss}','%m','%X{operateResult}')
log4j.appender.dblog.layout=org.apache.log4j.PatternLayout
log4j.appender.dblog.layout.ConversionPattern=-[%d{yyyy-MM-dd HH🇲🇲ss}]-[%C{1}]-[%M]-%X{clientIp}-%X{operateModuleName}-%X{username}-%X{operateContent}-%X{operateResult}-%m-%n
###############################################################Log4j output to db#########################################################################################
请大家注意这行:log4j.appender.dblog=info.huzd.bf.log4j.extend.IportalJDBCAppender
之前的文章这里写的是数据库的账号密码的,这里做缺点很多优点无;1、容易暴露账号密码,我们在黑龙江的项目中用户要求项目的任何代码中不允许存在明文的数据量连接账号密码;2、容易漏改。
于是我自己实现了一个JDBCAppender 直接从Spring中的dataSource取的连接;连接池使用阿里的druid,支持密码加密。这样就解决了上述的两个缺点!
public class IportalJDBCAppender extends JDBCAppender {
@Override
protected Connection getConnection() throws SQLException {
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
DruidDataSource dataSource = wac.getBean("dataSource", DruidDataSource.class);
// BasicDataSource dataSource = wac.getBean("dataSource", BasicDataSource.class);
super.databaseURL = dataSource.getUrl();
super.databaseUser = dataSource.getUsername();
super.databasePassword = dataSource.getPassword();
return super.getConnection();
}
}
没有贴出代码的部分都和之前的博客文章相同。
本文由 huzd 创作,采用 知识共享署名4.0 国际许可协议进行许可本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名最后编辑时间
为:
2017/11/24 09:29