EventsFileLog.Mod 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. MODULE EventsFileLog; (** AUTHOR "staubesv"; PURPOSE "Log system events to files"; *)
  2. (**
  3. * Log system events to files
  4. *
  5. * History:
  6. *
  7. * 07.03.2007 First release (staubesv)
  8. * 31.07.2007 Added log file size limitation (staubesv)
  9. *)
  10. IMPORT
  11. Modules, Commands, Files, Events, EventsUtils;
  12. CONST
  13. DefaultLogFile = "AosEventLog.log";
  14. MaxLogFileSize = 1024 * 1024; (* Bytes, 1024 bytes space reserved *)
  15. Verbose = TRUE;
  16. (* System event classification *)
  17. Class = 1; (* Events *)
  18. Subclass = 1; (* Logging *)
  19. ModuleName = "EventsFileLog";
  20. TYPE
  21. EventLogger = OBJECT(Events.Sink);
  22. VAR
  23. file : Files.File;
  24. w : Files.Writer;
  25. currentFileSize, maxFileSize : LONGINT;
  26. warned : BOOLEAN;
  27. PROCEDURE Handle*(event : Events.Event);
  28. BEGIN
  29. IF currentFileSize < maxFileSize - 1024 THEN
  30. EventsUtils.ToStream(w, event);
  31. currentFileSize := file.Length();
  32. ELSIF ~warned THEN
  33. warned := TRUE;
  34. Events.AddEvent(ModuleName, Events.Warning, Class, Subclass, 0, "Event log file is full. Stop logging.", TRUE);
  35. END;
  36. END Handle;
  37. PROCEDURE &Init*(file : Files.File; append : BOOLEAN; maxFileSize : LONGINT);
  38. VAR ofs : LONGINT;
  39. BEGIN
  40. ASSERT(file # NIL);
  41. name := ModuleName;
  42. SELF.file := file;
  43. SELF.maxFileSize := maxFileSize;
  44. IF append THEN ofs := file.Length(); ELSE ofs := 0; END;
  45. currentFileSize := ofs;
  46. warned := FALSE;
  47. Files.OpenWriter(w, file, ofs);
  48. END Init;
  49. END EventLogger;
  50. VAR
  51. eventLogger- : EventLogger;
  52. PROCEDURE OpenFile(CONST filename : ARRAY OF CHAR; append : BOOLEAN) : Files.File;
  53. VAR file : Files.File;
  54. BEGIN
  55. IF append THEN
  56. file := Files.Old(filename);
  57. ELSE
  58. file := Files.New(filename);
  59. Files.Register(file);
  60. END;
  61. RETURN file;
  62. END OpenFile;
  63. PROCEDURE Start*(context : Commands.Context); (** [-append] [-max] [filename] ~ *)
  64. VAR
  65. filename : ARRAY 256 OF CHAR; append : BOOLEAN;
  66. file : Files.File;
  67. BEGIN {EXCLUSIVE}
  68. context.arg.SkipWhitespace;
  69. context.arg.String(filename);
  70. IF filename[0] = "-" THEN
  71. IF filename = "-append" THEN
  72. append := TRUE;
  73. context.arg.SkipWhitespace;
  74. context.arg.String(filename);
  75. ELSE
  76. context.out.String("Unexpected parameter"); context.out.Ln;
  77. RETURN;
  78. END;
  79. END;
  80. IF eventLogger = NIL THEN
  81. IF filename = "" THEN filename := DefaultLogFile; END;
  82. file := OpenFile(filename, append);
  83. IF file # NIL THEN
  84. NEW(eventLogger, file, append, MaxLogFileSize);
  85. Events.Register(eventLogger);
  86. Events.AddEvent(ModuleName, Events.Information, Class, Subclass, 0, "Started file log event logger", Verbose);
  87. context.out.String("Logging system events to file "); context.out.String(filename); context.out.Ln;
  88. ELSE
  89. END;
  90. ELSE
  91. context.out.String("Logger is already running."); context.out.Ln;
  92. END;
  93. END Start;
  94. PROCEDURE Stop*(context : Commands.Context); (** ~ *)
  95. BEGIN {EXCLUSIVE}
  96. IF eventLogger # NIL THEN
  97. Events.Unregister(eventLogger); eventLogger := NIL;
  98. Events.AddEvent(ModuleName, Events.Information, Class, Subclass, 0, "Stopped file log event logger", Verbose);
  99. context.out.String("Logger stopped."); context.out.Ln;
  100. ELSE
  101. context.out.String("Logger is not running."); context.out.Ln;
  102. END;
  103. END Stop;
  104. PROCEDURE Cleanup;
  105. BEGIN
  106. IF eventLogger # NIL THEN
  107. Events.AddEvent(ModuleName, Events.Information, Class, Subclass, 0, "File log event logger shut down", Verbose);
  108. Events.Unregister(eventLogger); eventLogger := NIL;
  109. END;
  110. END Cleanup;
  111. BEGIN
  112. Modules.InstallTermHandler(Cleanup);
  113. END EventsFileLog.
  114. EventsFileLog.Start ~
  115. EventsFileLog.Stop ~
  116. EventsFileLog.Start -append ~
  117. System.Free EventsFileLog ~