问题描述
我需要记录可能超过 32k 字符限制的消息。如何使用调试(字符)扩展 LogWriter,或者使用日志框架记录大于 32k 字符的消息的最佳方法是什么
解决方法
有一种方法,但需要一些代码。
第一步是使用 debug(LogMessage,...)
方法,而不是 debug(character,...)
方法。
您将需要构建 LogMessage
但不能使用其公共属性(因为它们也是 character
。因此您将需要使用 LogMessage
的 {{1 }} 方法。这需要一个字符作为键和一个 AddContext
作为值。您可以使用 Progress.Lang.Object
的实例,它保存 longchar 值。
OpenEdge.Core.String
您可能还需要添加自己的过滤器以从该上下文读取此消息,并将其写入日志文件。您可以查看如何创建一个 here 的示例。
您需要写入“命名文件”而不是 using OpenEdge.Logging.*.
using OpenEdge.Core.*.
define variable logger as ILogWriter no-undo.
define variable logMsg as LogMessage no-undo.
logger = LoggerBuilder:GetLogger('something').
// do stuff
define variable longcharWithLotsOfData as longchar no-undo.
logMsg = new LogMessage(logger:Name,'short message').
logMsg:AddContext('long-message',new String(longcharWithLotsOfData)).
logger:debug(logMsg).
,因为 LOG-MANAGER
方法只需要一个字符作为消息。
writer 需要输出 String 对象的 WRITE-MESSAGE()
属性; Value
返回一个字符。过滤器将需要检查从 ToString()
方法返回的对象的类型,并将其强制转换以获取值。
您需要使用 GetContext()
语句将 longchar 值写入输出文件。
基本上有3个步骤
- 创建一个实现
COPY-LOB... APPEND
的类 - 将过滤器定义添加到
ILoggerFilter
中的filter
属性 - 将过滤器添加到
logging.config
中的记录器