玩转log4j
由于最近正在扩展卫生局考务系统,由于上一次使用过一次该系统后,发现很多考生最后出现说已打印报名表但却在数据库中不到她的报名记录;
因此为了以后有依据,将所有用户的操作日志文件写入数据供管理员查询成为了这次扩张项目的一个内容;
这里我决定使用的log4j日志文件,在多次的使用中感觉这个很不错;
首先我们要使用log4j日志文件时,我们需将两个必须的包放入lib目录下:log4j.XX.jar和commons-logging.XX.jar;
然后在classpath目录下(IDE中即为项目下的src目录下)新建一个日志文件,统一命名为:log4j.properties;
1.需求一:只需要满足存储数据库:
a.以下我们一ms sql 2000为例:首先在数据库中建一个用来存储日志的数据库命名为operate_log;字段如下:
b.数据库成功建立后,就可以去配置日志文件log4j.properties,代码如下:
log4j.properties
>>>>####
# JDBC Appender
>>>>###
#log4j.logger.business=INFO,db
#log4j.appender.ammons.MyJDBCAppender
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.driver=net.sourceforge.jtds.jdbc.Driver
log4j.appender.db.URL=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=infor_manage
#enter
log4j.appender.db.user=sa
log4j.appender.db.password=123
log4j.appender.db.sql=insert into
operate_log(class,method,createtime,loglevel,logmsg,user_id,user_type) values
('%C','%M','%d{yyyy-MM-dd HH\:mm\:ss}','%p','%m','1',1)
log4j.appender.db.layout=org.apache.log4j.PatternLayout
上面的配置就是最精简的将日志内容直接存储进入数据库
下面来稍微解释:
##Logger = [ level ] , appenderName1, appenderName2, …
##level : 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、##WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志##信息将不被打印出来。
##appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
##例如:Logger=info,A1,B2,C3 配置了3个输出地方,这个名字可以任意(如上面的db),但必须与我们在后面进行的设置名字对应;
然后下面就是进行数据库连接的配置,log4j是使用jdbc进行连接的,该封转的类就是log4j包下的
org.apache.log4j.jdbc.JDBCAppender,大家对jdbc了解的话上面的内容应该是很简单的;
这里要注意的就是:1.记得把数据库连接的相关包放到lib目录下,2.在写连接数据库的信息时如user等注意后面不要有空格,否则就不能连上数据库
c.日志文件配置完成后,我们就可以进行测试了,我们可以随便在后台写一个类:
package xidian.sl.action.admin;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger log = Logger(HelloWorld.class);//日志文件
public static void main(String[] args) {
<("访问了HelloWorld");
log.warn("访问了HelloWorld");
log.info("访问了HelloWorld");
log.debug("访问了HelloWorld");
}
}
然后右键运行,如果没有报错的话应该是成功了,可以去数据库看看:
log4j与log4j2
可以看到日志信息已经进行了存储,但发现只有三条,少了debug,对了,由于我们进行了日志优先级的配置:
到这里我们可以说基本成功了,但还远远不能满足我的需求:
我们发现数据库中出现了很多的日志信息,这个日志信息应该是启动等,从系统文件(spring等)中打
印的,但这个其实不是我们需要的,或者说我们需要将其分开:
我们重新进行日志文件的配置
log4j.properties
log4j.logger.xidian=INFO,db
=WARN, A1
log4j.logger =WARN, A2
#stdout\u5e94\u7528\u4e8e\u63a7\u5236\u53f0
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c\:%L) - %m%n
#A1\u5e94\u7528\u4e8e\u6587\u4ef6\u56de\u6eda
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.File=${}/WEB-INF/logs/org.log
log4j.appender.A1.MaxFileSize=500KB
log4j.appender.A1.MaxBackupIndex=50
log4j.appender.A1.Append=true
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] [%C{1}] - %m%n
#A2\u5e94\u7528\u4e8e\u6587\u4ef6\u56de\u6eda
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=${}/WEB-INF/logs/com.log
log4j.appender.A2.MaxFileSize=500KB
log4j.appender.A2.MaxBackupIndex=50
log4j.appender.A2.Append=true
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] [%C{1}] - %m%n >>>>####
# JDBC Appender
>>>>###
#log4j.logger.business=INFO,db
#log4j.appender.ammons.MyJDBCAppender
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.driver=net.sourceforge.jtds.jdbc.Driver
log4j.appender.db.URL=jdbc:jtds:sqlserver://localhost:9433;DatabaseName=infor_manage
#enter
log4j.appender.db.user=sa
log4j.appender.db.password=123@sports
log4j.appender.db.sql=insert into
operate_log(class,method,createtime,loglevel,logmsg,user_id,user_type) values
('%C','%M','%d{yyyy-MM-dd HH\:mm\:ss}','%p','%m','1',1)
log4j.appender.db.layout=org.apache.log4j.PatternLayout
这次的配置要复杂点
log4j.logger.xidian=INFO,db
=WARN, A1
log4j.logger =WARN, A2
这个配置就是将不同的包下的信息输出到不同的文件中,根据下面的配置可知以xidian开头的包下的java文件的日志信息时进行数据库存储的,而org与com包开头的日志信息是输出到文件中,文件的输出地址是
${}/WEB-INF/logs/org.log即项目的WEB-INF目录下的logs文件夹中,为了得到${}我们还需要到l文件中进行配置:
<!--由Sprng载入的Log4j配置文件位置-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!--Spring log4j Config listener-->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
这样我们再次运行HelloWorld程序
查看数据库(很干净了,哈哈):
然后在到WEB-INF目录下的logs文件夹中查看输出的日志文件:
由于我们在根Logger下也进行了配置:这个根Logger的配置是对所有日志操作都是有作用的
#stdout\u5e94\u7528\u4e8e\u63a7\u5236\u53f0
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c\:%L) - %m%n
这个配置是进行控制太的输出,因此我们在控制台中也会发现有输出:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
到此为止我们日志的基本操作都应该掌握了,但我还有一个需求没有满足,就是我一开始数据库字段的设计中还包含了两个字段:
这两个字段是存储用户的id和用户类型的,以便我们在后面日志的核查中能正确的出用户信息;但这里就有一个问题了我们就靠上面的操作还是不能将用户信息得到的,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论