Java中堆栈跟踪的可选打印

Java中堆栈跟踪的可选打印,java,exception-handling,Java,Exception Handling,我正在创建一个java应用程序,其中可能会抛出异常。我在try-catch块中处理这些异常,并打印适当的消息,以便业务用户在出现故障时不必看到丑陋的堆栈跟踪 但是现在当我调试时,我想调用JAR文件,这样它就可以为我打印堆栈跟踪,这样我就可以知道问题到底出在哪里了 有人能告诉我如何做到这一点吗?为什么不使用日志记录级别 调试您的技术错误 和信息或错误以及用户理解的业务代码。这类事情通常由日志记录器和不同的日志级别处理 您通常有3个日志级别:常规日志、警告和错误。 输出时,您可以决定消息的级别 当你

我正在创建一个java应用程序,其中可能会抛出异常。我在try-catch块中处理这些异常,并打印适当的消息,以便业务用户在出现故障时不必看到丑陋的堆栈跟踪

但是现在当我调试时,我想调用JAR文件,这样它就可以为我打印堆栈跟踪,这样我就可以知道问题到底出在哪里了


有人能告诉我如何做到这一点吗?

为什么不使用日志记录级别

调试您的技术错误
信息错误以及用户理解的业务代码。

这类事情通常由日志记录器和不同的日志级别处理

您通常有3个日志级别:常规日志、警告和错误。 输出时,您可以决定消息的级别

当你启动你的应用程序时,你要告诉你的Logger它应该显示哪个级别。
对于您的用户来说,这将是一个错误,只有最糟糕的事情应该是可见的,对于您自己来说,您将输出所有内容

在两个不同的位置创建两个具有相同包/名称的类

public class PrintStackTraceUtil
 {
 public static void printStackTrace(Throwable err)
     {
     //ignore
     }
 }

编译java程序时,在sourcepath中只放置其中一个路径,您可以将其用作facade,以便能够快速更改实现并用作日志记录的实现。slf4j和logback的结合是目前非常有效的测井系统。如果您想使用另一个实现,如log4j、jdk1.4或Jacarta Commons日志,您可以将实现(绑定)的jar更改为所需的jar。下面是关于如何使用带有logback的slf4j的快速用户手册

设置您的环境 首先,您应该导入使用slf4j所需的必要JAR

  • 转到并下载slf4j-1.7.0.zip
  • 提取slf4j-1.7.0.zip
  • 转到并下载logback-1.0.7.zip
  • 提取logback-1.0.7.zip
Eclipse指南

  • 在eclipse中转到您的项目并右键单击它。选择属性

  • 从左侧面板中选择Java构建路径

  • 选择库选项卡

  • 单击添加外部罐子

  • 找到提取的文件夹,从logback-1.0.7文件夹中添加logback-core-1.0.7.jarlogback-classic-1.0.7.jar,从slf4j-1.7.0文件夹中添加slf4j-api-1.7.0.jar。单击“确定”返回到项目

Netbeans指南

  • 在Netbeans中转到您的项目并右键单击它。选择属性

  • 从左侧面板中选择库

  • 选择编译选项卡

  • 单击添加Jar/文件夹

  • 找到提取的文件夹,从logback-1.0.7文件夹添加logback-core-1.0.7.jarlogback-classic-1.0.7.jar,从slf4j-1.7.0文件夹添加slf4j-api-1.7.0.jar。单击“确定”返回到项目

*如果您不使用上述任何环境,您应该在类路径中手动添加上述3个JAR。根据您的操作系统,需要遵循不同的过程


使用日志框架 首先,您应该导入所需的依赖项:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
要记录的每个类都应该有一个专用记录器:

private final Logger logger = (Logger) LoggerFactory.getLogger(this.getClass())
通过为每个类提供一个单独的记录器,您可以提供更大的灵活性并更容易地更改日志记录级别(警告、错误、信息、调试)

根据您应该使用的日志级别

logger.info("Your info message");

logger.error("Your error message");

logger.debug("Your debug message");

logger.warn("Your warn message");
还可以根据需要使用更复杂的方法调用。例如,如果您想调试并同时显示应该使用的stacktrace

logger.debug("Your debug message",e);
(e stands for a catched exception).
例如:

try{       
   //some code  
}catch (IOException e){
   logger.debug("An IOException was thrown at this method ",e);       
   logger.error("An IOException was thrown at this method ",e); 
}
*此时,在不添加任何其他配置的情况下,您就拥有了一个简单的日志系统。以防您需要更高级的配置 阅读我在下面发布的logback的高级设置


logback的高级设置 为了拥有更高级的日志记录系统,您应该创建一个包含所有日志记录配置的附加文件。对于这个示例,我将使用logback.xml。有关不同logback文件的更多信息,请参阅

此时,您应该创建一个名为resources的文件夹,并将其添加到项目的buildpath中

Eclipse指南

  • 创建名为resources的文件夹(必须在项目中看到该文件夹)

  • 在eclipse中转到您的项目并右键单击它。选择属性

  • 从左侧面板中选择Java构建路径

  • 选择选项卡

  • 单击添加文件夹

  • 勾选已创建的资源文件夹,然后单击“确定”。单击“确定”返回到项目

  • 此时,您应该将resources文件夹视为一个包

Netbeans指南

  • 创建名为resources的文件夹(它在项目视图中还不可见..仅在文件视图中)

  • 在Netbeans中转到您的项目并右键单击它。选择属性

  • 从左侧面板中选择

  • 在源程序包文件夹中,单击添加文件夹

  • 选择资源文件夹并单击确定

  • 您应该可以看到作为包创建的文件夹

*文件夹的名称
try{       
   //some code  
}catch (IOException e){
   logger.debug("An IOException was thrown at this method ",e);       
   logger.error("An IOException was thrown at this method ",e); 
}
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>   
    <encoder>
        <pattern>[%-5level] - %msg%n
        </pattern>
    </encoder>
</appender>


<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <append>false</append>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %class - %msg%n
        </pattern>
    </encoder>
    <File>log/log.txt</File>
</appender>


<logger name="org.test" level="INFO" additivity="false">
    <appender-ref ref="STDOUT" />
</logger>

<logger name="org.test" level="DEBUG" additivity="false">
    <appender-ref ref="FILE" />
</logger>

<root level="OFF">

</root>