← ziglang.inraylib-zigGitHub

custom logging

★★★☆by Pablo Marcos Oltra (@pamarcos)

There is no browser build of this example yet.

Is it the same as C?

//! raylib [core] example - custom logging
//!
//! Zig-API translation of examples/core/core_custom_logging.c (raylib 6.2).
//! Example contributed by Pablo Marcos Oltra (@pamarcos) and reviewed by Ramon Santamaria (@raysan5)
//! Example licensed under an unmodified zlib/libpng license.
//! Copyright (c) 2018-2025 Pablo Marcos Oltra (@pamarcos) and Ramon Santamaria (@raysan5)

const std = @import("std");
const rl = @import("raylib");

/// raylib invokes the logger from inside its own calls, so the clock it reads
/// is reached through a global set up in main.
var io: std.Io = undefined;

/// Custom logging function: prefixes every message with a timestamp (UTC)
/// and its log level.
fn customTraceLog(log_level: rl.TraceLogLevel, text: [:0]const u8) void {
    const now = std.Io.Clock.real.now(io);
    const epoch_seconds: std.time.epoch.EpochSeconds = .{ .secs = @intCast(@divFloor(now.nanoseconds, std.time.ns_per_s)) };
    const year_day = epoch_seconds.getEpochDay().calculateYearDay();
    const month_day = year_day.calculateMonthDay();
    const day_seconds = epoch_seconds.getDaySeconds();

    const level: []const u8 = switch (log_level) {
        .info => "[INFO] : ",
        .@"error" => "[ERROR]: ",
        .warning => "[WARN] : ",
        .debug => "[DEBUG]: ",
        else => "",
    };

    std.debug.print("[{d}-{d:0>2}-{d:0>2} {d:0>2}:{d:0>2}:{d:0>2}] {s}{s}\n", .{
        year_day.year,
        month_day.month.numeric(),
        month_day.day_index + 1,
        day_seconds.getHoursIntoDay(),
        day_seconds.getMinutesIntoHour(),
        day_seconds.getSecondsIntoMinute(),
        level,
        text,
    });
}

pub fn main(init: std.process.Init) void {
    io = init.io;

    // Initialization
    const screen_width = 800;
    const screen_height = 450;

    // Set custom logger
    rl.setTraceLogCallback(customTraceLog);

    rl.initWindow(screen_width, screen_height, "raylib [core] example - custom logging");
    defer rl.closeWindow(); // Close window and OpenGL context

    rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second

    // Main game loop
    while (!rl.windowShouldClose()) { // Detect window close button or ESC key
        // Draw
        rl.beginDrawing();
        defer rl.endDrawing();

        rl.clearBackground(.ray_white);

        rl.drawText("Check out the console output to see the custom logger in action!", 60, 200, 20, .light_gray);
    }
}
/*******************************************************************************************
*
*   raylib [core] example - custom logging
*
*   Example complexity rating: [★★★☆] 3/4
*
*   Example originally created with raylib 2.5, last time updated with raylib 2.5
*
*   Example contributed by Pablo Marcos Oltra (@pamarcos) and reviewed by Ramon Santamaria (@raysan5)
*
*   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
*   BSD-like license that allows static linking with closed source software
*
*   Copyright (c) 2018-2025 Pablo Marcos Oltra (@pamarcos) and Ramon Santamaria (@raysan5)
*
********************************************************************************************/

#include "raylib.h"

#include <stdio.h>          // Required for: printf(), vprintf(), fprintf()
#include <time.h>           // Required for: time_t, tm, time(), localtime(), strftime()

// Custom logging function
void CustomTraceLog(int msgType, const char *text, va_list args)
{
    char timeStr[64] = { 0 };
    time_t now = time(NULL);
    struct tm *tm_info = localtime(&now);

    strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tm_info);
    printf("[%s] ", timeStr);

    switch (msgType)
    {
        case LOG_INFO: printf("[INFO] : "); break;
        case LOG_ERROR: printf("[ERROR]: "); break;
        case LOG_WARNING: printf("[WARN] : "); break;
        case LOG_DEBUG: printf("[DEBUG]: "); break;
        default: break;
    }

    vprintf(text, args);
    printf("\n");
}

//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
int main(void)
{
    // Initialization
    //--------------------------------------------------------------------------------------
    const int screenWidth = 800;
    const int screenHeight = 450;

    // Set custom logger
    SetTraceLogCallback(CustomTraceLog);

    InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging");

    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
    //--------------------------------------------------------------------------------------

    // Main game loop
    while (!WindowShouldClose())    // Detect window close button or ESC key
    {
        // Update
        //----------------------------------------------------------------------------------
        // TODO: Update your variables here
        //----------------------------------------------------------------------------------

        // Draw
        //----------------------------------------------------------------------------------
        BeginDrawing();

        ClearBackground(RAYWHITE);

        DrawText("Check out the console output to see the custom logger in action!", 60, 200, 20, LIGHTGRAY);

        EndDrawing();
        //----------------------------------------------------------------------------------
    }

    // De-Initialization
    //--------------------------------------------------------------------------------------
    CloseWindow();        // Close window and OpenGL context
    //--------------------------------------------------------------------------------------

    return 0;
}

From raylib 6.2. The original on GitHub.