笔记

来源:互联网 发布:网络犯罪防范手段 编辑:程序博客网 时间:2024/05/16 12:34

 

日志记录及配置规范

 


目录


1.文档介绍
................................................................................................................................................ 4
1

日志组件
................................................................................................................................................ 4


1.1 错误日志
........................................................................................................................................ 4
1.2 跟踪日志
........................................................................................................................................ 4
1.3 审计日志
........................................................................................................................................ 5
1.4 DEVLOG............................................................................................................................................ 5
1.5 spring内核日志
.............................................................................................................................. 6
1.6 关于日志的注意事项
...................................................................................................................... 6
1.7 怎样记录异常
................................................................................................................................ 6
2日志规范总体说明
................................................................................................................................ 7


2.1 日志级别规范
................................................................................................................................ 7
2.2 日志文件命名及日志记录规范
...................................................................................................... 8
2.3 日志配置规范
................................................................................................................................ 8
2.4 日志归档规范
................................................................................................................................ 9
3日志规范实施指南
................................................................................................................................ 9


3.1 开发部门
........................................................................................................................................ 9
3.2 运营部门
...................................................................................................................................... 13
3.3 EA组
............................................................................................................................................ 13
4支持性资源
.......................................................................................................................................... 13


4.1 支持性工具
.................................................................................................................................. 13
4.2 支持性文件
.................................................................................................................................. 13
第 3 页共
13 页


1.
文档介绍
目前公司有很多项目在生产环境的日志级别是
debug。这种现象直接导致生产环境日志文件过于庞
大,带来了不必要的隐患和存储空间的浪费。
在开发过程中,广大开发人员对于何时记录日志、如何界定日志级别也没有规范可以依据。
有一部分系统还在使用
xml格式的日志,这种日志不易阅读,归档功能有
Bug,不利于运营维护。
为了规范开发人员记录日志的行为,统一生产环境的日志配置,特制定本文档。


1日志组件

日志可以在开发和测试阶段帮助查找和修正错误,也可用于追踪生产环境的问题发生原因。
spring3.0的日志组件主要由三部分组成:


.
spring2遗留的日志组件,包括错误日志(Error Logger),跟踪日志(Trace Logger)和审
计日志(Audit Logger),spring2的日志组件可以通过
core-context.xml来配置。
.
spring3.0的调试日志类(DevLog),DevLog可以通过
devlog.properties来配
置。


.
spring内核有一个自己的日志组件,用于记录
spring内核运行时的日志,这个组件只由
spring内部使用,不被应用系统使用。当应用系统运行错误时,可以参考
spring内核日志
获得错误信息。spring内核日志通过
log4j.properties来配置。
1.1错误日志
用途:记录程序中异常信息,便于系统做除错,它在生产环境是不能够关闭的。
记录位置:在“spring组件异常最初的产生位置”需要记录异常日志,请参考“怎样记录异常
”。
调用方法:


Logger errorLogger = springCoreContexton.getInstance().getErrorLogger();


注意:spring的组件异常类(springRuntimeException和
springAppException及子类)提供了
构造函数可以自动记录异常日志。
spring建议,在应用系统中不要直接调用
Error Logger,而是通过调
用适当的构造函数,让构造函数来记录异常。请参考“怎样记录异常
”。


1.2跟踪日志
用途:记录用户使用某个系统功能的完整流程,便于开发人员查看代码的执行调用过程。用于开发
过程或者系统上线初期,在系统稳定后,可以通过配置文件将该日志去掉,以提高性能。

记录位置:在重要的方法或者容易出现错误的地方记录日志,在出现问题的时候可以追踪代码执行
到哪个地方。

调用方法:

 


第 5 页共 13 页
Logger traceLogger = springCoreContexton.getInstance().getTraceLogger();
跟踪日志可以用于记录一个用户操作的完整流程,方法如下:
首先,在Web 层的控制器,产生一个唯一的Transaction ID,并把这个Transaction ID 通过
ServiceRequest 传送给业务层。
String txnId =
springCoreContexton.getInstance().getIDGenerator().getID();
serviceRequest.getSessionDTO().setTxnId(txnId);
然后,业务层取得Transaction ID,记录跟踪日志。该Transaction ID 可以关联web 层和业务层的日
志。
String txnId =
springCoreContexton.getInstance().getThreadContext().getTxnID();
1.3 审计日志
用途:保存用户业务行为相关的信息,主要是用来保留用户和业务的相关的记录。
记录位置:根据业务系统的需求而定。
调用方法:
Logger auditLogger = springCoreContexton.getInstance().getAuditLogger();
1.4 DevLog
用途:是一个辅助工具类,只用于开发阶段调试程序使用,它替代System.out.println 语
句。在生产环境应该通过配置禁止该日志。DevLog 的日志消息按重要性分为trace, debug, info,
warn, error, fatal 六个级别(由低到高),通过配置文件可以设定打印某个级别(以上)的消
息。在生产环境,可以通过配置文件禁用日志功能。
记录位置:根据开发需要,用于调试代码。
调用方法:
DevLog.trace("这是跟踪消息");
DevLog.debug("这是调试消息");
DevLog.info("这是提示消息");
DevLog.warn("这是警告消息");
DevLog.error("这是错误消息");
DevLog.fatal("这是关键错误");
日志级别可以通过devlog.properties 配置。
# 日志级别,1 为最低(打印所有级别的日志),7 为最高(禁止所有级别的日志)
LOG_LEVEL = 1
# 是否在日志中显示日期时间
LOG_SHOW_TIME = true
注意:
PDF pdfFactory Pro www.fineprint.cn


配置文件
devlog.properties必须能够在
CLASSPATH下面找到。如果找不到
devlog.properties,则默认为生产环境,不打印任何级别的日志,相当于
LOG_LEVEL=7。


1.5 spring内核日志
spring内核使用
log4j来记录内核运行日志。日志可以通过
log4j.properties来配置。一般在
log4j.properties中,我们设置如下的参数来定义日志文件的位置:


# ${spring.log.home}通过参数-D指定,
# 比如启动
WebLogic时加入参数-Dspring.log.home=c:/log
log4j.appender.logfile.File=${spring.log.home}/appdemo/spring.log

注意:
${spring.log.home}是一个环境变量,通过参数-D指定,比如启动
WebLogic时(脚本
startWeblogic.cmd或
startWeblogic.sh)加入参数-Dspring.log.home=c:/log,则日
志将放在
c:/log/appdemo/spring.log。


1.6关于日志的注意事项
要保证日志组件能正确的初始化,必须保证日志所在的目录存在,并且有读写的权限。


1.7怎样记录异常
.
对于应用异常(springAppException子类),必须在
spring组件异常最初的产生位置记
录日志。
.
对于
spring系统异常(springRuntimeException),必须在
spring组件异常最初的产生
位置记录日志。
.
“spring组件异常最初的产生位置”是指:将非
spring组件异常转换成
spring组件异常的
位置。
.
例如,DAO中将
DataAccessException封装成
springDAOException,BO中将
IOException封装成
BusinessServiceException,这些都是
spring组件异常的最
初发生位置,在抛出这些异常的时候必须记录日志(通过调用适当的构造函数,如下)。
.
但是,在
BO中将
springDAOException封装成
BusinessServiceException,这不

spring组件的最初发生位置,因为
springDAOException已经是一个
spring的组件异常。
这时只需要简单调用
throw new BusinessService(e) 无需记录日志。
.
springAppException和
springRuntimeException都提供一个构造函数可以自动记录
异常。


public springAppException(String txnId, String className,
String methodName, String message, Throwable cause)


public springRuntimeException(String txnId, String methodName,
String message, Throwable cause)


代码中无需手工调用日志组件来记录异常日志,该构造函数会自动将异常信息记录到错误日志中,


第 6
页共
13 页

PDF pdfFactory Pro
www.fineprint.cn


使用方法如下面的示例代码:


// SAO组件
try {
// 调用外部系统
EJB
} catch (RemoteExceptione) {
// 将异常封装成
springSAOException

throw new springSAOException(txnId, this.getClass().getName(),
"someMethodName", "appdemo.error.springException", e);


}


// DAO组件


try {
// 调用
getSqlMapClientTemplate()执行操作


} catch (DataAccessException e) {
String errorCode = e.getErrorCode();
if ("1461".equals(errorCode)) {
throw new springDAOException(txnId,
this.getClass().getName(),"methodName",
"appdemo.error.db.ora.1461", e);


} else {
...
}
}


想了解更多
spring知识请参考“
spring3新架构设计开发指南”


2
日志规范总体说明


2.1日志级别规范
统一使用如下的
5个日志级别(由高到低排序):


.
FATAL。很少使用,通常意味着系统或相关子组件停止服务的临近;
.
ERROR。经常使用,通常是
Java Exception. Error情况不会必然引起应用停止服务,应
用可能继续服务后来的请求;
.
WARN。经常使用,表示次要问题,通常是外部因素引起的,例如用户提供的输入参数缺少
或与定义的不一致;
.
INFO。经常使用,表示应用在正常的生命周期下的关键事件;
.
DEBUG。开发中经常使用。表示次要、经常发生的其他正常事件;
spring的日志级别与
log4j日志级别的对应关系为:
com.paic.spring.logging2.Level.SEVERE<-->Level.FATAL
com.paic.spring.logging2.Level.COMMON_ERROR<-->Level.ERROR
com.paic.spring.logging2.Level.WARNING<-->Level.WARN
com.paic.spring.logging2.Level.INFO<-->Level.INFO


第 7 页共
13 页

PDF pdfFactory Pro
www.fineprint.cn


 com.paic.spring.logging2.Level.DEBUG<-->Level.DEBUG

2.2日志文件命名及日志记录规范
.
采用文本格式记录日志,日志文件后缀为
log;
.
日志文件分为四个:系统名_spring.log 、系统名_error.log、系统名_audit.log、系统名
_trace.log 。其中
spring及其组件的日志记录在系统名_spring.log 中,应用的日志视情
况分别记录在其他三个日志文件中。
.
禁止在
out文件中记录日志,所有有价值的日志信息必须记录到上面的某个日志中。
.
上述的日志文件统一存放在/wls/applogs/rtlog/<server name>/一级目录,不再创建子
目录。
.
系统名_error.log记录系统异常
Exception,同时需要记录一些引起系统或组件停止服务
的情况。日志级别为
ERROR,FATAL。
.
系统名_audit.log 记录关键核心的事件,例如记录关键业务流程用户操作。日志级别为
INFO,WARNING。
.
系统名_trace.log 记录调试跟踪踪信息,对一些程序步骤进行临时监控时使用。日志级
别为
DEBUG。
.
所有日志的记录需要遵循安全规范http://it.paic.com.cn/PAISMS/docs/ss/PABSISTSR036A0.
pdf。具体的体现是:
1.
日志必须含有用户
ID,时间和日期。这两个字段配置在
core-context.xml中。
2.
在日志的信息字段中,必须含有当前操作的内容及操作结果(成功或者失败)、操作来源
的终端(IP或者
Mac地址)
3.
如果操作涉及到配置更改,也必须记录到日志中。
2.3日志配置规范
.
日志的缺省级别定义为
INFO。很多
spring3系统在
log4j.properties中,会单独为
Ibatis
定义日志级别,请确保其级别也为
INFO。
.
系统名_error.log日志的级别定义为
ERROR。
.
系统名_audit.log日志的级别定义为
INFO。
.
系统名_trace.log日志的级别定义为
ERROR。Trace日志是记录程序调试及跟踪信息的,
在正常情况下,不需要记录这种类型的日志,故而把它的级别设置为
ERROR。
.
当生产环境出现问题,可以把所有类型的日志级别调整为
DEBUG,当问题解决后,再将日
志级别调整回去。
.
生产环境中
DevLog的级别必须设置为
7 (LOG_LEVEL = 7)。
.
Web Server Access log的配置
Format使用
extended,并且按照标准设置
access log格
式。

PA18系统:
#Fields: date time time-taken x-c_username bytes c-ip s-ip sc-status cs-method csuri-
stem cs-uri x-c_sessionid
PA18系统:
#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-stem cs-uri


第 8
页共
13 页

PDF pdfFactory Pro
www.fineprint.cn


query sc-status cs-host cs(User-Agent) cs(Cookie) cs(Referer) time-taken bytes

2.4日志归档规范
.
所有应用日志必须做
Rotation,统一由
spring提供
Rotation规则。Rotation生成的文件
名称必须满足规则:
*.*.tlog *.log0* *.acc0* *.xml.* *.20* *.log20* *.log.*
*.bak
3
日志规范实施指南


3.1开发部门
1、确保应用使用的是
log4j日志。判断方法:如果日志是
xml格式,说明没有使用
log4j日志;
如果所有的日志文件都是文本格式,说明使用的是
log4j日志。对于没有使用
log4j日志的应用,
需要在最近的版本中使用
log4j日志。配置方法请参考:
http://it.paic.com.cn/internal/docc/showmain.asp?left=6&id=2941中的《spring3.2.0版本发
布说明及相关配置文档》。


2、确保
log4j.properties文件没有被打到
ear包中。由于本规范需要让相关同事检查日志配置,且该
文件在应用运行的时候可能会进行日志级别调整,所以不能把
log4j.properties打到
ear包中。


3、在日常的开发活动中,遵守日志记录规范,合理记录日志。


.
系统名_error.log记录场景描述:
场景编号
PA-IT-D-SPE-0001-CASE001
场景名称记录错误日志
场景描述当数据库操作出现异常时,记录
error日志,日志级别设置为
ERROR
Java code try {
// 调用
Sql Map
getSqlMapClientTemplate().insert("createClient", client);
} catch (DataAccessException e) {

第 9
页共
13 页


PDF pdfFactory Pro
www.fineprint.cn


String txnId = springCoreContexton.getInstance()
.getThreadContext().getTxnID();
if ("1461".equals(e.getErrorCode())) {


error.log("umName",Level.COMMON_ERROR,this.getClass().getName(),
"createClient failed","appdemo.error.db.ora.1461");

 throw new springDAOException(txnId,
this.getClass().getName(), "createClient",
"appdemo.error.db.ora.1461", e);


 } else {
throw e;
}
}

n系统名_audit.log记录场景描述:
场景编号
PA-IT-D-SPE-0001-CASE002
场景名称记录审计日志
场景描述当出现业务操作时,记录
audit日志,日志级别设置为
INFO或者
WARNING
Java code if (policyDTO.getPolicyNo() == null|| policyDTO.getPolicyNo().length()
== 0)
{
auditLogger.log("umName", Level.INFO, this.getClass().getName(),
"SavePolicyAction.perform",
"createPolicy:"+policyDTO.toString())+" success";
policyService.createPolicy(policyDTO);
}
else {
auditLogger.log("umName", Level.INFO, this.getClass().getName(),
"SavePolicyAction.perform",
"updatePolicy:"+policyDTO.toString())+" success";
policyService.updatePolicy(policyDTO);
}

第 10 页共
13 页


PDF pdfFactory Pro www.fineprint.cn


n系统名_trace.log记录场景描述:
场景编号
PA-IT-D-SPE-0001-CASE003
场景名称记录跟踪日志
场景描述当出现频率较高但不重要的操作时,记录
trace日志,日志级别设置为
DEBUG
Java code tracer.log("umName", Level.DEBUG, this.getClass().getName(),
"searchPolicyAction.perform", "Parameter
is :"+ searchCriteriaDTO.toString())+" success";
policyDTOs = policySAO.searchPolicy(searchCriteriaDTO);

n特殊的日志使用场景描述:
1、使用日志记录方法的处理时间
场景描述:

场景编号
PA-IT-D-SPE-0001-CASE004
场景名称使用
AOP方式记录方法的执行时间
场景描述当需要在日志中记录某个方法执行消耗的时间时,可以使用
spring中的
AOP模块,
记录方法进入和退出的时间。
Java code
完整的例子在支持性文件中。
配置部分:
<bean id="personTarget"
class="com.paic.spring.logging3.PersonImpl">
<property name="name">
<value>Kevin</value>
</property>
</bean>
<bean id="logInterceptor"
class="com.paic.spring.logging3.LogInterceptor">
</bean>
<bean id="person"
class="com.paic.spring.app.lwc.core.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.paic.spring.logging3.Person</value>
</property>
<property name="target">
<ref local="personTarget" />
</property>
<property name="interceptorNames">

第 11 页共
13 页


PDF pdfFactory Pro www.fineprint.cn


<list>
<value>logInterceptor</value>
</list>
</property>


</bean>


代码实现部分(LogInterceptor):


public Object invoke(MethodInvocation methodInvocation) thr
Throwable {
beforeAccess();
try {
Object o = methodInvocation.proceed();
return o;
} finally {
afterAccess();
}
}
private void beforeAccess() {
begin.set(new Long(System.currentTimeMillis()));
}

 private void afterAccess() {
end.set(new Long(System.currentTimeMillis()));
long b = ((Long)begin.get()).longValue();
long e = ((Long)end.get()).longValue();

logger.info("time-consuming(msecond):" + (e - b));

}

4、在移交版本的时候,需要按照日志配置规范修改日志配置文件。如果在以前的版本中已经修改了日
志配置文件,则在新版本中不必移交日志配置文件。


第 12 页共
13 页


PDF pdfFactory Pro www.fineprint.cn


3.2运营部门
1、检查各系统的日志配置文件
(log4j.jar),如果日志配置不合理,运营同事需要依据本规
范对其进行修改,同时通知开发人员。


2、如果生产出现问题,运营同事能够及时找到日志配置文件,并将其级别设置为
debug。
(目前
spring尚不支持动态更新日志级别)


3.3 EA组
1、引导开发同事按照日志规范记录日志。
2、在下一个版本中(08年中发布)提供动态更新日志级别的功能。
3、在下一个版本中提供默认的
AOP日志拦截器,方便记录方法耗时等信息。


4支持性资源


4.1支持性工具
.
Log4j:一个优秀的开源日志组件。
4.2支持性文件
规程文件名称规程文件编号模板/指南文件名称模板/指南文件编号
log4j.properties
core-context.xml
使用
Aop方式记录日志
的一个简单例子。该例
子仅供参考,不要直接
使用。
AopLogExample
AopLogExample.rar

 

0 0