在Java中可选地打印堆栈跟踪

aa8*_*a8y 7 java exception-handling

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

但是现在当我调试时,我想以这样的方式调用JAR文件,它将为我打印堆栈跟踪,以便我可以知道问题究竟在哪里.

有人可以告诉我如何实现这一目标吗?

Kon*_*tis 19

你可以使用SLF4J作为幌子,以便能够迅速地改变和实现的logback为您记录的实现.slf4j和logback的组合目前是一种非常有效的日志记录系统.如果您想使用另一个实现,例如log4j,JDK 1.4或Jacarta Commons日志记录,您只需将实现(绑定)的jar更改为您想要的.它遵循如何使用slf4j进行回写的快速用户手册.

设置你的环境

首先,您应该导入使用slf4j所需的必需jar.

Eclipse指南

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

  • 从左侧面板中选择Java Build Path

  • 选择" 库"选项卡

  • 单击" 添加外部JAR"

  • 找到解压缩的文件夹,并从logback-1.0.7文件夹添加logback-core-1.0.7.jar,logback-classic-1.0.7.jar,从slf4j-1.7.0添加slf4j-api-1.7.0.jar夹.单击"确定"返回项目.

Netbeans指南

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

  • 从左侧面板中选择Libraries

  • 选择" 编译"选项卡

  • 单击添加Jar /文件夹

  • 找到解压缩的文件夹,并从logback-1.0.7文件夹添加logback-core-1.0.7.jar,logback-classic-1.0.7.jar,从slf4j-1.7.0添加slf4j-api-1.7.0.jar 文件夹.单击"确定"返回项目.

*如果您没有使用上述任何环境,您应该手动在类路径中添加上述3个罐子.根据您的操作系统,有一个不同的程序可供遵循.


使用日志框架

首先,您应该导入所需的依赖项:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Run Code Online (Sandbox Code Playgroud)

您要记录的每个类都应该有一个私有记录器:

private final Logger logger = (Logger) LoggerFactory.getLogger(this.getClass())
Run Code Online (Sandbox Code Playgroud)

通过为每个类提供单独的记录器,您可以提供更大的灵活性并更轻松地更改日志记录级别(WARN,ERROR,INFO,DEBUG).

根据您想要使用的日志级别

logger.info("Your info message");

logger.error("Your error message");

logger.debug("Your debug message");

logger.warn("Your warn message");
Run Code Online (Sandbox Code Playgroud)

根据您的需要,还可以使用更复杂的方法调用.例如,如果您想调试并显示您应该使用的堆栈跟踪

logger.debug("Your debug message",e);
(e stands for a catched exception).
Run Code Online (Sandbox Code Playgroud)

例如:

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); 
}
Run Code Online (Sandbox Code Playgroud)

*此时不添加任何其他配置,您就拥有了一个简单的日志系统.如果您需要更高级的配置,请阅读我在下面发布的高级后备设置.


Logback的高级设置

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

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

Eclipse指南

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

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

  • 从左侧面板中选择Java Build Path

  • 选择Source选项卡

  • 单击添加文件夹

  • 勾选您已创建的资源文件夹,然后单击"确定".单击"确定"返回项目.

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

Netbeans指南

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

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

  • 从左侧面板中选择Sources

  • 在源包文件夹中,单击" 添加文件夹".

  • 选择 resources文件夹,然后单击"确定".

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

*文件夹的名称可以是您喜欢的任何名称.为方便起见,我将它命名为资源

以下内容适用于Eclipse和Netbeans.

*如果类路径中没有以下文件指定日志框架中的特定设置,则在DEBUG中自动分配根记录器级别.这意味着将记录所有日志记录级别.调试是更高级别.

  • 创建名为logback.xml的文件夹并将其放在resources文件夹中.
  • 在logback.xml里面放置以下标记.

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

上面的配置包含2个不同的appender,一个在控制台中,另一个在名为log.txt的文件中.该文件将放在名为log的文件夹中.如果文件夹日志不存在,将自动创建.

您将要使用的模式取决于您以及您的消息的信息量.在当前配置中,控制台appender描述性较差,仅显示日志记录级别和消息,与包含日志记录级别,线程名称,类名称,时间和消息的文件appender相比较.值append设置为false,以便在每次运行应用程序后创建新的日志文件.

上述配置对同一个包使用2个不同的记录器.第一个记录器仅在控制台中打印信息消息,第二个记录器将调试消息打印到文件中.这是通过使用放置在appender内部的过滤器来实现的.

*在记录器名称中,您可以拥有类的完全限定名称或包名称.在这种情况下,我假设包结构org.test并将类放在此包中.如果您具有该类的完全限定名称,则日志记录配置将仅应用于此类.如果您使用包名称,此包中的所有类将遵循上述配置.

使用appender和logger有许多不同的方法,这取决于您的需求和程序的复杂性.根据您描述的情况,我相信上述解决方案可以满足您的需求.

PS有关更具描述性的定义和更高级的配置,请参阅Logback手册


Aja*_*rge 13

为什么不使用记录级别.

DEBUG为您的技术错误,INFOERROR与您的用户了解业务代码.