Jakarta ee 关于web应用中的日志记录和错误消息

Jakarta ee 关于web应用中的日志记录和错误消息,jakarta-ee,servlets,logging,Jakarta Ee,Servlets,Logging,我正在使用Servlet/JSP开发一个演示应用程序,并使用apache开发的名为log4j的日志JAR 我的问题与在哪里使用日志有关。任何最佳做法。? try{ con = ConnectionManager.getConnection(); ps = prepareStatement(con, SQL_DELETE, false, values); int affectedRows = ps.executeUpdate(

我正在使用Servlet/JSP开发一个演示应用程序,并使用apache开发的名为log4j的日志JAR

我的问题与在哪里使用日志有关。任何最佳做法。?

try{
            con = ConnectionManager.getConnection();
            ps = prepareStatement(con, SQL_DELETE, false, values);
            int affectedRows = ps.executeUpdate();
            if(affectedRows == 0){
                log.error("delete: Deleting user failed, no rows affected");
                throw new DAOException("Deleting user failed, no rows affected.");
            }else{
                user.setId(null);
            }
        }catch(SQLException e){
            log.error("delete: " + e.getMessage());
            throw new DAOException(e);
        }finally{
            close(con, ps);
        }


try{
            Class.forName(DRIVER);

            try{
                Class.forName(DRIVER);
                log.info("Connecting database...");
                con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                log.info("Database connected!");

            }catch(SQLException ex){
                throw new RuntimeException("Cannot connect the database!", ex);
            }
        }catch(ClassNotFoundException e){
            log.error("Closing ResultSet failed: " + e.getMessage());
            System.exit(-1);
        }
1-应在try/catch中记录错误消息,并引发异常。见下面的例子

2-应该在需要使用System.out.println(“消息”)进行调试或打印信息的地方使用它吗

3-应该在生产中使用还是仅在开发中使用

如何在应用程序中使用它?

try{
            con = ConnectionManager.getConnection();
            ps = prepareStatement(con, SQL_DELETE, false, values);
            int affectedRows = ps.executeUpdate();
            if(affectedRows == 0){
                log.error("delete: Deleting user failed, no rows affected");
                throw new DAOException("Deleting user failed, no rows affected.");
            }else{
                user.setId(null);
            }
        }catch(SQLException e){
            log.error("delete: " + e.getMessage());
            throw new DAOException(e);
        }finally{
            close(con, ps);
        }


try{
            Class.forName(DRIVER);

            try{
                Class.forName(DRIVER);
                log.info("Connecting database...");
                con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                log.info("Database connected!");

            }catch(SQLException ex){
                throw new RuntimeException("Cannot connect the database!", ex);
            }
        }catch(ClassNotFoundException e){
            log.error("Closing ResultSet failed: " + e.getMessage());
            System.exit(-1);
        }
我是做对了还是产生了无用的信息?

try{
            con = ConnectionManager.getConnection();
            ps = prepareStatement(con, SQL_DELETE, false, values);
            int affectedRows = ps.executeUpdate();
            if(affectedRows == 0){
                log.error("delete: Deleting user failed, no rows affected");
                throw new DAOException("Deleting user failed, no rows affected.");
            }else{
                user.setId(null);
            }
        }catch(SQLException e){
            log.error("delete: " + e.getMessage());
            throw new DAOException(e);
        }finally{
            close(con, ps);
        }


try{
            Class.forName(DRIVER);

            try{
                Class.forName(DRIVER);
                log.info("Connecting database...");
                con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                log.info("Database connected!");

            }catch(SQLException ex){
                throw new RuntimeException("Cannot connect the database!", ex);
            }
        }catch(ClassNotFoundException e){
            log.error("Closing ResultSet failed: " + e.getMessage());
            System.exit(-1);
        }

记录器基本上用于捕获日志文件中的调试语句、信息或错误消息

理想情况下,您不应该在web应用程序的任何地方使用System.out.println(“消息”),而应该只使用Logger,比如log4j

  • 在try-catch块中捕获的所有错误消息都应记录为

    if(log.isErrorEnabled()){ 日志错误(“错误消息”); }

  • 用于调试应用程序或在日志中打印某些开发信息的语句可以写成:

    if(log.isDebugEnabled()){ 调试(“调试消息”); }

  • 一旦在代码中添加了上述格式的记录器, 您可以通过在Log4j配置(属性或XML文件)中设置日志记录级别,而无需重新编译源代码,从而在日志中打印它们

    比如说,

    如果日志级别为DEBUG->DEBUG,则信息和错误消息将记录在日志文件中

    如果日志记录级别为INFO->则日志文件中将只记录信息和错误消息(无调试消息)

    如果日志记录级别为ERROR->则日志文件中将只记录错误消息(无deebug或info消息)

    理想情况下,在生产中,我们将记录器级别设置为ERROR,在开发中,记录器级别设置为DEBUG或INFO

    Log4j比我上面写的功能更强大、更有用。
    有关更多详细信息,请参阅。

    记录器基本上用于捕获日志文件中的调试语句、信息或错误消息

    理想情况下,您不应该在web应用程序的任何地方使用System.out.println(“消息”),而应该只使用Logger,比如log4j

  • 在try-catch块中捕获的所有错误消息都应记录为

    if(log.isErrorEnabled()){ 日志错误(“错误消息”); }

  • 用于调试应用程序或在日志中打印某些开发信息的语句可以写成:

    if(log.isDebugEnabled()){ 调试(“调试消息”); }

  • 一旦在代码中添加了上述格式的记录器, 您可以通过在Log4j配置(属性或XML文件)中设置日志记录级别,而无需重新编译源代码,从而在日志中打印它们

    比如说,

    如果日志级别为DEBUG->DEBUG,则信息和错误消息将记录在日志文件中

    如果日志记录级别为INFO->则日志文件中将只记录信息和错误消息(无调试消息)

    如果日志记录级别为ERROR->则日志文件中将只记录错误消息(无deebug或info消息)

    理想情况下,在生产中,我们将记录器级别设置为ERROR,在开发中,记录器级别设置为DEBUG或INFO

    Log4j比我上面写的功能更强大、更有用。
    有关更多详细信息,请参阅。

    谢谢。我有属性文件,但无法设置优先级。请将属性文件中用于日志记录级别的行粘贴到此处。可以使用log4j.properties中的以下行设置日志记录级别:#根日志记录器选项log4j.rootLogger=INFO,stdout#将日志消息直接发送到stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}%5p%c{1}:%L-%m%n可以在这里找到此文件的好例子-()谢谢。我有属性文件,但无法设置优先级。请将属性文件中用于日志记录级别的行粘贴到此处。可以使用log4j.properties中的以下行设置日志记录级别:#根日志记录器选项log4j.rootLogger=INFO,stdout#将日志消息直接发送到stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.appender.stdout.layout.ConversionPattern=%d{绝对值}%5p%c{1}:%L-%m%n可以在这里找到此文件的好例子-()