Logging in Ada
Our first program will demonstrate how to use the Ada standard library for logging. Here’s the full source code:
with Ada.Text_IO;
with Ada.Calendar;
with Ada.Strings.Unbounded;
procedure Logging is
   use Ada.Text_IO;
   use Ada.Calendar;
   use Ada.Strings.Unbounded;
   procedure Log(Message : String) is
   begin
      Put_Line(Image(Clock) & ": " & Message);
   end Log;
   My_Log : File_Type;
begin
   -- Simple logging
   Log("standard logger");
   -- Logging with microsecond precision
   Log(Image(Clock, "%Y-%m-%d %H:%M:%S.%i") & ": with micro");
   -- Custom logger with prefix
   Create(My_Log, Out_File, "my_log.txt");
   Set_Output(My_Log);
   Log("from mylog");
   Set_Output(Standard_Output);
   -- Changing prefix
   Set_Output(My_Log);
   Log("ohmy: from mylog");
   Set_Output(Standard_Output);
   -- Logging to a buffer (simulated with a file)
   declare
      Buffer_Log : File_Type;
   begin
      Create(Buffer_Log, Out_File, "buffer_log.txt");
      Set_Output(Buffer_Log);
      Log("hello");
      Set_Output(Standard_Output);
      Close(Buffer_Log);
   end;
   -- Reading from buffer and printing
   declare
      Buffer_Content : Unbounded_String;
      Buffer_File : File_Type;
   begin
      Open(Buffer_File, In_File, "buffer_log.txt");
      while not End_Of_File(Buffer_File) loop
         Append(Buffer_Content, Get_Line(Buffer_File) & ASCII.LF);
      end loop;
      Close(Buffer_File);
      Put_Line("from buflog:" & To_String(Buffer_Content));
   end;
   -- Ada doesn't have built-in JSON logging, but we can simulate it
   Put_Line("{""time"":""" & Image(Clock) & """,""level"":""INFO"",""msg"":""hi there""}");
   Put_Line("{""time"":""" & Image(Clock) & """,""level"":""INFO"",""msg"":""hello again"",""key"":""val"",""age"":25}");
   Close(My_Log);
end Logging;This Ada program demonstrates various logging techniques:
We start by importing necessary packages for text I/O, time, and string manipulation.
We define a simple
Logprocedure that prepends the current time to each message.We demonstrate basic logging to the console.
We show how to log with microsecond precision using Ada’s
Imagefunction with a format string.We create a custom logger that writes to a file, demonstrating how to change the output destination.
We simulate logging to a buffer by writing to a temporary file and then reading its contents.
Finally, we show how to create JSON-like log entries, although Ada doesn’t have built-in JSON support in its standard library.
To run this program, save it as logging.adb and compile it using an Ada compiler such as GNAT:
$ gnatmake logging.adb
$ ./loggingThe output will depend on when you run the program, but it will look similar to this:
2023-08-22 15:30:45.123456: standard logger
2023-08-22 15:30:45.123457: with micro
from buflog:2023-08-22 15:30:45.123458: hello
{"time":"2023-08-22 15:30:45.123459","level":"INFO","msg":"hi there"}
{"time":"2023-08-22 15:30:45.123460","level":"INFO","msg":"hello again","key":"val","age":25}This example demonstrates basic logging techniques in Ada. While Ada doesn’t have a built-in structured logging package like slog in Go, you can implement similar functionality using Ada’s powerful string handling and I/O capabilities.