【问题标题】:Regarding logging and error messaging in web app关于 Web 应用程序中的日志记录和错误消息
【发布时间】:2012-08-07 11:03:28
【问题描述】:

我正在使用 Servlet/JSP 开发一个演示应用程序,并使用来自 http://logging.apache.org/log4j/1.2/ 的名为 log4j 的 apache 使用日志记录 JAR

我的问题与在哪里使用日志记录有关。有什么最佳做法吗?

1 - 应该在 try/catch 中记录错误消息并抛出异常。请看下面的例子?

2 - 应该在我们需要使用 System.out.println("message") 进行调试或打印信息的地方使用它吗?

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);
        }

【问题讨论】:

    标签: jakarta-ee servlets logging


    【解决方案1】:

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

    理想情况下,您不应在 Web 应用程序的任何地方使用 System.out.println("message"),而应仅使用记录器,例如 log4j。

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

      if(log.isErrorEnabled()) { log.error("错误信息"); }

    2. 用于调试应用或在日志中打印一些开发信息的语句可以写成:

      if(log.isDebugEnabled()) { log.debug("调试信息"); }

    if(log.isInfoEnabled()) {
       log.info("debug message");
    }
    

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

    例如,

    如果日志级别为 DEBUG -> 调试、信息和错误消息将记录在日志文件中。

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

    如果日志记录级别为 ERROR -> 日志文件中只会记录错误消息(没有调试或信息消息)。

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

    Log4j 比我上面写的更强大和有用。 更多详情请参考Log4j manual

    【讨论】:

    • 谢谢。我有属性文件但无法设置优先级。请在此处粘贴用于记录级别的属性文件中的行。
    • 可以在 log4j.properties 中使用以下行设置日志记录级别: # Root logger option 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.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1} :%L - %m%n 这个文件的好例子可以在这里找到 - (mkyong.com/logging/log4j-log4j-properties-examples)
    猜你喜欢
    • 2023-04-10
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2016-03-24
    相关资源
    最近更新 更多