参考:http://blog.csdn.net/ziruobing/article/details/3919501
log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出。本节主要讲述如何将日志信息输入到数据库(可以插入任何数据库,在此主要以MSSQL为例进行详解)。
用log4j将日志写入数据库主要用到是log4j包下的JDBCAppender类,它提供了将日志信息异步写入数据的功能,我们可以直接使用这个类将我们的日志信息写入数据库;也可以扩展JDBCAppender类,就是将JDBCAppender类作为基类。下面将通过一个实例来讲解log4j是如何将日志信息写入数据库的。
我们的需求:我们在软件开发的过程中需要将调试信息、操作信息等记录下来,以便后面的审计,这些日志信息包括用户ID、用户姓名、操作类、路径、方法、操作时间、日志信息。
设计思想:我们采用JDBCAppender类直接将日志信息插入数据库,所有只需要在配置文件配置此类就可以;要获得用户信息需要用过滤器来实现;(假如不需要用户的信息,就不需要设计过滤器,其实大部分情况下都是需要这些用户信息,尤其是在web应用开发中)在日志信息中获得用户信息,就的通过过滤器的request或session对象,从session中拿到用户信息怎样传到log4j呢,log4j为我们提供了MDC(MDC是log4j种非常有用类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不同的是信息都是以它们的key值存储在”map”中。相对应的方法,
MDC.put(key, value); MDC.remove(key); MDC.get(key);
在配置PatternLayout的时候使用:%x{key}来输出对应的value)。有了MDC,我们可以在过滤器中先获得用户信息,再用MDC.Put(“key”)方法,log在执行sql语句时通过%x{key}来输出对应的value。
实现步骤:
1、在你的项目中要确保有log4j和commons-logging这两个jar文件;
2、设置要你要插入日志信息的表结构
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WDZLOG]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WDZLOG]
GO
CREATE TABLE [dbo].[WDZLOG] (
[WDZLOGID] [int] IDENTITY (1, 1) NOT NULL ,
[LogName] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//用户ID
[UserName] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//用户姓名
[Class] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//类名
[Mothod] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL //,方法名
[CreateTime] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//产生时间
[LogLevel] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,//日志级别
[MSG] [varchar] (555) COLLATE Chinese_PRC_CI_AS NULL //日志信息
) ON [PRIMARY]
GO
3、配置文件(摘自我们的项目)后面将对此配置文件进行详细讲解,它也log4j的核心部分。
log4j.properties
log4j.rootLogger=INFO,stdout
log4j.logger.org.springframework.web.servlet=INFO,db
log4j.logger.org.springframework.beans.factory.xml=INFO
log4j.logger.com.neam.stum.user=INFO,db
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n
########################
# JDBC Appender
#######################
#log4j.logger.business=INFO,db
#log4j.appender.db=com.neam.commons.MyJDBCAppender
log4j.appender.db=JDBCExtAppender
log4j.appender.db.BufferSize=10
log4j.appender.db.sqlname=log
log4j.appender.db.driver=net.sourceforge.jtds.jdbc.Driver
log4j.appender.db.URL=jdbc:jtds:SqlServer://localhost:1433;DatabaseName=pubs
log4j.appender.db.user=sa
log4j.appender.db.password=sa
log4j.appender.db.sql=insert into WDZLOG (LogName,UserName,Class,Mothod,createTime,LogLevel,MSG) values ('%X{userId}','%X{userName}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')
log4j.appender.db.layout=org.apache.log4j.PatternLayout
4、编写过滤器(ResFilter.java)
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import com.neam.domain.User;
public class ResFilter implements Filter{
private final static double DEFAULT_USERID= Math.random()*100000.0;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session= req.getSession();
if (session==null){
MDC.put("userId",DEFAULT_USERID);
}
else{
User customer=(User)session.getAttribute("user");
if (customer==null){
MDC.put("userId",DEFAULT_USERID);
MDC.put("userName",DEFAULT_USERID);
}
else
{
MDC.put("userId",customer.getName());
MDC.put("userName",customer.getName());
}
}
//logger.info("test for MDC.");
chain.doFilter(request, response);
}
public void init(FilterConfig Config) throws ServletException {
// this.filterConfig = Config;
// String ccc = Config.getServletContext().getInitParameter("cherset");
// this.targetEncoding = Config.getInitParameter("cherset");
}
}
5、在需要写入日志的地方引入
private Log logger = LogFactory.getLog(this.getClass());
在具体方法中就可以写入日志
logger.info("");
logger.debug("");
logger.warn("");
logger.error("");
配置文件详解:
log4j.properties
log4j.properties
log4j.rootLogger=INFO,stdout
//配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level : 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
例如:log4j.rootLogger=info,A1,B2,C3 配置了3个输出地方我们可以设置让A1在控制台输出;B2生产日志文件;C3让日志信息插入数据库中。
本例中是将所有的日志信息在控制台打印出来。
log4j.logger.org.springframework.web.servlet=INFO,db
//设置将spring下包的某些类的日志信息写入数据库中,并且在控制台上打印出来。(是通过log4j.rootLogger=INFO,stdout来体现的)db是将日志信息写入数据库中
log4j.logger.org.springframework.beans.factory.xml=INFO
//本实例中为了让某些包下的日志信息能写入数据库
log4j.logger.com.neam.stum.user=INFO,db
//设置自己某个模块下的日志信息既在控制台上打印而且往数据库中保存
//下面是配置在控制台上打印日志信息,在这里就不再仔细描述了
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n
//下面是配置将日志信息写入文件中,在这里也就不再仔细描述了
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n
########################
# JDBC Appender
#######################
#log4j.appender.db=com.neam.commons.MyJDBCAppender
//下面是配置将日志信息插入数据库,
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
//配置输出目标为数据库(假如要将日志在控制台输出,配置为log4j.appender. stdout =org.apache.log4j.ConsoleAppender;将日志写入文件,配置为log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
这样的配置在许多地方都要有,需要可查有关资料),当然你也可以自己扩展org.apache.log4j.jdbc.JDBCAppender这个类,只需要在这里配置就可以了例如我们配置我自己扩展的MyJDBCAppender,配置为#log4j.appender.db=com.neam.commons.MyJDBCAppender
log4j.appender.db.BufferSize=10
//设置缓存大小,就是当有10条日志信息是才忘数据库插一次
log4j.appender.db.driver=net.sourceforge.jtds.jdbc.Driver
//设置要将日志插入到数据库的驱动
log4j.appender.db.URL=jdbc:jtds:SqlServer://localhost:1433;DatabaseName=pubs
log4j.appender.db.user=sa
log4j.appender.db.password=sa
log4j.appender.db.sql=insert into WDZLOG (LogName,UserName,Class,Mothod,createTime,LogLevel,MSG) values ('%X{userId}','%X{userName}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')
//设置要插入日志信息的格式和内容,%X{userId}是置取MDC中的key值,因为我们在过滤器中是将用户id和用户姓名放入MDC中,所有在这里可以用%X{userId}和%X{userName}取出用户的ID和用户姓名;'%C'表示日志信息是来自于那个类;%M表示日志信息来自于那个方法中;%d{yyyy-MM-dd HH:mm:ss}表示日志信息产生的时间,{yyyy-MM-dd HH:mm:ss}表示一种时间格式,你也可以直接写成%d;%p表示日志信息的级别(debug info warn error);
%m表示你写入的日志信息
log4j.appender.db.layout=org.apache.log4j.PatternLayout
分享到:
相关推荐
- dom4j是一个用于处理XML的Java库,常与Log4j结合使用,例如读取或写入XML配置文件。 - 主要功能包括解析XML文档,创建新的XML结构,修改现有XML文档,以及XPath查询。 - `Element`是dom4j的核心类,代表XML的...
这个压缩包文件“lo4j2”可能包含了配置文件“log4j2.xml”,它是Log4j2的核心配置,用于定义日志输出的方式、级别、格式等关键设置。下面我们将深入探讨Log4j2及其配置文件中的相关知识点。 1. **Log4j2概述**:...
在给定的“Lo4jTest”项目中,我们很可能看到一个完整的示例,演示了如何配置和使用Log4j将日志信息写入文件。下面我们将详细探讨Log4j及其相关知识点。 1. **日志的重要性**:在软件开发中,日志是调试、性能分析...
顶刊复现,基于Lyapunov的模型预测控制MPC方法,用于控制水下机器人AUV的路径跟踪问题trajectory tracking 具体的方法和建模过程可以参考文献 本代码包括水下机器人的fossen动力学模型,matlab的优化算法求解器,还包括非线性反步法backstepping 的对比代码非常划算,两种对比都有 ,顶刊复现; Lyapunov模型预测控制MPC; 水下机器人AUV路径跟踪; Fossen动力学模型; Matlab优化算法求解器; 非线性反步法backstepping对比,基于Lyapunov模型预测控制的水下机器人AUV路径跟踪方法对比研究
内容概要:本文由Seungri Song等人发表于期刊《光科学与应用》,主要介绍了新型计算三维极化敏感强度衍射断层扫描(PS-IDT),一种无需基准参考和惯性的基于矢量多切片束传播方法(MSBP)的3D成像新技术。这种方法利用明场显微镜附加LED环形阵列以及偏振组件即可完成多角度测量,实现3D琼斯矩阵重建并获得弱散射和多重散射样本的空间分布和光学各向异性的信息。文章不仅描述了实验装置、数据获取流程、重建步骤以及自我校准程序,还展示了对多种样品的成功测试,如马铃薯淀粉粒、小球藻和水熊虫,进一步验证了这一成像方式的应用前景和技术优势。 适用人群:光学工程研究人员、材料科学家及相关领域的学者与专业人士。 使用场景及目标:PS-IDT特别适合透明的微观结构,特别是那些存在复杂的光学特性并且可能引发多次散射现象的情况;旨在为生物医学研究提供高分辨率无损成像工具。此外它也可以扩展应用于需要精确表征物质内部结构特征的研究任务。 其他说明:目前该平台存在采集时间长的问题。未来发展方向可以考虑提高光源利用率来减少曝光时长以加快成像速度。与此同时,还可以探索将深度学习算法整合进重建过程中从而提升效率而不降
实验环境安装及其它介绍.html.zip
档位档位多
鸡骨白汤W-5001检验表格(食品添加剂食用香精质量验收记录表).docx
【机器人项目】飞行器与机器人通用控制体系项目集合-chy5.zip,整合了飞行器与机器人共用的控制体系,涵盖核心算法、硬件接口及通信协议。项目旨在实现跨平台的高效控制,适用于多种应用场景,提升系统兼容性与开发效率。
基于STM32的直流电机加减速正反转控制串口输出控制系统(P 1100009-基于STM32的直流电机加减速正反转控制串口输出控制系统(PCB 原理图 报告 源代码 proteus lcd1602) 功能描述:基于STM32平台 1、实现了电机控制正转、反转的功能 2、实现了电机控制加速、减速的功能 3、实现了串口输出控制信息的功能 4、串口可以模拟WIFI 蓝牙 RS232 等带有串口的功能。 资料包含: 1、源代码工程文件 2、仿真工程文件 3、lunwen报告1W字以上 4、原理图工程文件 5、PCB工程文件 ,核心关键词:STM32、直流电机、加减速、正反转控制、串口输出、控制信息、WIFI、蓝牙、RS232、源代码工程文件、仿真工程文件、原理图工程文件、PCB工程文件。,基于STM32的电机串口控制综合系统(含正反转、加减速及多种串口通信功能)
内容概要:本文探讨了高吞吐量网络链路异常检测中流量采样技术的应用及其效果。面对现代分布式信息系统频繁遭受的网络安全威胁,特别是互联网服务提供商(ISP)面临的威胁,作者提出一种通过减少数据采样频率以降低异常检测计算复杂度的方法。文中介绍了实验环境、系统架构、采用的数据聚合与采样方法以及用于检测异常的人工智能模型(基于自编码器神经网络)。通过对一个真实中型ISP生产环境中实际网络流量数据进行研究,该研究展示了即使在较低采样频率情况下仍能保持较高的异常检测准确性,尤其是针对持续时间较长的DDoS攻击更为显著。此外,论文还验证了所提系统的有效性和应用潜力,为构建高效的网络安全监控机制提供了新思路。 适用人群:对于计算机网络安全、数据分析或机器学习有兴趣的研究人员和从业人员,特别是那些专注于提高异常检测性能和应对高流量数据流的技术人员。 使用场景及目标:适用于希望在不影响业务操作的前提下引入额外层次防护措施的企业级网络管理员;研究者可参考本文中提出的流量预处理方式来探索不同的统计分布和采样间隔设置;企业可以通过部署该类系统快速响应潜在的安全事件并降低成本。
该项目是个人实践项目,答辩评审分达到90分,代码都经过调试测试,确保可以运行!,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载,欢迎沟通,互相学习,共同进步!提供答疑!
在电子设计领域,尤其是模拟电路设计中,电子管起着至关重要的作用。这些古老的设备,尽管在现代数字电路中已不常见,但在某些特定的应用,如音频放大器、复古音响设备以及某些高功率射频系统中,电子管仍然占据主导地位。Altium Designer是一款广泛使用的电路设计软件,它提供了丰富的元器件库来支持各种设计需求,包括电子管。 标题"常用电子管原理图封装库(AD库)"指的是这个压缩包中包含了一系列常用电子管的原理图封装,适用于Altium Designer平台。这些封装是设计师在绘制电路原理图时需要用到的图形符号,它们精确地表示了电子管的引脚布局和电气特性,使得设计者能够直观地理解并连接各个元器件。 描述中的"6L,6S,12AU,5879,7199"列举了一些具体的电子管类型。这些型号分别代表了不同种类和用途的电子管。例如: - 6L和6S:这可能是对6系列电子管的泛称,6系列通常包含多种小型玻璃外壳的双三极管,用于音频放大和振荡电路。 - 12AU:这是一个常见的五脚功率放大管,常用于音频功放电路中,其内部结构可能包括一个控制栅极、两个屏极和两个阴极。 - 5879:这是一种九脚的电子管,常被用作音频功率放大器,具有较高的输出功率。 - 7199:这是一种特殊的高压大功率电子管,多用于雷达、工业设备或实验设备中。 ".SchLib"格式是Altium Designer的原理图库文件格式,这些封装库文件可以方便地导入到项目中,为设计者提供了一站式的电子管元器件选择,无需自己创建每个电子管的封装。 压缩包中的"4.5 - 电子管.SchLib"文件,很可能包含了上述所有电子管的封装,设计者可以通过Altium Designer打开并使用这些封装,直接拖放到原理图中,大大提高了设计效率和准确性。在使用时,设计师需要确保选择的封装与实际将要使用的电子管型号相符,以保证设计的电路能够正确地工作。 总结起来,这个"常用电子管原理图封装库(AD库)"是Altium Designer用户进行电子管相关电路设计的重要资源,它提供了多种常见电子管的封装,方便设计师快速绘制原理图,提高设计流程的效率。对于那些热衷于模拟电路和复古电子设备的人来说,这样的库是不可或缺的工具。。内容来源于网络分享,如有侵权请联系我删除。
《电力电子技术(第5版)》_王兆安_逆变电路
Matlab代码模拟枝晶生长可视化界面 ,Matlab; 枝晶生长; 代码模拟; 可视化界面; 生长过程模拟,Matlab模拟枝晶生长可视化界面
PFC5.02D煤层开挖案例代码,分步开挖,采用分步开挖 ,PFC5.02D;煤层开挖;分步开挖;案例代码,PFC5.0煤层分步开挖案例代码
系统采用B/S架构,集成Spring Boot(后端)、Vue.js(前端)和MySQL(数据库),通过RESTful API实现前后端分离。采用MyBatis-Plus优化数据访问,模块化设计与自动配置提升开发效率,结合数据库索引和读写分离确保性能,Element UI提供友好交互,整体具备高扩展性和可维护性。
花椒油检验表格(食品企业原辅料质量验收记录表).docx
系统采用B/S架构,集成Spring Boot(后端)、Vue.js(前端)和MySQL(数据库),通过RESTful API实现前后端分离。采用MyBatis-Plus优化数据访问,模块化设计与自动配置提升开发效率,结合数据库索引和读写分离确保性能,Element UI提供友好交互,整体具备高扩展性和可维护性。
基于adaline神经网络永磁同步电机多参数辨识 基于adaline神经网络永磁同步电机多参数辨识 1、利用adaline神经网络在线对电阻、电感和磁链进行辨识 ; 2、Adaline 算法本身具有自适应滤波的能力,保证输出辨识结果具有光滑理想的收敛曲线; 3、将Adaline与RLS对比,更能凸显神经网络的辨识优点; ,基于Adaline神经网络;永磁同步电机;多参数辨识;在线辨识;自适应滤波;输出收敛;Adaline算法与RLS对比,基于Adaline神经网络的永磁同步电机多参数辨识研究