javaWeb 使用log4j 记录系统日志 (记录保存到数据库)
问题:项目中要求将登陆用户进行的操作保存到数据库,以供查询等。经过了解以及网上查询,决定使用log4j日志文件。
使用步骤:
一:在lib目录下,导出使用log4j 日志文件要使用的jar包; 在classpath目录下(即:项目的src目录下),新建一个日志文件,统一命名为:log4j.properties;
二:根据数据库中的字段,在上面新建的日志文件中,进行参数配置;
1、当数据库中的字段没有登录者的相关信息如:userId、userName时,日志文件中的配置如下:
#level log4j建议使用4个级别,优先级从高到低是:ERROR、WARN、INFO、DEBUG
log4j.rootLogger=WARN,DATABASE
#log4j.addivity.org.apache=true
#用于数据库(MySql数据库)
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://172.16.1.223:3306/lgisp?characterEncoding=utf8
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=lgisp123\#log4j.appender.DATABASE.sql= INSERT INTO lgisp_config_log(LOG_LEVEL,LOG_TYPE,OPERATE_NAME,OPERATE_TIME,OPERATE_DES) VALUES('%p','%p','%c','%d{yyyy-MM-dd HH:mm:ss}','%m')
2、当数据库中的字段涉及到登录者的相关信息时,这时,我们要使用log4j 为我们提供的MDC(MDC是log4j中非常有用的类,用于存储应用程序中的上下文信息 context information,从而可以在log中使用这些上下文信息。MDC内部使用了类似Map 的机制来存储信息,上下文信息也是每个线程独立的存储,所不同的是信息都是以它们的key值存储在map 中,相对应的方法是:MDC.put(key,value);MDC.remove(key);MDC.get(key);在配置PatternLayout时,使用::%x{key}来输出对应的value。)
在程序中适合的位置,我们可以使用log4j的MDC保存登录者的相关信息:
MDC.put("userId", DEFAULT_USERID); MDC.put("userName",DEFAULT_Name );
然后:把日志文件中的:log4j.appender.DATABASE.sql语句 写成:log4j.appender.DATABASE.sql= INSERT INTO lgisp_config_log(LOG_LEVEL,LOG_TYPE,OPERATE_NAME,OPERATE_TIME,OPERATE_ENDTIME,OPERATE_USER_ID,OPERATE_USER_NAME,OPERATE_DES) VALUES('%p','%p','%c','%d{yyyy-MM-dd HH:mm:ss}','%d{yyyy-MM-dd HH:mm:ss}','%X{userId}','%X{userName}','%m')
注:log4j日志文件中输出格式控制:PatternLayout参数含义(引用http://logging.apache.org/log4j/2.x/manual/layouts.html)
%m 输出代码中指定的消息
%p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r输出自应用启动到输出该log信息耗费的毫秒数
%c输出所属的类目,通常就是所在类的全名
%t输出产生该日志事件的线程名
%n输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyyMMMddHH:mm:ss,SSS},输出类似:2002年10月18日22:10:28,921
%l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。