设计日志系统

时间:2015-12-11 09:36:17

标签: delphi logging delphi-xe7

我有一个需要批量处理文件的程序。我没有在屏幕上的消息框中显示错误(这将暂停程序的执行),而是需要在日志中显示这些错误消息,用户可以在程序执行时看到这些消息。

所以我不需要这样的程序执行日志Which logging library is better?

我现在正在使用从TRichEdit派生的东西。基本上,使用AddError(s),AddWarn(s),AddVerbose(s)等额外的方法进行丰富的编辑。

  TRichLog = class(TMyRichEdit)
   private
   protected
     Indent: Integer;   { Indent new added lines x spaces }
   public
     constructor Create(AOwner: TComponent);   override;
     procedure AddBold     (CONST Mesaj: string);
     procedure AddMsg      (CONST Mesaj: string);
     procedure AddMsgLvl   (CONST Mesaj: string; MsgType: Integer);
     procedure AddColorMsg (CONST Mesaj: string; Culoare: TColor);
     procedure AddVerb     (CONST Mesaj: string);
     procedure AddHint     (CONST Mesaj: string);
     procedure AddInfo     (CONST Mesaj: string);
     procedure AddPath     (CONST Mesaj: string);
     procedure AddWarn     (CONST Mesaj: string);
     procedure AddError    (CONST Mesaj: string);
     procedure AddMsgInt   (CONST Mesaj: string; i: Integer);          { Adds a message text followed by an integer }
     procedure AddInteger  (CONST i: Integer);
     procedure AddFromFile (CONST FileName: string; MsgType: Integer);                             { Reads lines from the specified file and adds them to the log using the specified color. }
     procedure AddEmptyRow;
     procedure AddDateStamp;

     procedure Append (RamLog: TObject);       { RamLog will be typecased to TRamLog }
     procedure SaveAsRtf   (CONST FullPath: string);
     procedure AppendToFile(CONST FullPath: string);
     function  VerbosityAsString: string;
   published
     property InsertTime: Boolean      read FInsertTime write FInsertTime default FALSE;
     property InsertDate: Boolean      read FInsertDate write FInsertDate default FALSE;
     property AutoScroll: Boolean      read FAutoScroll write FAutoScroll default TRUE;            { Automatically scroll to show the last line }
     property Verbosity : Integer      read FVerbosity  write FVerbosity  default vHints;

     property OnLogError: TNotifyEvent read FLogError   write FLogError;                           { Can be used to inform the application to automatically switch to log when an error is listed }
     property OnLogWarn : TNotifyEvent read FLogWarn    write FLogWarn;

但我想让用户动态过滤上下文。例如,用户应该能够隐藏所有详细消息并仅保留警告和错误。如果用户改变主意,则放回详细消息。

RichEdit中的(现有)文本可以这种方式过滤吗?如果没有,我想得到一些关于如何重新实现它的指示。我正在考虑编写自己的格式来保留行/消息。例如:

  

无法打开文件,#msgErr,#Bold

我会有一个TStringGrid只显示有限数量的行(屏幕上可见的行)。这样我就可以拥有数百万行而无需在屏幕上实现所有这些行。由于我只需要解析可见的行,因此浪费时间解析并不重要。

要求:

  • 支持RichEdit中的颜色(红色表示错误等)
  • 轻量级
  • 应该有两个类:一个可视化的(基于TStringGrid)和一个非可视的控制台程序(记录到RAM并稍后保存日志或在控制台中将消息显示为简单文本)。
  • 没有硬依赖(Delphi版,Indy,数据库引擎,第三方控件等)
  • 小(TRichEdit大大增加了EXE文件的大小)
  • 一个PAS文件

另一种方法是不使用Grid并自己绘制文本(例如在TPanel派生的组件中)。或者这种控制可能已经存在。

对我的想法的任何建设性批评都会受到欢迎。你有比使用网格更好的主意吗?

1 个答案:

答案 0 :(得分:4)

恕我直言,我们可能会有所不同:

  • 针对开发人员和支持的低级别日志记录;
  • 针对最终用户的高级别日志记录。

从您的评论中,听起来好像您需要第二种,通常也称为#34;审计跟踪",特别是在条款或法规方面。

我们通常会实施高级" Audit Trail"通过将事件存储在数据库中。例如,本地高性能SQLite3数据库或MongoDB集中式实例。

使用RDBMS(或NoSQL DB)有几个优点:

  • 它的结构可以同时固定(例如通过定义类别)和进化(通过一些文本字段,甚至一些外键与其他表);
  • 可以轻松与现有用户界面进行交互,例如使用强大的第三方网格,具有排序和过滤功能;
  • 您可以使用SQL在日志内容中进行搜索,甚至可以为大多数有用的案例定义专用UI;
  • 易于维护(DELETE FROM ...将删除较旧的未删除条目,并可能在数据库中保留错误。)

我们通常使用our Open Source SOA framework在生产中执行此操作:所有服务调用都可以直接写入SQlite3或MongoDB实例without any code to write!然后你甚至可以使用JSON查询在参数内搜索。你还有integrated low-level logging available