- 浏览: 22974 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
wenshao:
你测试一下druid,比以上的都好的多
dbcp,c3p0,proxool三种数据库连接池比较(基于Oracle9i) -
mulangren1988:
楼主,有没有更详细的测试工具和实现骤啊?小菜这段时间正在学习, ...
dbcp,c3p0,proxool三种数据库连接池比较(基于Oracle9i) -
长安春雪:
<div class="quote_title ...
利用数据库对Log4j日志进行管理(可写入用户名) -
mwmw:
大致过了一下你的配置以及写法,我有以下建议,可能由于才疏学浅, ...
利用数据库对Log4j日志进行管理(可写入用户名)
LOG 4J 日志管理
——基于DBCP和Mysql
版本:V1.0
日期:2009-10-2
作者:孙欢欢(shh-cc@163.com)
目录
1.DBCP配置 2
1.1 准备 mysql 的 jdbc 驱动程序 2
1.2 安装 Tomcat 默认全部装在 D:\tomcat6.0 2
1.3 以 TOMCAT_HOME 代替个版本的安装目录 2
1.4 将 jdbc 驱动mysql-connector-java-5.0.8-bin.jar,和commons-dbcp.jar,commons-pool-1.4.jar放入 TOMCAT_HOME\ common\lib\ 下面 2
1.6 配置 tomcat 数据源时的各种参数的详细介绍 2
1.7 其他设置。 2
1.8 在server.xml<GlobalNamingResources> </GlobalNamingResources>之间添 2
1.9.在context.xml的 3
1.10 配置参数说明 3
2. Log4j 配置 8
2.1下载最新的Log4j.jar包,放到相关项目的Lib下,并添加进项目的Libraris. 8
2.2把log4j.properties文件放到项目的SRC根目录下 8
2.3 关于log4j.properties 8
2. 3. 1 log4j.rootLogger = [ level ] , appenderName, appenderName, … 8
2. 3. 2 日志输出方式appender(目的地) 8
2. 3. 3 日志信息的布局 10
2. 3. 4 日志格式控制 10
3 程序中使用 11
3.1 写一个获得数据库连接的工具类 11
3.2 继承JDBCAppender类 13
3.3 在程序中使用 test.jsp 15
1.DBCP配置
1.1 准备 mysql 的 jdbc 驱动程序
1.2 安装 Tomcat 默认全部装在 D:\tomcat6.0
1.3 以 TOMCAT_HOME 代替个版本的安装目录
1.4 将 jdbc 驱动mysql-connector-java-5.0.8-bin.jar,和commons-dbcp.jar,commons-pool-1.4.jar放入 TOMCAT_HOME\ common\lib\ 下面
1.5 如果是其他数据库的话,就是换一下 jdbc 驱动以及各种参数就可以了的
1.6 配置 tomcat 数据源时的各种参数的详细介绍
1.7 其他设置。
1.8 在server.xml<GlobalNamingResources> </GlobalNamingResources>之间添
<!--mysql DBCP-->
<Resource
name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306"
maxActive="50"
maxldle="10"
maxWait="5000"
username="root"
password="000000" />
1.9.在context.xml的
<Context></Context>之间添加
<ResourceLink
global="jdbc/TestDB"
name="jdbc/TestDB"
type="javax.sql.DataSource"/>
1.10 配置参数说明
Username JDBC驱动建立连接时所需的用户名。
Password JDBC驱动建立连接时所需的用户密码。
url JDBC驱动建立连接时的连接地址。
driverClassName 使用的JDBC驱动完整JAVA类名。
connectionProperties JDBC驱动建立连接时附带的连接属性
属性的格式必须为这样:[属性名=property;] *
注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
defaultAutoCommit true 指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultReadOnly driver default指定由连接池所创建的连接的只读(read-only)状态。如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultTransactionIsolation
driver default
指定由连接池所创建的连接的事务级别(TransactionIsolation)。可用值为下列之一:(详情可见javadoc。)
NONE
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
defaultCatalog
指定由连接池所创建的连接的默认日志。
initialSize 0初始化连接池时创建的连接数。
此版后开始提供:1.2
maxActive 8连接池允许的最大并发连接数,值为非正数时表示不限制。
maxIdle 8连接池中的最大空闲连接数,超过此数值时多余的空闲连接将会被释放,值为负数时表示不限制。
minIdle 0连接池中的最小空闲连接数,低于此数值时将会创建所欠缺的连接,值为0时表示不创建。
maxWait indefinitely以毫秒表示的当连接池中没有可用连接时等待可用连接返回的时间,超时则抛出异常,值为-1时无限期等待。
validationQuery 在连接返回给调用者前用于校验连接是否有效的SQL语句。如果指定了SQL语句,则必须为一个“SELECT”语句,且至少会返回一行结果。
testOnBorrow true
指定连接被调用时是否经过校验。如果校验未通过,则该连接被连接池断掉,并由连接池尝试调用另一个连接。
注意:要想值为true时该设置生效,则validationQuery参数必须为一个非空字串。
testOnReturn false
指定连接返回到池中时是否经过校验。
注意:要想值为true时该设置生效,则validationQuery参数必须为一个非空字串。
testWhileIdle false
指定连接进入空闲状态时是否经过空闲对象驱逐进程的校验(如果存在空闲对象驱逐进程)。如果校验未通过,则该连接被连接池断掉。
注意:要想值为true时该设置生效,则validationQuery参数必须为一个非空字串。
timeBetweenEvictionRunsMillis -1
以毫秒表示的空闲对象驱逐进程由运行状态进入休眠状态的数值。值为非正数时表示不运行任何空闲对象驱逐进程。
numTestsPerEvictionRun 3
连接池检查每个空闲对象驱逐进程的对象数量(如果存在空闲对象驱逐进程)。
minEvictableIdleTimeMillis 1000 * 60 * 30
以毫秒表示的连接被空闲对象驱逐进程驱逐前在池中保持空闲状态的最小时间(如果存在空闲对象驱逐进程)。
poolPreparedStatements false
启用“PreparedStatements”缓存池。
maxOpenPreparedStatements unlimited
由“PreparedStatements”缓存池中取得“PreparedStatements”的最大并发数值,值为0时表示不限制。此组件也有能力对“PreparedStatements”对象进行缓存。当启用了“PreparedStatements”缓存池时,每个连接通过下列方法建立的“PreparedStatements”对象都会被放入缓存池:
public PreparedStatement prepareStatement(String sql)
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
注意:请保证你的连接有剩余的资源为给其他语句。
accessToUnderlyingConnectionAllowed false
控制是否允许“PoolGuard”优先使用连接。启用此项后,你可以按照下列方法优先使用连接:
Connection conn = ds.getConnection();
Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();
...
conn.close()默认为“false”,这是一个具有潜在威胁的选项,不当的程序可能会做出可怕的事情来(在关闭优先连接或当被守护的连接已经关闭后继续使用优先连接的时候)。小心并且尽量只在当你需要直接驱动指定的扩展时使用。
注意:不要关闭优先连接,它只有一个。
removeAbandoned false
是否清除已经超过“removeAbandonedTimout”设置的无效连接。
如果值为“true”则超过“removeAbandonedTimout”设置的无效连接将会被清除。设置此属性可以从那些没有合适关闭连接的程序中恢复数据库的连接。
removeAbandonedTimeout 300 以秒表示的清除无效连接的时限。
logAbandoned false
当清除无效连接时是否在日志中记录清除信息的标志。
记录无效的语句和连接,并附加每个连接开启或新建一个语句的系统开销。
如果你启用了“removeAbandoned”,可能会导致被设为无效的连接被连接池回收。这个机制将会在满足下列两个条件时启动:(getNumIdle() < 2) 和 (getNumActive() > getMaxActive() - 3)
例如:假设maxActive=20,而当前已经拥有18个活动连接,1个空闲连接,“removeAbandoned”机制将会启动。 但是只有在活动连接没有使用的时长超过“removeAbandonedTimeout”(默认为300秒)的连接被清除。在遍历结果集时,所使用的连接不会被标为活动连接。
2. Log4j 配置
2.1下载最新的Log4j.jar包,放到相关项目的Lib下,并添加进项目的Libraris.
2.2把log4j.properties文件放到项目的SRC根目录下
2.3 关于log4j.properties
2. 3. 1 log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
2. 3. 2 日志输出方式appender(目的地)
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.'yyyy-MM: 每月
2)’.'yyyy-ww: 每周
3)’.'yyyy-MM-dd: 每天
4)’.'yyyy-MM-dd-a: 每天两次
5)’.'yyyy-MM-dd-HH: 每小时
6)’.'yyyy-MM-dd-HH-mm: 每分钟
(4).RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
2. 3. 3 日志信息的布局
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
2. 3. 4 日志格式控制
在配置文件中可以通过log4j.appender.A1.layout.ConversionPattern设置日志输出格式。
参数:
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
3.程序中使用
3.1 写一个获得数据库连接的工具类
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; /**
* @projectName Log4jTest
* @package Log4jTest
* @fileName DBPool.java
* @author 孙欢欢
* @date 2009-9-30
* @version 1.0
* @description 通过从数据库连接池获取连接和关闭连接
*/
public class DBPool {
private static DataSource ds = null;
private static Connection conn = null;
public static Connection getConnection() {
try {
if(conn==null){
ds = (DataSource) (new InitialContext())
.lookup("java:comp/env/jdbc/TestDB");
}
if (ds != null) {
conn = ds.getConnection();
}
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeConnection() {
try {
if (conn != null) {
conn.close();
conn=null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.2 继承JDBCAppender类
重写closeConnection,getConnection,getLogStatement,close四个方法:
package Log4jTest;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;
/**
* @projectName Log4jTest
* @package Log4jTest
* @fileName JDBCPoolAppender.java
* @author 孙欢欢
* @date 2009-9-30
* @version 1.0
* @description 为了能使用数据库连接池,必须继承JDBCAppender,并重写其closeConnection,getConnection,
* getLogStatement三个方法
*/
public class JDBCPoolAppender extends JDBCAppender {
@Override
public void closeConnection(Connection con) {
DBPool.closeConnection(con);
}
@Override
public Connection getConnection() throws SQLException {
if (connection == null) {
connection = DBPool.getConnection();
}
return connection;
}
@Override
public String getLogStatement(LoggingEvent event) {
StringBuffer sbuf = new StringBuffer();
sbuf.append(layout.format(event));
if (layout.ignoresThrowable()) {
sbuf.delete(sbuf.length() - 2, sbuf.length());
String[] s = event.getThrowableStrRep();
if (s != null) {
for (int j = 0; j < s.length; j++) {
sbuf.append("\r\n ");
sbuf.append(s[j]);
}
}
sbuf.append("')");
}
return sbuf.toString();
}
@Override
public void execute(String sql) throws SQLException {
Connection con = null;
Statement stmt = null;
String name = "张三";
System.out.println(sql);
int end = sql.lastIndexOf(")");
sql = sql.substring(0, end) + ",'" + name + "')";
System.out.println(sql);
try {
con = getConnection();
stmt = con.createStatement();
stmt.executeUpdate(sql);
} catch (SQLException e) {
if (stmt != null)
stmt.close();
throw e;
}
stmt.close();
//closeConnection(con);
}
3.3 在程序中使用 test.jsp
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class dfsdg extends HttpServlet {
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
Logger log=Logger.getLogger(getClass());
log.debug("测试log4j");
}
}
结果:
控制台日志:
DEBUG[PRIORITY]
[NDC]
http-80-1[thread] ndfsdg[CATEGORY]
测试log4j[MESSAGE]
数据库记录:
4. 附录:log4j.perporties
# Set log levels #
log4j.rootLogger = DEBUG, Console, LogFile,DATABASE
log4j.addivity.org.apache=true
# ??????
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#log4j.appender.Console.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.Console.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#?????
log4j.appender.LogFile=org.apache.log4j.FileAppender
log4j.appender.LogFile.File=file.log
log4j.appender.LogFile.Append=false
log4j.appender.LogFile.layout=org.apache.log4j.PatternLayout
log4j.appender.LogFile.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
# ???????
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log //????,??????${java.home}?rolling.log
log4j.appender.ROLLING_FILE.Append=true //true\:?? false\:??
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //??????
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //???
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#???socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# ???????
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# ?????
log4j.appender.DATABASE=Log4jTest.JDBCPoolAppender
#log4j.appender.DATABASE.URL=jdbc\:mysql\://localhost\:3306/test
#log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
#log4j.appender.DATABASE.user=root
#log4j.appender.DATABASE.password=000000
log4j.appender.DATABASE.sql = INSERT INTO dbcplog(occur_date,thread_name,cat,level,info,line,user) values('%d{yyyy-MM-dd HH:mm:ss}','%t','%c','%p','%m','%L',
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n %L
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH?.log4j?
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#???Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
- 对Log4j日志进行数据库管理.pdf (164 KB)
- 下载次数: 77
评论
2 楼
长安春雪
2009-10-14
mwmw 写道
大致过了一下你的配置以及写法,我有以下建议,可能由于才疏学浅,还望指教。
1. 你这个Appender不能去处理Business数据,因为他是跟Log4J一起启动的,启动很早,如果在这里面写上Business的东西很是不好,所以你仅仅是把原来写在文件里面的Log放到了数据库里。意义不大(如果权当是练习用的话还好)。
2. 其实你也不用继承那个Appender了吧,因为Log4J自己带的那个JDBCAppender也是能凑活着用的,只需要配置一下就好了吧。 (我自己的理解)
3. 如果你自己写Appender,建议这样写,
(1).建一个Queue,把Log都写到这个Queue里面
(2).启动一个Thread,让这个Thread去从Queue里面拿东西往数据库里面写
这样的话,可能性能会更好一点。
才疏学浅,还望指教。
1. 你这个Appender不能去处理Business数据,因为他是跟Log4J一起启动的,启动很早,如果在这里面写上Business的东西很是不好,所以你仅仅是把原来写在文件里面的Log放到了数据库里。意义不大(如果权当是练习用的话还好)。
2. 其实你也不用继承那个Appender了吧,因为Log4J自己带的那个JDBCAppender也是能凑活着用的,只需要配置一下就好了吧。 (我自己的理解)
3. 如果你自己写Appender,建议这样写,
(1).建一个Queue,把Log都写到这个Queue里面
(2).启动一个Thread,让这个Thread去从Queue里面拿东西往数据库里面写
这样的话,可能性能会更好一点。
才疏学浅,还望指教。
首先,说明一下这样做的原因:最近做一个项目,要求对log4j的日志进行管理,并且要记录是那个用户使用过程中产生的日志信息。看了一下log4j的API文档,文档里有这样一段话:
WARNING: This version of JDBCAppender is very likely to be completely replaced in the future. Moreoever, it does not log exceptions. The JDBCAppender provides for sending log events to a database.
Each append call adds to an ArrayList buffer. When the buffer is filled each log event is placed in a sql statement (configurable) and executed. BufferSize, db URL, User, & Password are configurable options in the standard log4j ways.
The setSql(String sql) sets the SQL statement to be used for logging -- this statement is sent to a PatternLayout (either created automaticly by the appender or added by the user). Therefore by default all the conversion patterns in PatternLayout can be used inside of the statement. (see the test cases for examples)
Overriding the getLogStatement(org.apache.log4j.spi.LoggingEvent) method allows more explicit control of the statement used for logging.
For use as a base class:
•Override getConnection() to pass any connection you want. Typically this is used to enable application wide connection pooling.
•Override closeConnection(Connection con) -- if you override getConnection make sure to implement closeConnection to handle the connection you generated. Typically this would return the connection to the pool it came from.
•Override getLogStatement(LoggingEvent event) to produce specialized or dynamic statements. The default uses the sql option value.
而且我的这个项目要用到Dbcp数据库连接池,故对原来的JDBCAppender继承,并重写了父类中的几个方法。
中而言之,这样做是项目需求决定的。
1 楼
mwmw
2009-10-13
大致过了一下你的配置以及写法,我有以下建议,可能由于才疏学浅,还望指教。
1. 你这个Appender不能去处理Business数据,因为他是跟Log4J一起启动的,启动很早,如果在这里面写上Business的东西很是不好,所以你仅仅是把原来写在文件里面的Log放到了数据库里。意义不大(如果权当是练习用的话还好)。
2. 其实你也不用继承那个Appender了吧,因为Log4J自己带的那个JDBCAppender也是能凑活着用的,只需要配置一下就好了吧。 (我自己的理解)
3. 如果你自己写Appender,建议这样写,
(1).建一个Queue,把Log都写到这个Queue里面
(2).启动一个Thread,让这个Thread去从Queue里面拿东西往数据库里面写
这样的话,可能性能会更好一点。
才疏学浅,还望指教。
1. 你这个Appender不能去处理Business数据,因为他是跟Log4J一起启动的,启动很早,如果在这里面写上Business的东西很是不好,所以你仅仅是把原来写在文件里面的Log放到了数据库里。意义不大(如果权当是练习用的话还好)。
2. 其实你也不用继承那个Appender了吧,因为Log4J自己带的那个JDBCAppender也是能凑活着用的,只需要配置一下就好了吧。 (我自己的理解)
3. 如果你自己写Appender,建议这样写,
(1).建一个Queue,把Log都写到这个Queue里面
(2).启动一个Thread,让这个Thread去从Queue里面拿东西往数据库里面写
这样的话,可能性能会更好一点。
才疏学浅,还望指教。
相关推荐
下面是一个简单的`log4j.properties`配置示例,用于将日志写入数据库: ``` log4j.rootLogger=DEBUG, DBAppender log4j.appender.DBAppender=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DBAppender.URL=...
在我们的示例中,我们关注的是如何配置Log4j2以将日志写入MySQL数据库。首先,我们需要在`log4j2.xml`配置文件中定义一个使用JDBC Appender的配置: ```xml <ConnectionFactory class="org.apache.logging....
要实现Log4j将日志写入数据库,我们需要以下关键组件: 1. **配置文件**:这是Log4j的核心,用于定义日志的输出行为。在`log4j.properties`或`log4j.xml`中,我们需要添加一个Appender(输出端点),指定其为数据库...
总结来说,Log4j写入数据库的配置涉及到创建适应的数据库表结构、配置`log4j.properties`文件以指定数据库连接信息和日志格式,并通过`JDBCAppender`将日志数据持久化到数据库中。这样的配置有助于收集和分析大量...
可以通过NuGet包管理器来安装Log4Net,或者手动添加对log4net.dll的引用。安装完成后,要在应用程序的配置文件(如web.config或app.config)中进行配置,设置日志输出级别、Appender(日志输出目的地)以及相关的...
### Log4j写入数据库详解 #### 一、Log4j简介 Log4j是一个流行的开源日志框架,由Apache Software Foundation开发维护。它提供了一种灵活的方式来控制日志的生成,使得日志的级别、格式以及输出目的地都可以在运行...
6. **性能考虑**:将日志写入数据库可能会对系统性能产生影响,因此需要合理配置日志级别,避免频繁的数据库操作。此外,可以使用异步方式写入日志,减少阻塞。 7. **日志审计与安全**:将日志存储在数据库中有利于...
- `log4j.appender.DATABASE.user=root`:数据库用户名。 - `log4j.appender.DATABASE.password=root`:数据库密码。 - `log4j.appender.DATABASE.sql=INSERT INTO LOG4J(Message) VALUES (...)`:SQL插入语句。 ...
本文将深入探讨Log4j的基本概念、配置方式以及如何将其配置来将日志信息写入数据库。 首先,我们来理解一下Log4j的核心概念。Log4j主要包括三个组件:Logger(日志器)、Appender(输出器)和Layout(布局)。...
在Java开发过程中,为了实现日志管理,我们通常会使用如log4j2这样的日志框架。Log4j2是一个强大的、灵活的日志系统,它提供了丰富的配置选项和高性能的日志记录能力。当我们的应用程序需要将日志信息存储在数据库中...
本文将深入探讨如何利用Log4j进行数据库、邮件以及HTML格式的日志记录。 一、数据库日志记录 Log4j允许我们直接将日志信息存储到数据库中,这对于需要长期保存和分析大量日志数据的系统来说尤其有用。首先,你需要...
Log4j 是一个 Java 语言下的日志记录工具库,它提供了灵活的日志记录机制,可以将日志信息写入到控制台、文件、数据库等多种目标中。在 Log4j 中,Appender 是一种输出目标,它负责将日志信息写入到指定的目标中。...
开发者可以通过在Java项目中引用这个jar,利用Log4j提供的API来实现各种日志记录功能,如控制台输出、文件写入、邮件发送等。 - **jdbc.properties**: 这可能是一个包含数据库连接信息的配置文件。在Java应用中,...
在Java应用程序中,log4j允许开发者定义多个日志级别(如DEBUG、INFO、WARN、ERROR等),并决定在何时何地将这些日志信息写入不同的输出目的地,如控制台、文件、电子邮件或者syslog服务器。这个压缩包中的log4j jar...
为了优化日志管理并避免文件过大,可以配置 Informatica Session 将错误日志写入数据库。这样不仅可以便于日志的管理和检索,还可以利用数据库的查询功能进行问题排查。在数据库中,Informatica 会自动创建四张表来...
通过Kiwi Syslog,用户可以轻松地实现对网络设备的日志信息进行集中管理和监控,从而提高网络的安全性和稳定性。 #### 二、Kiwi Syslog 日志导入 MySQL 数据库配置方法 ##### 2.1 安装与准备 1. **安装Kiwi ...
SQL日志清理是数据库管理中的一个重要环节,尤其是在大型系统中,日志文件的大小往往会对数据库性能产生显著影响。日志文件包含了大量的事务记录,这些记录对于数据恢复和审计至关重要,但随着时间的推移,未被清理...
11. log_line_prefix:日志记录格式,该参数记录为:时间、远程主机名或者 IP 地址,以及远端端口、用户名、数据库名。 12. log_connections:是否记录用户登录和注销情况,默认是关闭。 13. log_disconnections:...
本实例将详细介绍如何在C#环境下配置和使用Log4net进行日志管理,包括将日志写入数据库、自定义日志格式、指定日志存储路径等内容。 首先,我们需要在项目中引用Log4net库。这通常通过NuGet包管理器完成,搜索"Log4...
在Java中,最常用的日志库有Apache的Log4j、Java内置的java.util.logging(也称为JUL)和SLF4J(Simple Logging Facade for Java)。这些库允许开发者根据需要设置日志级别,选择不同的日志输出目的地,如控制台、...