??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲资源最新版在线观看,国产aⅴ无码专区亚洲av麻豆
,日韩精品亚洲人成在线观看
http://m.tkk7.com/jackybu/category/4769.html<a ><b><font color=red>共有<script src=http://fastonlineusers.com/online.php?d=jackybu.blogjava.net></script>人在同时阅读此Blog</font></b></a>zh-cnWed, 28 Feb 2007 04:17:59 GMTWed, 28 Feb 2007 04:17:59 GMT60- 有效地记录日志可以简化企业的开发过E?/title>http://m.tkk7.com/jackybu/articles/19545.html?/dc:creator>?/author>Sun, 13 Nov 2005 00:12:00 GMThttp://m.tkk7.com/jackybu/articles/19545.htmlhttp://m.tkk7.com/jackybu/comments/19545.htmlhttp://m.tkk7.com/jackybu/articles/19545.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/19545.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/19545.html
回页?
日志最?jng)_?
关于日志Q?zhn)要做的一个最重要的选择可能是确定一U模式,每个日志消息分配给一个特定的 cd。常见的一U实跉|使用每个cȝ全名Q这些类的操作会被作Z个消息类别在日志中记录(正如我们在清?1 中看到的一PQ这是因可以让开发h员更l粒度地记录每个cȝ讄。然而,q只有在使用日志消息来跟t执行过E时才能良好地工作。在企业U的应用E序中,有很多其他类型的日志消息。D例来_一条日志消息可能是为安全顾问生的Q而另外一条日志消息则可能是会Z帮助q行性能调优而生的。如果这两条消息所x的是同一个类Q这样就会被分配l相同的cdQ这很隑֜日志输出l果中对其进行区分?
Z避免q个问题Q应用程序应该具有一l专用的日志记录E序Q它们都q行了独特的分类Q如清单 3 所C。每个日志记录程序都可以配置自己的优先和输出处理程序。例如,安全性日志记录程序可以在日志写入目的地之前Ҏ(gu)息进行加密。有时应用程序的设计者应该与使用日志的用P例如安全NQ一h商讨日志的输出格式,从而对q些消息q行更好的控制?
清单 3. 专用的日志记录程?
import org.apache.log4j.Logger;
public interface Loggers {
Logger performance = Logger.getLogger("performance");
Logger security = Logger.getLogger("security");
Logger business = Logger.getLogger("business");
}
...
public class MyClass {
....
if (Loggers.security.isWarnEnabled()) {
Loggers.security.warn("Access denied: Username [" + userName + "] ...");
}
...
}
选择日志的?
一?cd Q例?securityQ中的消息可以具有不同的 优先U。有些消息是Z调试而生的Q有些是Z警告而生的Q有些则是出现错误而生的。消息的不同优先U可以通过记录 U别 来生。最常用的日志别有Q?
* Debug: q个U别的消息中包含了非常广泛的上下文信息。通常用于问题诊断?
* Info: q些消息包含了一些有助于在品环境中Q粒度较_)帮助跟踪执行q程的上下文消息?
* Warning: 警告消息Q说明系l中可能存在问题。例如,如果q个消息cd是有兛_全性方面的Q那么如果检到字典dQ就应该产生一条警告消息?
* Error: 错误消息说明pȝ中出C严重的问题。这U问题通常都是不可恢复的,需要h工进行干预?
标准?Java Logging API ?Apache Log4J 在此之外又提供了一些日志别。日志别的主要目标是帮助?zhn)qo有用信息中的噪声。ؓ了防止出C用错误的U别以及降低日志消息的效用的情况Q在开始编码之前,必须为开发h员提供一个清晰的指导斚w?
日志消息的格?
一旦选定日志记录E序q徏立v日志U别之后Q就可以开始构建日志消息了。在q样做时Q重要的是要包含可能多的上下文信息Q例如用h供的参数Q其他应用程序的状态信息。记录日志对象的一U方法是它们{换成 XML。第三方库,例如 XStreamQ请参阅 参考资料)可以自动?Java 对象转换?XML 。尽这是一U非常强大的机制Q但是我们必要考虑在速度与详l程度之间达CU^衡。除了典型的应用E序状态信息之外,q应该记录以下信息:
* U程 ID: 企业U的应用E序通常都是在多U程的环境中q行的。用线E?ID 信息Q?zhn)可以将多个h区分开来?
* 调用E序的标? 调用E序的标识也是非帔R要的信息。由于不同的用户h不同的特权,它们的执行\径也可能会有很大的不同。将用户的标识放到日志消息中Q这对于对安全性敏感的应用E序是非常大的一个帮助?
* 旉? 通常来说Q用户只能近似地知道问题发生的时间。如果没有时间戳Q就很难让别人来判断问题的原因所在?
* 源代码信? q包括类名、方法名和行受除非?zhn)非常x安全性,否则我徏议?zhn)保留调试标记Q?gQ,即在编译品时也是如此。如果没有调试标讎ͼJava ~译器就会删除所有的行号信息Q从而极大地减少日志消息的可用性?
上面q些信息Q除了调用程序标识)都是由日志实现自动获取的。ؓ了将q些信息包含到消息中Q?zhn)只需要ؓ输出处理E序配置一个适当?layout 模式卛_。要捕获调用者的标识Q?zhn)可以利?Log4J 中的诊断上下文特性(更多信息请参?参考资料)。诊断上下文让?zhn)可以上下文信息与当前正在运行的U程兌在一赗这些信息可以在行格式化的同时而包含到每条消息中?
?J2EE Web 应用E序中,应用逻辑用h识保存到诊断上下文中最好的地方是在一?servlet qo器中。清?4 中显CZ要实现这U功能的必要代码。它使用?Log4J 1.3 alpha 中提供的映射诊断上下文类QMDCQ。?zhn)可以使?Log4J 1.2 中提供的嵌套诊断上下文(NDCQ实现相同的功能。有?servlet qo器的更多通用信息Q请参阅 参考资?中的信息?
清单 4. ?servlet qo器中使用诊断上下?
import javax.servlet.Filter;
...
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.MDC;
public class LoggerFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Retrieves the session object from the current request.
HttpSession session = ((HttpServletRequest)request).getSession();
// Put the username into the diagnostic context.
// Use %X{username} in the layout pattern to include this information.
MDC.put("username", session.getAttribute("username"));
// Continue processing the rest of the filter chain.
chain.doFilter(request, response);
// Remove the username from the diagnostic context.
MDC.remove("username");
}
...
}
使用 AspectJ 跟踪执行情况
在对问题q行诊断Ӟ通常跟踪E序的执行情况会很有帮助。?zhn)可以在程序执行的不同地方持箋发送日志消息吗Q例如方法的入口函数和出口函数。这是一个老问题,在出?AspectJ 之前一直都没有什么好的解x案。?AspectJQ可以在应用E序的不同地Ҏ(gu)行代码段。在 AspectJ 中,q些地方都称?point cutQ在 point cut 处所执行的代码称?advice。point cut 和advice 合称 aspect?
关于 AspectJQ有一件事情非常神奇,aspect 不用很多努力可以应用到整个应用E序中。有?AspectJ 的更多信息,请参?参考资料。清?5 l出了一?AspectJ 源文件的例子Q它用来Ҏ(gu)法的入口和出口函数记录日志。在q个例子中,跟踪日志E序在每次q入或退?com.ambrosesoft 包的一个共有方法时都会记录一条日志?
清单 5. 使用 AspectJ 记录Ҏ(gu)的入口和出口
import org.apache.log4j.Logger;
import java.lang.reflect.Field;
public aspect AutoTrace {
private static final Logger logger = Logger.getLogger(AutoTrace.class);
pointcut publicMethods() : execution(public * com.ambrosesoft..*(..));
pointcut loggableCalls() : publicMethods();
/**
* Inspect the class and find its logger object. If none is found, use
* the one defined here.
*/
private Logger getLogger(org.aspectj.lang.JoinPoint joinPoint) {
try {
/*
* Try to discover the logger object.
* The logger object must be a static field called logger.
*/
Class declaringType = joinPoint.getSignature().getDeclaringType();
Field loggerField = declaringType.getField("logger");
loggerField.setAccessible(true);
return (Logger)loggerField.get(null);
} catch(NoSuchFieldException e) {
/*
* Cannot find a logger object, use the internal one.
*/
return logger;
} catch(Exception e) {
throw new RuntimeException(e);
}
}
/**
* An aspect to log method entry.
*/
before() : loggableCalls(){
getLogger(thisJoinPoint).debug("Entering.." + thisJoinPoint.getSignature().toString());
}
/**
* An aspect to log method exit.
*/
after() : loggableCalls(){
getLogger(thisJoinPoint).debug("Exiting.." + thisJoinPoint.getSignature().toString());
}
}
回页?
产品环境中的日志
一旦应用程序处于品环境中之后Q?zhn)通常都需要关闭调试或信息日志消息Q从而对q行时的性能q行优化。然而,当有些不好的事情发生Ӟ(zhn)又不能在开发环境中重现q个问题Q那可能需要在产品环境中激z调试消息了。重要的是能够修Ҏ(gu)志的讄Q而不用关闭服务器。诊断品的问题即不用p数天来进行详l的调研Q通常也需要几个小时的旉。在q段旉之内Q开发h员需要激zL关闭应用E序不同范围的日志。如果每ơ修Ҏ(gu)志的讄之后都需要重新启动品应用程序,那么情况׃变得非常不可靠了?
q运的是QLog4J 提供了一U简单的机制来解册个问题。在 Log4J 1.2 中,DOMConfigurator 中的 configureAndWatch() Ҏ(gu)会对 Log4J q行配置Qƈ自动监视日志配置文g中的变化。这在清?6 中进行了阐述。(注意Q在 Log4J 1.3Q目前仍?alpha 版本Q?中ƈ不推荐?DOMConfiguratorQ它使用了一个更加灵zȝ实现 JoranConfigurator。)
Z保 configureAndWatch() 是在 Log4J 初始化之前调用的Q?zhn)应该在启动类中调用它。不同的应用E序服务器采用了不同的机制来执行启动代码Q更多信息请参阅 参考资料)。详l信息请查看应用服务器的实现。有些应用服务器可能需要?zhn)?Log4J 的库攑ֈ服务器的 classpath 中。日志配|文件应该保存到一个需要日志的人可以访问的位置?
清单 6. 使用 DOMConfigurator 配置 Log4J
/*
* Configure Log4J library and periodically monitor log4j.xml for any update.
*/
DOMConfigurator.configureAndWatch("/apps/config/log4j.xml");
如果(zhn)的日志配置文g不能方便地进行访问(例如(zhn)的产品环境是由一个不同的l织q行l护的)Q那么?zhn)必M用一U不同的{略。标准的Ҏ(gu)是?JMXQ它提供了一个标准的 API 来管理自q应用E序讄。在C JMX 兼容的服务器中,(zhn)可以用管?bean Q或 MBeans Q来扩展应用服务器的理l端的功能(更多有关使用 JMX 以及?WebSphere Application Server 6.0 中?JMX 的内容,请参?参考资?一节。)׃ JMX Ҏ(gu)非常复杂Q如果?zhn)的情况需要?JMXQ那应该只用作q个用途?
记录敏感的数?
在记录品环境中的日志时Q除了技术方面的挑战之外Q还存在一些业务问题需要克服。例如,记录敏感的信息可能会引v安全性的问题。ƈ没有M限制可以防止(zhn)将某个用户的用户名和密码保存到正文文g中。?zhn)q必要保护其他敏感信息Q例?e-mail 地址、电(sh)话号码以及帐号信息。安全顾问和设计师有责Q要确保这些信息不会未加Q何处理就保存到日志中。对敏感信息使用安全性专用的日志E序可以帮助降低风险。?zhn)可以l这个日志程序配|一个专用的附加器,从而用一U加密的格式来保存消息,或者将其保存到一个安全的地方。然而,防止出现安全风险的最x法是在项目开始之前就讄适当的编码规范,q在查代码时强制施行q些规范?
从异怸提取有用信息
当发生一个非预期的异常时 —?例如Q如果数据库q接H然失效了,或者系l资源变得很低了 —?必d光当地进行处理,否则׃丢失有用的信息,q些信息在诊断问题时是非常有帮助的。首先,必须记录异常及其堆栈跟踪状况。其ơ,应该使用一U用L(fng)面友好的方式来标识错误页面,q对于终端用户和技术支持小l来说都是非常有帮助的?
技术支持小l在接到一个技术支持电(sh)话时所面(f)的一个挑战是在用h报告的问题与特定的日志异怹间徏立某U关联。非常有用的一U简单技术是为每个异帔R记录一个唯一?ID。这?ID 可以告诉用户Q也可以包含在终端用h填写的问题报告表单中。这样可以减技术支持团队成员猜的旉Q让他们可以快速对问题作出响应。考虑到可L的问题Q可以定期对 ID q行回收?
日志文g的管?
一个非常繁忙的应用E序的日志文件可能会q速变得非常大。较大的日志文g很难使用Q这是因为它们需要过滤大量的噪声才能扑ֈ有用的信受Log 循环 是常见的一个可以帮助解册个问题的实践。日志@环会周期性地Ҏ(gu)日志q行归档Q这h消息可以总能写到一个相对较?yu)的文g中。日志消息降低了一些效用来提高速度Q?zhn)可能很少需要参考一周之前的日志消息。在 Log4J 1.2 中, DailyRollingFileAppender 附加器可以根据所提供的日期模式来循环使用日志文g。(?Log4J 1.3 中,已经对这个@环日志文仉加器重新q行了设计。现在?zhn)可以提供一U策略来控制如何q行循环了。例如, TimeBasedRollingPolicy 定义了一U基于时间和日期的@环模式。)清单 7 昄了让 Log4J 在每天午夜对自己的日志文件进行@环所采用的配|片断?
清单 7. 使用 DailyRollingFileAppender 循环使用日志文g
...
回页?
集群环境中的日志
现在有越来越多的企业U应用程序是在集环境或分布式环境中q行部v的。然而,集群环境中的日志需要更多规划,因ؓ消息都是从不同的源头生成的(通常是不同的机器Q。如果要对不同的机器记录日志Q那必dq些机器的时间戳q行同步Q否则日志消息的ơ序׃。对机器间时钟进行同步的一U简单方法是使用一个时间服务器。有两种Ҏ(gu)可以讄旉服务器。?zhn)可以指定一台内部的机器作ؓ旉服务器。然后其他机器就可以使用|络旉协议QNTPQ来与时间服务器的时间戳q行同步。另外,(zhn)可以?Internet 上提供的旉服务器(请参?参考资料)。在 AIX 上,xntpd 守护q程用来对不同机器的pȝ旉q行同步。当机器h相同的时间之后,可以对日志一赯行分析了?
在集环境中搜集日志消息q面临着一些挑战。在q种环境中保存日志消息的一U简单方法是它们保存到L特定的日志文件中。当集群是?session affinity 配置Ӟq可以很好地工作 —?如果Ҏ(gu)个特定用户会话的h都要到同一个服务器上,q且 EJB 也都是部|在本地的。在q种配置中,集群中的机器所产生的日志文仉可以独立q行分析。如果不是这U情?—?换而言之,如果Ml定的请求都可以由多台机器进行处?—?那么对不同日志文件中的日志消息进行分析就会变得更加困难。在q种情况中,一U好的办法是使用pȝ理软g来管理日志消息,例如 IBM Tivoli] 软gQ请参阅 参考资?中的链接Q。这UY件对所有的日志消息Q在pȝ理软g的术语中UC?事gQ提供了一个综合的视图Q从而便于管理员使用。系l管理Y件也可以Ҏ(gu)所接收到的事g的类型触发一些操作(例如发?e-mail 消息或传呼消息)?
回页?
l束?
在本文中Q我们介l了在规划日志策略时需要考虑哪些问题。正如在~程时所到的问题一P从一开始就采用一个经q详l考虑的规划要比在q行的同时规划更能节省工作量。良好的日志{略可以极大地帮助对问题q行诊断。最l,l端用户可以获得更好的应用程序,q能从技术支持团队获得迅速的响应?
回页?
参考资?
* (zhn)可以参阅本文在 developerWorks 全球站点上的 英文原文?
* Apache Log4J 库是 Java q_上特性最丰富、最成熟的日?API?
* 官方?short introduction to Log4J 是ؓ那些希望使用 Log4J 库的人准备的一个必ȝ?
* Log4J 教程 Ҏ(gu)志包q行了很好的介绍?
* Java Logging API ?Java 1.4 及其更高版本中所提供的一个标准日?API。这?API 最初是 JSR 47?
* Brian Gilstrap 撰写的“An introduction to the Java Logging API”(OnJava.comQ?002 q?6 月)讨论了这个标准日?API 的用问题?
* Stuart Dabbs Halloway 撰写的“The Java Logging API”(JavaProQ?002 q?6 月)也很好地介绍了这?API?
* Apache Commons Logging API 对其他实现提供了一U封装,从而让(zhn)可以在不同的实C间进行切换?
* 嵌套诊断上下文(NDCQ?上下文信息保存在本地线E存储中Q在产生日志消息时可以用这些信息?
* XStream 库可以?introspection ?Java 对象转化?XML Q反之亦可)。它对于记录应用E序的状态来说非常有用?
* Servlet filter 可以截获h和响应,q能用于为日志消息设|上下文消息?
* Sun ?The Essentials of Filters 是学?servlet qo器的一个很好资源?
* 受欢q的 developerWorks 作?Sing Li 在“Tomcat 的过滤诀H”(developerWorksQ?001 q?6 月)一文中Q介l了有关 servlet qo的两炚w题,q篇文章向(zhn)展C如何在应用E序中充分利用这些过滤器?
* AOP@Work pdQ由面向斚w开发社区的领先专家执笔撰写Q深入介l了应用 AOP 的问题。相x章有“介l?AspectJ 5”和“用新的 AJDT 本本?AOP 开发”?
* Wayne Beaton ?Sree Anand Ratnasingh 撰写的“Migrating WebLogic startup code to WebSphere Application Server V5”(developerWorks, 2004 q?1 月)Q讨Z两个行的应用服务器启动代码的差异?
* 查看 Java Management ExtensionsQJMXQ主c?
* 受欢q的作?Sing Li 在他?3 系列文章“从黑箱C业,W?1 部分: 理QJMX 1.1 样式 ?中对 JMX q行了深入的介绍?
* q个 帮助面 讨论了?Java Management ExtensionsQJMXQ扩?WebSphere Application Server 理pȝ的内宏V?
* Network Time Protocol 目主页上罗列了很多公共旉服务器,(zhn)可以用它们来Ҏ(gu)器时钟进行同步?
* xntpd 手册?讨论?AIX 上的|络旉协议守护q程的内宏V?
* (zhn)可以在 developerWorks ?Java 技术专?中找到有?Java ~程各方面知识的文章?
回页?
关于作?
Charles Chan 是一名独立Y仉问,在加拿大?Toronto 工作。他的兴包括分布式pȝ、高性能计算、国际化以及软g设计模式。在I闲旉Q他为开源社A(ch)献自q成果?img src ="http://m.tkk7.com/jackybu/aggbug/19545.html" width = "1" height = "1" />
]]>
վ֩ģ壺
ƷþþþþðĦ
|
91ƷƵ|
һƵ߹ۿwww|
ͼƬ|
ձĻѿ|
ѲŴɫaƵ|
èwww˳վ|
ŷ͵Ʒ |
㽶߹ۿ|
ɫۺ|
WWWƵ߹ۿ|
þþþƷ|
Ļ߹ۿձ
|
Ƶվձ|
Ʒ˾Ʒ|
þøݾƷԴվ|
þþƷav鶹С˵
|
Ʒվ|
av뾫ƷװƬ|
ܻƺܻƵվѵ|
Av뾫Ʒ|
AVַ|
ҹӰԺѹۿ|
þҹɫƷa|
˳߹ۿվƷձ|
xxxxձ߲Ѳ|
պþ|
ϣӰԺѹۿƵ|
AV|
ޡvþþ뾫Ʒ|
2019Ļmvѿ
|
Ů18ؼһëƬƵ|
ѵĻɫҳѹۿ|
һ͵Ů|
һӰ߿Ƭ|
ٶ100%ڵѹۿ|
þþƷƷް|
ѿŮˬ|
ɫӰ|
AV뾫Ʒһ|
þþƷ|