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.xml.有关不同归档文件的更多信息,请参阅logback配置.
此时,您应该创建一个名为resources的文件夹,并将其添加到项目的构建路径中.
Eclipse指南
创建一个名为resources的文件夹(您必须在项目中看到该文件夹)
在eclipse中转到您的项目并右键单击它.选择属性.
从左侧面板中选择Java Build Path
选择Source选项卡
单击添加文件夹
勾选您已创建的资源文件夹,然后单击"确定".单击"确定"返回项目.
此时,您应该将resources文件夹视为包.
Netbeans指南
创建一个名为resources的文件夹(它在项目视图中不可见.仅在文件视图中)
转到Netbeans中的项目并右键单击它.选择属性.
从左侧面板中选择Sources
在源包文件夹中,单击" 添加文件夹".
选择 resources文件夹,然后单击"确定".
您应该看到创建的文件夹作为包.
*文件夹的名称可以是您喜欢的任何名称.为方便起见,我将它命名为资源
以下内容适用于Eclipse和Netbeans.
*如果类路径中没有以下文件指定日志框架中的特定设置,则在DEBUG中自动分配根记录器级别.这意味着将记录所有日志记录级别.调试是更高级别.
在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手册