Single-header structured logger in C
Find a file
2025-09-29 20:42:20 -06:00
slog oops 2025-09-29 20:42:20 -06:00
tests test 2025-09-29 17:51:36 -06:00
.clang-format logger 2025-09-29 17:37:59 -06:00
.gitignore logger 2025-09-29 17:37:59 -06:00
CMakeLists.txt test 2025-09-29 17:51:36 -06:00
README.md test 2025-09-29 17:51:36 -06:00

slog

Single-header structured logger in C99

Simple usage

  ...
	struct SlogLogger logger = SLOG_DEFAULT_TEXT_LOGGER;

	struct SlogAttr attrs[] = {
		SlogAttrB("ok", true),
	};

	SLOG_INFO(&logger, "hello", attrs); // or: SLOG_DEBUG, SLOG_WARN, SLOG_ERROR
	// time=2025-09-29T17:46:49.409721457-06:00 level=INFO msg=hello ok=true
  ...

Advanced usage

#include <slog/slog.h>
#include <stdbool.h>

int main(void)
{
  struct SlogHandlerOpts opts1 = {
    .File = stdout,
    .MinLevel = SlogLevelDebug,
    .Prefix = NULL,
    .AddSource = true,
    .Json = false,
  };

  struct SlogLogger l1 = {
    SlogTextHandler,
    &opts1,
  };

  struct SlogHandlerOpts opts2 = {
    .File = stderr,
    .MinLevel = SlogLevelError,
    .Prefix = "scope",
    .AddSource = true,
    .Json = true,
  };

  struct SlogLogger l2 = {
    SlogTextHandler,
    &opts2,
  };

  struct SlogAttr attrs[] = {
    SlogAttrB("ok", true),
  };

  SLOG_DEBUG(&l1, "hello", attrs);
  // Written to stdout:
  // time=2025-09-29T17:36:08.597673657-06:00 level=INFO msg=hello source=tests/slog.c:36 func=main ok=true

  SLOG_ERROR(&l2, "hello", attrs);
  // Written to stderr:
  //time=2025-09-29T17:36:08.597771088-06:00 level=ERROR msg=hello scope.source=tests/slog.c:37 scope.func=main scope.ok=true

  return 0;
}