websphere 日志
作为WebSphere Commerce支持和服务组织的成员,我们遇到的实现没有提供适当的日志记录和跟踪来解决各种问题。 缺少日志记录,使用了诸如System.out之类的技术不足,或者依赖于不推荐使用和保留的组件,例如WC_EXTERN或WC_ORDER。 本文将展示如何在几分钟内实现自定义代码的日志记录。 我们将描述WebSphere Application Server V6.0提供的日志记录功能,提供示例,并提供使日志记录有效的最佳实践。
WebSphere日志记录功能和Java日志记录
WebSphere Commerce V5.6.1.1和V6.0支持WebSphere Application Server V6.0(以下称为Application Server)。 此版本的Application Server完全集成了Java™日志记录API(java.util.logging),该API已在J2SE 1.4中添加,以提供对应用程序信息输出的高级控制。 在Application Server V6.0中,可以使用Java日志记录标准为应用程序实现日志记录,并利用WebSphere日志记录功能,例如文件管理,运行时配置以及通过管理控制台或wsadmin工具进行管理。
JRas框架(WebSphere Application Server V5中的日志记录标准)已被弃用。 如果您已使用JRas实现了日志记录,则您的应用程序将继续运行。 但是,如果您面临新的实现,请改用Java日志记录。
将日志添加到代码中
在您自己的代码中设置日志记录和跟踪很简单。 以下示例显示了使用日志记录API的通用WebSphere Commerce命令。
package com.mycompany.commerce;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ExtGetContractUnitPriceCmdImpl extends
GetContractUnitPriceCmdImpl {
private static final String CLASS_NAME =
ExtGetContractUnitPriceCmdImpl.class.getName();
private static Logger logger = Logger.getLogger(CLASS_NAME);
public void performExecute() throws ECException {
final String methodName = "performExecute";
if (logger.isLoggable(Level.FINER))
logger.entering( CLASS_NAME, methodName,
"userId= " + getCommandContext().getUserId());
try {
super.performExecute();
boolean a = someOtherFuntion();
if (logger.isLoggable(Level.FINE))
logger.logp( Level.FINE, CLASS_NAME, methodName,
"someOtherFunction returned " + a );
} catch ( Exception e ) {
logger.logp(Level.SEVERE, CLASS_NAME, methodName,
e.getClass().getName() + "Your Logging Message", e );
}
logger.exiting( CLASS_NAME, methodName );
}
}
剖析范例
本节将分解上面的示例代码,并分别说明每个部分。
- 首先,包括必要的导入:
import java.util.logging.Level; import java.util.logging.Logger;
- 接下来,您需要定义记录器。 选择记录器的任何名称。 在这种情况下,通常,定义记录器以匹配完全限定的类名。 这定义了一个隐式层次结构,该层次结构使您可以在不同的包或类级别启用日志记录(稍后将对此进行详细介绍)。 另外,在下面的示例中,我们遵循WebSphere Commerce标准,即为将由日志API使用的类名称创建最终字符串。
private static final String CLASS_NAME = ExtGetContractUnitPriceCmdImpl.class.getName(); private static Logger logger = Logger.getLogger(CLASS_NAME);
按功能对记录器进行分组也是一种有效的做法。 在这种情况下,您将创建与该类提供的功能匹配的记录器,例如库存,订单或付款。 - 定义一个包含方法名称的字符串是一种常见的做法,因为它在方法内部使用。 下一行
logger.entering()
是一种方便的方法,用于使用FINER级别将条目记录到该方法中。 我们建议使用isLoggable()
因为通过不连接字符串或在未记录消息的情况下创建对象,可以降低跟踪的占用空间。final String methodName = "performExecute"; if (logger.isLoggable(Level.FINER))logger.entering( CLASS_NAME, methodName, "userId= " + getCommandContext().getUserId());
- 如果日志记录设置为FINE或更高,则生成日志条目。 记录器对象提供不同的签名。 在这种情况下,打印消息起源的类和方法名称。
if (logger.isLoggable(Level.FINE)) logger.logp( Level.FINE, CLASS_NAME, methodName, "someOtherFunction returned " + a );
- 最后,记录方法出口。 如果您记录了输入事件,则建议这样做。 或者,您还可以包含一条消息,例如方法的结果或要返回的值。
logger.exiting( CLASS_NAME, methodName );
使用适当的日志记录级别
记录消息时,请特别注意消息将使用的记录级别。 您可以使用以下任一级别记录消息:
- 严重
- 警告
- 信息
- 配置
- 精细
- 罚款
- 最好的
推荐建议
本节重点介绍一些最佳实践,以帮助您使用自定义代码中的日志记录功能,并讨论了可以避免的陷阱。
- 避免使用“全有或全无”方法,在该方法中,您要么在应用程序中获得完整的跟踪,要么根本没有任何消息。
- INFO级别不用于调试目的,通常默认情况下处于启用状态。 请谨慎使用此级别,因为过多的日志记录会影响应用程序的性能。 例如,对于在商店前面执行的命令(例如OrderItemAdd),请不要使用INFO级别,因为它们会使消息充满跟踪日志。
- 提供了三种不同的跟踪级别:FINE,FINER,FINEST。 决定使用哪个级别的一种方法是在启用跟踪时考虑它们的影响。 例如,您可以组织您的消息,以便在生产中启用FINE,而不会显着影响性能。 但是,仅在发生特定情况时才启用FINEST,因为对性能的负面影响非常明显。 如果使用输入或现有便捷方法,则使用FINER记录消息。
- 如果未记录日志级别,则向应用程序添加日志的影响很小。 为此,请记住在需要创建对象来记录条目时使用Logger.isLoggable(Level)方法。 最常见的情况是连接字符串,然后将这些字符串作为参数传递给记录器。
- 始终使用SEVERE或WARNING记录错误和异常。 这样可以确保在以INFO级别运行时记录错误。 如果需要传播异常,请使用WebSphere Commerce Command错误处理框架 ,该框架创建国际化的消息并指定错误视图。
- 确保跟踪消息在方法中唯一,以帮助区分代码流。
- 对进入和退出日志记录使用跟踪级别(便捷方法(例如
logger.entering())
使用FINERlogger.entering())
。 在代码中做出决定时,也请使用跟踪级别。 例如,指示在“ if”语句中选择了哪个代码路径。 - 所有条目跟踪都需要相应的退出消息。 确保覆盖所有出口。
- 记录所有输入参数以及Entry跟踪,并记录返回参数和Exit跟踪。
WebSphere Application Server中的跟踪
现在您的代码实现了日志记录,让我们看看如何在Application Server中启用和管理跟踪。
使用WebSphere管理控制台
使用WebSphere管理控制台,可以查看和编辑跟踪规范。 控制台显示两个选项卡,“配置”和“运行时”。 配置跟踪在启动期间生效,并且需要重新启动。 运行时跟踪在正在运行的服务器上设置新的跟踪。 下次重新启动服务器时,服务器将返回到“配置”选项卡下定义的跟踪规范。 图1显示了管理控制台的“运行时”选项卡。
图1.管理控制台的“运行时”选项卡
有关如何启用跟踪的更多信息,请参阅以下WebSphere Application Server信息中心链接:
使用wsadmin工具指定新的跟踪
另外,WebSphere还允许您使用wsadmin工具通过脚本控制跟踪。 当您无权访问管理控制台或要在某些事件期间自动跟踪时,这是最佳选择。
- 遵循WebSphere Application Server信息中心中的指示信息来启动wsadmin工具。
- 确保wsadmin实用程序已连接到WebSphere Commerce Server。 wsadmin实用程序启动时,将打印出与其连接的服务器。
[root@idefix bin]# ./wsadmin.sh WASX7209I: Connected to process "server1" on node WC_demo_node using SOAP connector; The type of process is: UnManagedProcess WASX7029I: For help, enter: "$Help help"wsadmin>
- 创建对TraceService对象的引用:
set traceServ [$AdminControl completeObjectName type=TraceService,*]
- 打印并保存当前跟踪规范:
set spec [$AdminControl getAttribute $traceServ traceSpecification] puts "Current runtime trace specification: $spec"
- 通过发出以下命令来指定新的跟踪规范。 新跟踪将立即生效。
$AdminControl setAttribute $traceServ traceSpecification com.ibm.websphere.commerce.WC_ORDER=all:com.mycompany. orders=all
- 更改跟踪规范后,将在SystemOut.log中打印以下行,并将跟踪写入跟踪文件:
[1/10/08 10:49:22:500 EST] 0000002e ManagerAdmin ITRAS0018I: The trace state has changed. The new trace state is *=info:com.ibm. websphere.commerce.WC_ORDER=all:com.mycompany.orders=all.
- 重现该问题。
- 要恢复原始跟踪规范,请发出以下命令:
$AdminControl setAttribute $traceServ traceSpecification $spec puts "Current runtime trace specification: $spec"
- 通过调用
quit
命令退出wsadmin实用程序。
使用JACL脚本启用跟踪
在下载部分,您可以在code_sample.zip文件中找到tracespec.jacl脚本。 该脚本可帮助您自动执行上述步骤。
踪迹在哪里?
您的跟踪将转到两个不同的文件,SystemOut.log和trace.log,与使用WebSphere Application Server或WebSphere Commerce跟踪时相同。 您可以在以下位置找到跟踪日志:
记录 | 开发者 | 运行 |
---|---|---|
SystemOut.log | WCToolkitEE60 \ wasprofile \ logs \ server1 | AppServer \ profiles \ profileName \ logs \ server1 \ |
trace.log | WCToolkitEE60 \ wasprofile \ logs \ server1 | AppServer \ profiles \ profileName \ logs \ server1 \ |
根据记录消息时使用的级别,这些文件将写入以下日志:
水平 | SystemOut.log | SystemErr.log | trace.log |
---|---|---|---|
严重 | 是 | 没有 | 是 |
警告 | 是 | 没有 | 是 |
信息 | 是 | 没有 | 是 |
配置 | 是 | 没有 | 是 |
精细 | 一个 | 没有 | 是 |
罚款 | 一个 | 没有 | 是 |
最好的 | 一个 | 没有 | 是 |
创建跟踪规范
如果使用管理控制台,则在选择其他组件时,控制台将为您编写跟踪规范。 或者,您也可以在文本区域中输入跟踪。 要指定跟踪,您需要输入记录器的名称,后跟等号和所需的记录级别。 您可以通过用冒号(:)隔开来指定多个组件。 图2显示了控制台中显示的记录器树。
图2.在WebSphere管理控制台中创建跟踪规范
如果记录器的名称与Java包和类相对应,则可以使用星号(*)作为通配符,以指示您要跟踪以特定名称开头的所有组件。 例如,通过设置以下跟踪,可以对公司进行的所有WebSphere Commerce定制启用完全跟踪:
com.mycompany.commerce.*=all
启用某个级别的日志记录时,还将启用其之上的所有级别。 以下列表是从java.util.logging.Level中提取的:
类型 | 水平 | 值 |
---|---|---|
残障人士 | 关 | MAX_VALUE |
错误 | 严重 | 1000 |
一个 | 警告 | 900 |
信息 | 信息 | 800 |
一个 | 配置 | 700 |
追踪 | 精细 | 500 |
一个 | 罚款 | 400 |
一个 | 最好的 | 300 |
一个 | 所有 | MIN_VALUE |
例如,如果将日志记录设置为INFO,则还会记录使用SEVERE和WARNING的消息。
跟踪WebSphere Commerce组件
WebSphere Commerce提供了许多跟踪组件 ,您可以为其启用跟踪。 与上面提供的示例相反,WebSphere Commerce没有与完全限定的类名匹配的记录器。 相反,WebSphere Commerce记录器按功能分组。 例如,用于管理订单的命令使用com.ibm.websphere.commerce.WC_ORDER,合同com.ibm.websphere.commerce.WC_CONTRACT等。 例如,要为运行时引擎和调度程序启用跟踪,请使用以下字符串。
com.ibm.websphere.commerce.WC_ORDER=all:com.ibm.websphere.
commerce.WC_SCHEDULER=all
避免这些做法:
- 切勿使用WebSphere Commerce组件记录来自定制代码的消息。
- 不要使用不推荐使用的WC_EXTERN。 相反,请始终定义自己的记录器。
结论
使用Java Logging框架实现日志记录和跟踪是一个简单的过程。 本文表明,遵循一些最佳实践并使用跟踪工具可以显着提高代码的可维护性。
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/0802_voldman/0802_voldman.html
websphere 日志