gpt4 book ai didi

delphi - 有多个接收器和延迟分类的Delphi日志记录?

转载 作者:行者123 更新时间:2023-12-03 15:55:12 24 4
gpt4 key购买 nike

想象一下,我想解析一个二进制的数据块。如果一切正常,则所有日志均为INFO,默认情况下,用户甚至看不到它们。如果存在错误,则向用户显示错误,并且可以查看日志以查看确切原因(我不喜欢仅说“文件入侵。由于某些原因。您不想知道它的程序”)

可能大多数日志库都旨在快速加载,分类和保持每秒许多日志行。这本身就是个问题,因为在Delphi中没有舒适的懒惰评估和关闭。羡慕斯卡拉:-)

但是,这需要对每一行进行预先分类。

想象一下这种假设流程:



得到对象FOO [确定]

1.1。找到物业BAR [确定]

1.1.1。分析BAR的数据[确定]

1.2找到物业BAZ [确定]

1.2.1成功解析BAR的数据[确定]
1.2.2匹配数据:检查BAR和BAZ之间的相关性[失败]
...





那么,所需的功能是什么?

1)然后需要嵌套日志记录(缩进,从属)。
类似于TraceTool中突出显示的内容-请参见http://www.codeproject.com/KB/trace/tracetool.aspx#premain0上的TraceNode.Send方法

2)1、1.1、1.1.1、1.2、1.2.1行是在信息接收器(TMemo,OutputDebugString,EventLog等)中发送的,因此用户可以查看并报告至少哪些步骤已完成错误。

3)1、1.2、1.2.2被追溯标记为从最特定的行继承的错误(或警告或其他内容)。显然,警告取代了信息,错误取代了警告和信息,等等/

4)1 + 1.2 + 1.2.2可以像LogMessage('1.2.2')一样轻松组合。FullText将显示给用户或转换为Exception,以将整个故事带给人类。

4.1)可选地,通过相关设置,它不仅会转换为Exception,甚至还会自动引发后者。这可能需要使用提供的异常类或提供的异常构造回调的某种上下文。

5)Multisink:可以将信息附加到主窗体或当前活动窗体上的TMemo的可折叠面板中。错误状态可能会另外打开此类面板或提示用户进行操作。同时,某些文件或网络服务器可能会收到警告和错误等级消息,而没有收到信息等级消息。

6)额外的关联数据可能也不错。说,如果要使用TreeView而不是TMemo进行渲染,则它可能具有“ 1.1.1。解析BAR [ok]的数据”项,并带有鼠标工具提示,例如“ Foo的尺寸被告知为2x4x3.2米”


成为免费图书馆很好,尤其是免费提供资源。有时,仅依靠DCU跟踪和修复错误要困难得多。
不需要额外的可执行文件。它可以提供更多更高级的查看器,但不应仅提供任何功能。
没有被拖延/遗弃。
能够在GUI初始化之前工作并至少显示一些东西的能力也很不错。当VCL尚未启动时,类构造函数很酷,但仍作为单元可视化的一部分执行。如果从那里引发任何断言/异常,则用户将只看到运行时错误217,所有详细信息都将丢失。至少可以使用OutputDebugStreen,如果仅此而已...


不需要堆栈跟踪,如果需要的话,我可以做,并用Jedi CodeLib添加。但这很少需要。

不需要外部配置。大型应用程序即时进行重新配置可能会很好,但是对我而言,简单性更为重要,而通过调用构造函数等在代码中进行配置才是真正重要的。像Log4J一样,额外的XML文件只会使事情变得更加脆弱和复杂。

我瞥了一眼这里提到的图书馆。


TraceTool的介绍很不错,上面的链接。但是它没有信息等级,只有3个预定义等级(Debug / Error / Warning),仅此而已,但是Debug可能适合于信息替换...似乎像黑匣子,只将数据保存到自己的文件中,并使用外部工具查看它,而不是将事件流还给我。但是他们的消息嵌套和呼叫链接看起来很酷。 Cools还将对象/集合附加到消息上。
Log4D和Log4Delphi似乎处于停滞状态,最新版本是2007年和2009年,最后一个目标版本是Delphi7。缺少文档(对Log4j家伙来说可能还可以,但对我来说不是:-)Log4Delphi甚至具有测试文件夹-但那些测试确实可以在Delphi XE2-Upd1中无法编译。可惜:在这里的另一个线程中,Log4delphi被赞誉为创建自定义日志附加程序(接收器)有多么简单...

顺便说一句,唯一的LOG4J被分叉到两个独立的Delphi端口这一事实留下了一个问题,那就是更好的问题,如果必须将它们分开,则两者都缺少某些东西。

mORMot部分很难与其余库分开。演示应用程序需要UAC升级才能使用其嵌入式SQLite3引擎,并且如果拒绝了Admin授予,则冻结(未打开任何窗口,但该过程从未正常退出)。另一个演示只是启动了无限的AV异常流,试图释放堆栈。因此,对于最后的Delphi可能还没有准备好。尽管它的消息等级列表过多,甚至可能太多。


谢谢。

最佳答案

即使使用最新的XE2版本的Delphi,mORMot也是稳定的。

您尝试开始的是回归测试。在6,000,000个测试中,它包括ORM的HTTP / 1.1 Client-Server部分。如果没有管理员权限,http.sys服务器将无法注册URI,因此会出现错误。完全有道理。这是Vista / Seven限制,不是mORMot限制。

日志记录部分可以与ORM部分完全分开使用。记录在SynCommons.pas中实现(对于用于存档和.map嵌入的快速压缩算法,则使用SynLZ.pas记录)。我使用TSynLog类毫无问题地记录了已有多年的现有应用程序(甚至包括Delphi 5和Delphi 6应用程序)。 SQLite3 / ORM类在其他单元中实现。

正如您所期望的,它具有自动离开功能,支持事件嵌套。那就是你可以这样写:

procedure TMyClass.MyMethod(const Params: integer);
begin
TSynLog.Enter;
// .... my method code
end;


并且添加此 TSynLog.Enter将记录与递归级别相对应的缩进。恕我直言,这可能满足您的要求。它将在堆栈上声明一个 ISynLog接口,由Delphi在“ end;”代码行将其释放,因此它将实现自动离开功能。如果您在编译时生成了.map文件(可以将其压缩并附加到.exe中,以便客户使用),则确切的单元名称,方法名称和源代码行号将被写入日志(作为 MyUnit.TMyClass.MyMethod (123))日志将包含源行号)。您可以在 ISynLog界面级别上使用一些方法来添加一些自定义日志记录,包括参数和自定义状态(如果需要,可以将对象属性记录为JSON,或者编写自定义日志记录数据)。

跟踪每种方法的确切时间,因此您可以从客户提供的数据中分析应用程序。

如果您认为日志过于冗长,则有几种级别的日志记录,可以在客户端进行自定义。请参见 blog articlesframework documentation的相应部分(在SynCommons部分中)。例如,您有“失败”事件和某些自定义事件。而且它完全独立于VCL,因此您可以在没有GUI的情况下或在启动任何GUI之前使用它。

您手边有一个日志查看器,它允许客户端分析和嵌套的Enter / Leave视图(如果单击“ Leave”行,则将返回到相应的“ Enter”,例如):



如果此日志查看器不够用,您可以使用其源代码来满足您的要求,并且可以根据需要拥有所有所需的类来自行解析和处理.log文件。默认情况下,日志为文本日志,但可以根据要求将其压缩为二进制日志,以节省磁盘空间(日志查看器能够读取那些压缩的二进制文件)。堆栈跟踪和异常拦截均已实现,可以根据要求激活。

如果愿意,您可以轻松地在日志中添加一个数字“ 1.2.1”。您已经获得了日志记录单元的全部源代码。随时问任何问题 in our forum

关于delphi - 有多个接收器和延迟分类的Delphi日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com