log4j日志写入数据库

时间:2021-12-11 21:48:43
正在学习log4j,希望大家耐心看一下,提示错误了,但为什么没有写进数据库中,大家有什么看法都可以讲讲
我用log4j写入文件都正常,但写入数据库老是失败
大家看我有配置文件有什么问题,希望大家
jdbc.properties

#log4j.logger.bookstoreLogger=ERROR,db
#定义一个名字为db的Appender,它的类型是JDBCAppender。
#log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
#指定MySQL数据库的JDBC驱动。
#log4j.appender.db.driver=com.mysql.jdbc.Driver
#指定数据库连接的URL。
#log4j.appender.db.URL=jdbc:mysql://localhost:3306/bookstore
#指定连接数据库的用户名。
#log4j.appender.db.user=root
#指定连接数据库的用户密码。
#log4j.appender.db.password=123456
#指定被log4j执行的插入日志信息的SQL语句。
#log4j使用为这个Appender指定的Layout,依次用实际的值来替换SQL语句中的模式匹配。
#log4j.appender.db.sql=insert into logs(log_date,log_logger,log_level,log_msg) values('%d', '%c', '%p', '%m')
#db Appender使用的Layout的是PatternLayout。
#log4j.appender.db.layout=org.apache.log4j.PatternLayout

java文件
package org.sunxin.lesson.jsp.ch21;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.log4j.*;

public class DBExceptionServlet extends HttpServlet
{

    static Logger logger=Logger.getRootLogger();
    static Logger bookLogger=Logger.getLogger("bookstoreLogger");
    
   public void init() throws ServletException
    {
        String prefix=getServletContext().getRealPath("/");
        String file=getInitParameter("log4j-init-file"); 
System.out.println("success1!");
System.out.println(prefix);
System.out.println(file);
        if(file != null)
        {
            PropertyConfigurator.configure(prefix+file);
System.out.println("success2!");
        }

        try
        {
            Class.forName("com.mysql.jdbc.Driver");
System.out.println("success3!");
            
        }
        catch(ClassNotFoundException ce)
        {
            throw new UnavailableException("加载数据库驱动失败!");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
               throws ServletException,IOException
    {   


        Connection conn=null;
        Statement stmt=null;
        try
        {
System.out.println("success4!");
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore","root1","123456");
            stmt=conn.createStatement();
System.out.println("success5!");
//stmt.executeUpdate("insert into bookinfo values(1,'JSP深入编程','李四','李四出版社','2004-10-1',56.00,20,null)");
System.out.println("success6!");
        }
        catch(SQLException se)
        {  System.out.println("success7!"); 
            logger.error("数据库操作失败! "+se);
System.out.println("success8!"); 
                       
            bookLogger.error("数据库操作失败! "+se); 
System.out.println("success9!"); 

            resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                        "数据库操作出现问题,请联系管理员。");
        }
        finally
        {
            if(stmt!=null)
            {
                try
                {
                    stmt.close();
                }
                catch(SQLException se)
                {
                    bookLogger.error("关闭Statement失败!",se);
                }
                stmt=null;
            }
            if(conn!=null)
            {
                try
                {
                    conn.close();
                }
                catch(SQLException se)
                {
                    bookLogger.error("关闭数据库连接失败!",se);
                }
                conn=null;
            }
        }
    }
}

说明用户为root我故意写成root1造成错误
tomact错误提示在success8!与success9!之间
success8!
log4j:ERROR Failed to excute sql
com.mysql.jdbc.exceptionl.jdbc4..........for the right syntax to use near 'root1'@'localhost' <using password:YES>'>'at line 1
  at ....
.....
ERROR - 数据库操作失败!java.slq.SQLException:Access dnied for user 'root1'@'localhost'<useing password:YES>

13 个解决方案

#1


连接数据库的用户名不是错了么?
都连接不上数据库
还谈什么插入日志记录?

#2


配置文件中的是对的,log4j用是的配置文件中信息
就是让java程序出错,然后把出错信息插入数据库中

#3


说的不是很清楚,再解释一下

#4


log4j写的那个数据库能连接上吗?如果不能也插不进去

#5


//stmt.executeUpdate("insert into bookinfo values(1,'JSP深入编程','李四','李四出版社','2004-10-1',56.00,20,null)"); 
程序看起来没有问题,我就看你这注释掉了,是不是执行的时候注释没有去掉,所以没有插入数据?

#6


Access dnied for user 
数据库没连上啊

#7


谢谢大家我找出错误的地方了,但是我想不通为什么会这样
就是这个地方:bookLogger.error("数据库操作失败! "+se); 
把+se去掉就正常了,但这样就没有意义了,我就是想让出错相关信息加入到数据库,

#8


引用 7 楼 emptyman163 的回复:
谢谢大家我找出错误的地方了,但是我想不通为什么会这样
就是这个地方:bookLogger.error("数据库操作失败! "+se);
把+se去掉就正常了,但这样就没有意义了,我就是想让出错相关信息加入到数据库,

你显示的调用se.toString()试下?

#9


up

#10


谢谢你,我知道原因了,se中有一些特殊符号'都,我没有处理,mysql插入时报错

#11


数据库没有连上

#12


刚看到谢谢指导!

#13


不会用log4j,学习

#1


连接数据库的用户名不是错了么?
都连接不上数据库
还谈什么插入日志记录?

#2


配置文件中的是对的,log4j用是的配置文件中信息
就是让java程序出错,然后把出错信息插入数据库中

#3


说的不是很清楚,再解释一下

#4


log4j写的那个数据库能连接上吗?如果不能也插不进去

#5


//stmt.executeUpdate("insert into bookinfo values(1,'JSP深入编程','李四','李四出版社','2004-10-1',56.00,20,null)"); 
程序看起来没有问题,我就看你这注释掉了,是不是执行的时候注释没有去掉,所以没有插入数据?

#6


Access dnied for user 
数据库没连上啊

#7


谢谢大家我找出错误的地方了,但是我想不通为什么会这样
就是这个地方:bookLogger.error("数据库操作失败! "+se); 
把+se去掉就正常了,但这样就没有意义了,我就是想让出错相关信息加入到数据库,

#8


引用 7 楼 emptyman163 的回复:
谢谢大家我找出错误的地方了,但是我想不通为什么会这样
就是这个地方:bookLogger.error("数据库操作失败! "+se);
把+se去掉就正常了,但这样就没有意义了,我就是想让出错相关信息加入到数据库,

你显示的调用se.toString()试下?

#9


up

#10


谢谢你,我知道原因了,se中有一些特殊符号'都,我没有处理,mysql插入时报错

#11


数据库没有连上

#12


刚看到谢谢指导!

#13


不会用log4j,学习