日志

BOS_日志服务集成 <上一篇 | 下一篇> 

1.BOS日志服务功能说明
        日志服务是EAS中用来记录用户操作历史,上机日志记录某个用户在什么时间从哪台机器对哪个数据做了什么操作,是否成功执行等信息。日志服务提供两种形式的记录操作日志方式,一种是由框架自动写日志,另一种是由业务主动力控制写日志。两种方式都需要配置日志项元数据。

2.EAS日志服务使用说明
2.1.框架自动记录日志

框架自动记录日志开发步骤:

(1)定义日志项元数据
BOS IDE中日项志元数据的配置界面


日志项信息说明
名称:日志项的名称。在手工写日志时根据这个名称来获取“操作”和“日志类型”信息。
别名:作为查询日志时的“操作”属性。
类型:作为查询日志时的“日志类型”属性,取值范围:用户登录、用户操作、系统事件、工作流。

        新发布的日志项元数据,需要执行“同步日志项数据”操作,新生成的日志才会有“操作”属性和“日志类型”属性。因为日志中的“操作”属性和“日志类型”属性是从数据库中的日志项表中获取的,新增加的日志项元数据,执行同步日志项数据操作后会在日志项表中增加相应的记录。
级别:指定日志的级别,分高、中、低三级,当日志项的级别不低于系统配置的日志级别时才会写日志。

引用对象:要求记录日志的对象,可以是实体对象或功能对象。
引用对象方法:指定要求记录日志的对象方法,当调用引用对象方法时,会调用日志服务记录日志。
调用模式:指的是日志项绑定的方法在执行时,日志服务记日志的时机。

BEFORE:在方法执行前记日志;
AFTER: 在方法执行后记日志;
BOTH: 在方法执行前后都记日志,即记两次日志。

        对于需要记录日志的业务方法,现在日志服务中都会记录两次日志,在调用业务逻辑方法前后分别各记录一次日志。在调用业务逻辑方法前记录的日志的“执行结果”为“失败”。如果在调用业务逻辑方法后,第二次调用日志服务前没有发生异常,则日志服务会把“执行结果”修改为“成功”。

操作对象参数序号:若指定的操作对象参数序号大于零,则会将对应序号的参数取字符串作为日志中的“操作对象”属性。

(2)同步日志项数据
用administrator用户登录,打开“功能菜单 - 系统平台 – 安全管理 – 上机日志”,

在“文件”菜单中执行“同步日志项数据”


(3)框架根据日志项配置自动记录日志


2.2.业务模块主动记录日志
        有些情况,框架提供的日志服务不能够满足业务模块需要,如对于功能对象不能够获取到操作对象。这时可能调用日志工具类的记录日志方法来实现。业务模块主动记录日志可以选择定义日志项元数据或者不定义。如果想在日志查询中显示明确的“操作”信息,则需要定义日志项元数据。否则在日志查询中“操作”信息只显示“客户端操作”,“日志类型”显示“用户操作”。

业务模块主动记录日志开发步骤:

(1)定义日志项元数据
        业务模块主动记录日志也要定义日志项元数据,主要目的是为了查询日志时获取“操作”属性和“日志类型”属性。与定义框架自动记录日志的日志项元数据不同的是在定义业务模块主动记录日志的日志项时不指定“引用对象”和“引用对象方法”。如果指定了“引用对象”和“引用对象方法”,则系统会认为这是一个框架自动记录日志的日志项。

(2)同步日志项数据
        与框架自动记录日志一样,定义日志项元数据后也需要执行同步日志项数据操作。

(3)在业务模块中主动记录日志
        在业务模块中需要记录日志的地方调用日志工具类方法进行日志记录。在执行业务逻辑前后分别各调用一次。在执行业务逻辑之前调用com.kingdee.eas.base.log.LogUtil的
public static IObjectPK beginLog(Context ctx, String methodName, BOSObjectType bizObjType, IObjectPK instancePK, String instanceDeatil, String logItemName)
方法记录一次日志。

方法参数说明:
ctx 如果为空为远程调用,否则为本地调用
methodName 方法名称
bizObjType 业务对象BOSType
instancePK 操作对象实例PK。对于批操作对象,该参数可以为空。
instanceDeatil 操作对象实例详细信息。对于批操作对象,请将所有对象详细信息拼为字符串。
logItemName 日志项名称,与日志项元数据名称一致。

返回值:IObjectPK 日志记录PK。在执行业务逻辑后根据这个标识修改日志的“执行结果”属性。
如果没有定义日志项元数据,则调用com.kingdee.eas.base.log.LogUtil的
public static IObjectPK beginLog(Context ctx, String methodName, BOSObjectType bizObjType, IObjectPK instancePK, String instanceDetail)

方法参数说明:
ctx 如果为空为远程调用,否则为本地调用
methodName 方法名称
bizObjType 业务对象BOSType
instancePK 操作对象实例PK。对于批操作对象,该参数可以为空。
instanceDetail 操作对象实例详细信息。对于批操作对象,请将所有对象详细信息拼为字符串。
返回值:IObjectPK 日志记录PK。在执行业务逻辑后根据这个标识修改日志的“执行结果”属性。

在执行业务逻辑后,如果执行成功,则调用com.kingdee.eas.base.log.LogUtil的
public static void afterLog(Context ctx, IObjectPK logPK) 修改日志的“执行结果”属性为“成功”。方法参数说明,
ctx 如果为空为远程调用,否则为本地调用。
logPK 日志记录PK,在执行业务逻辑之前调用com.kingdee.eas.base.log.LogUtil的beginLog()的返回值。


4.常见问题解答
4.1.是不是用户在客户端做的所有操作都需要记日志?

答:不是。用户操作是否要记日志需要需求人员确认。此外,由于日志服务依存于元数据绑定,没有进行元数据绑定的操作也无法记录日志。

4.2.日志服务会记录操作的结果吗?
答:不会。日志服务只记录操作这个“行为”,不记录操作的结果。上机日志中会记录操作的“执行结果”为“成功”或者“失败”。

4.3.是不是所有的日志记录中必须包含操作的业务对象?
答:不是。一些操作与业务对象无关,如用户登陆和退出。另外一些操作日志服务不记录操作的业务对象。
4.4.为什么我在察看日志记录时,发现有部分日志的类型为空?
答:这是因为日志项记录尚未从service.log元数据中同步导出到数据库表T_LOG_LogItem。由于日志项在集成过程中每天都在变动,该表中的记录和元数据中的信息不完全一致。日志服务的维护人员会定期同步日志项到数据库,频度视开发阶段而定,在集成测试阶段,一般为一天一次。

4.6.什么类型的元数据才可以绑定日志项?
答:只有Entity和Facade类型的元数据才可以。UI和Query等其它元数据不能绑定日志项。

4.7.日志项定义中的“调用模式”是什么意思?
答:指的是日志项绑定的方法在执行时,日志服务记日志的时机。
BEFORE:在方法执行前记日志;
AFTER: 在方法执行后记日志;
BOTH: 在方法执行前后都记日志,即记两次日志;

4.8.日志记录的操作为什么不是我定义的日志项中的“别名”信息?
答:目前日志服务在处理时记录的是日志项绑定的方法的别名信息,而不是取日志项的别名信息。后续可能会改为记录日志项的别名信息。
现在在上机日志中显示的“操作”为日志项元数据的“别名”。

4.9.我的定义了日志项,为什么做了业务操作后没有记录日志?
答:基本上是日志项定义错误,日志项没有选择正确类型的元数据,或者是选择了元数据,却没有绑定方法。

4.10.为什么我在察看日志记录时,发现操作的业务对象显示为ID字符串?
答:通常原因是日志项绑定的方法的参数所对应的实体是从直接从CoreBase中继承,应用框架CoreBase中的默认处理是直接返回pk.toString()。如果想返回特定的标识业务对象的信息,请覆盖日志项绑定的方法的参数所对应的实体值对象XXXInfo的getLogInfo()方法和服务端控制类XXXControllerBean的_getLogInfo()方法。
应用框架在CoreBase, DataBase, CoreBillBase中集成了对日志操作业务对象的默认处理,开发人员通常不需要做特殊处理。

4.11.我在定义日志项时,元数据的方法绑定了日志项,为什么日志服务会没有记录操作的业务对象?
答:日志服务在运行时,会分析日志项绑定的方法的参数,如果参数的类型是IObjectPK且对应的实体是从CoreBase继承而来,则会调用应用框架XXXControllerBean的_getLogInfo获取操作的业务对象。如果参数的类型CoreBaseInfo,则直接调用值对象的getLogInfo获取。对于其它其它类型的参数,不记录操作的业务对象。

4.12.为什么Facade方法的日志中不记录操作的业务对象?
答:Facade接口不同与CoreBase接口不同,日志服务无法从Facade方法的参数中获取该方法实际操作的是哪个对象,日志服务在处理上不记录所操作的业务对象。(目前的处理仍然会试图获取操作的业务对象,基础后续会调整为不记录操作对象)
在定义日志项元数据时,可选的引用对象有实体对象和功能对象两类,同时还要声明日志项绑定的对象方法。当绑定的方法被调用时,日志服务会把日志项别名写入日志的“操作”字段;根据日志项的引用对象类型获取引用对象的名称写入日志的“功能”字段;从对象方法参数中获取到操作对象的信息写入日志的“操作对象”字段。
在日志服务中,先在上下文中获取到引用对象的具体类型,再从对象方法参数中获取到操作对象的标识信息,然后根据这两个信息获取具体的操作对象信息。
现在从对象方法参数中获取操作对象的标识信息的处理有一定的猜测性,是通过扫描方法的参数,当匹配到能够处理的参数类型时才获取操作对象信息。现在支持的参数类型包括BOSUuid,BOSUuid[],IObjectPK,IObjectPK[],CoreBaseInfo,CoreBaseInfo[]。对于其它类型的对象方法参数,如字符串类型,是不能获取到操作对象的信息。
对于功能对象的日志处理,上下文中的引用对象的具体类型是Façade类型,跟操作对象的类型是不一致的,所以在日志服务中不能通过对象类型和操作对象的标识信息获取到操作对象信息。
在功能对象的方法内部对于所操作的对象的类型是明确的,所以可以在功能对象方法内获取到操作对象的信息,完成日志的工作。

4.13.Facade方法绑定了日志项,但这个方法内部会调用许多其他方法,而且这些方法也绑定了日志项,在调用中这些内部方法也会记日志吗?
答:不会。日志服务在设计上只会对最外层的 Facade方法记录日志,内部调用的方法即便绑定了日志项也不会记日志。

 

已经公开 2009年6月30日 20:50 作者: BOS技术支持

评论

还没有人发表评论
请登录后再发表评论以赚取更多积分