48. 面向对象的LotusScript(十四)之Log4Dom上

日志是开发系统时的有效工具和常见需求。它不仅可以在程序排错时提供调试信息,还可以记录系统运行的日常状况,以供需要时查询或集中起来分析。在一些主要的编程语言如Java中,都有不少日志框架可供选择。在LotusNotes里,在文档、代理、数据库和系统级别Notes本身记录和保留了很多信息,再加上Notes数据库功能和日志载体格式的限制,通用的日志程序和框架不发达。不过在OpenNtf.Org网站上,也至少有两个项目是用于日志的。一是广受好评的OpenLog,最大的特色就是只有一行调用函数就可以得到外观不错信息丰富的错误记录。另一个是鲜有人注意的Log4Dom特点是(从名称上也可以看出来)仿造Log4J的思路,创建了一套自定义类以记录日志。前者虽然方便,但是从笔者的角度看,记录的信息有些累赘,而且表单和视图都有特定的外观风格,不易整合进整个系统。如果是要记录错误信息,笔者觉得使用34. LotusScript中的错误处理程序一文中的代码就足够了。后者的思路和风格笔者却很喜欢。虽然它也有不少缺点,比如一味模仿Log4J,建立的几个日志载体类有些牵强,调用过程也不方便,并且重要的是还有几个bug影响使用。于是笔者对它作了一定的调整和修改,它遂变成开发中不可少的称手工具。

日志视图:

单个日志文档:

记录了错误信息的日志文档:

在一个函数中使用Log4Dom记录错误信息到日志的样例如下:

Private Function SendUrgentMail(doc As NotesDocument)
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Set db=s.Currentdatabase
	Dim logger As log4dom	
	Set logger = GetLogger(Nothing)
	On Error GoTo ErrorHandler
	
	Dim sendTo As String
	sendTo=GetMail(doc.PersonInCharge(0))
	logger.debug("Sent an urgent PO to: " & sendTo)
	If sendTo="" Then
		Print "The mail of the current handler of the PO is not found."
		GoTo ExitFunction
	End If
	Dim body As String, subject As String
	body=GetMailBody(doc)
	subject="An Urgent Purchasing Order Of No. " & doc.No(0) & " Is Appending For Your Handling." 
	Call SendHTMLMail(sendTo, subject, body)
	'mark the documents
	Call doc.ReplaceItemValue("SentSummary", "Y")
	
ExitFunction:
	Call logger.Close()
	Exit Function
ErrorHandler:
	Call logger.LogError("")
	GoTo ExitFunction
End Function

开发中更多用到日志的是定时运行的代理,为此我们可以几个自定义类,在其中可以方便地直接使用一个作为对象字段的日志对象,而无需像上面那样专门定义和初始化日志实例。

Public Class UseLog
	Private logger As log4Dom
	
	%REM
		Sub New
		Description: Comments for Sub
	%END REM
	Sub New()
		Set logger=GetLogger(Nothing)
	End Sub
	
	'close the logger
	Sub Delete()
		Call logger.Close()
	End Sub
	
End Class

Public Class AgentWithLog As UseLog
	Private s As NotesSession
	Private db As NotesDatabase
	
	%REM
		Sub New
		Description: Comments for Sub
	%END REM
	Sub New()
		Set s=New NotesSession
		Set db=s.CurrentDatabase
	End Sub
End Class

下面是一个使用上面的UseLog或AgentWithLog类的样例。只保留了使用日志的部分代码。代码较长,只需注意调用日志对象记录信息和错误的语句。本文上面图片中的日志大部分就是由这个代理产生的。

Private Class Reminder As UseLog
	Private s As NotesSession
	Private db As NotesDatabase
	Private view As NotesView
	Private detailCols As Dictionary
	Private detailHeads As Variant
	Private detailFields As Variant
	
	Sub New()
		On Error GoTo ErrorHandler
		Set s=New NotesSession
		Set db=s.Currentdatabase
		Set view=db.Getview(VIEW_PO_BY_STATUS)
		view.Autoupdate=False
		Set me.detailCols=New Dictionary 
		With detailCols
			Call .Add("Description", "Title")
			Call .Add("Amount", "Amt_1")
			Call .Add("Sub Expense Account", "expItem")
			Call .Add("Employee", "Employee")
			Call .Add("Office", "Office")
			Call .Add("Department", "Dept")
		End With
		me.detailFields=me.detailCols.GetValues()
		me.detailHeads=me.detailCols.GetKeys()
		Exit Sub 
		
ErrorHandler:
		Call logger.LogError("")
		Exit Sub 
	End Sub
	
	Sub Delete()
		view.Autoupdate=true
	End Sub 
	
	Private Function Notify(status As String, handler As String )
		On Error GoTo ErrorHandler
		
		Dim keys(1) As String
		Dim sendTo As Variant
		
		keys(0)=status 'status
		keys(1)=handler 'handler
		sendTo=GetCustomMail(keys(1), "OA\CTHR.nsf", "bySCRO", "Staff_EMail")
		If sendTo="" Then
			logger.info(keys(1) & "'s mail not found.")
		Else
			Dim vec As NotesViewEntryCollection
			Set vec=view.Getallentriesbykey(keys, True)	
			Dim body As String, subject As String, copyTo As Variant
			body=GetMailBody(vec)
			subject=vec.Count & " Expenses Of Status " & keys(0) & " Are Pending For Your Handling"
			Select Case keys(0)
			Case "4.2 Rejected After Final Review"
				'inform all the users Brad rejected the PO
				copyTo=GetCustomMail(vec.Getfirstentry().Document.FlowReaders, _
				"OA\CTHR.nsf", "bySCRO", "Staff_EMail")
				logger.info("Copy to: " & Join(copyTo, ","))
			Case Else
				copyTo=""
			End Select
			
			Call CCHTMLMail(sendTo, copyTo, "", subject, body)
			If IsArray(sendTo) Then
				sendTo=Join(sendTo, ", ")
			End If
			logger.info("Sent Expense Summary of '" & keys(0) & "' to " & sendTo)	
			'mark the documents
			'Call dc.Stampall("SentSummary", "Y")
		End If
		Exit Function
		
ErrorHandler:
		Call logger.LogError("")
		Exit Function
	End Function
	
End Class

下一片文章里,我们来详细看看这个背后的Log4Dom。

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值