Introduction
Avoir tes logs serveur dans Discord = monitoring quasi-temps réel, accessible à tout ton staff, sans avoir besoin d'ouvrir un panel. Combiné avec des notifications mobile Discord, tu sais immédiatement si quelque chose part en vrille. Ce guide t'explique comment poser ça proprement sur ton FiveM Wisp VeryCloud.
Prérequis
- Un serveur FiveM chez VeryCloud
- Un serveur Discord où tu as les droits admin
- Accès Files dans Wisp
Étape 1 : Créer le webhook Discord
- Ouvre ton serveur Discord
- Crée un channel (ex :
#logs-fivem) - Clic droit sur le channel → Edit Channel → Integrations → Webhooks
- New Webhook → nomme-le, copie l'URL (format
https://discord.com/api/webhooks/.../...)
Garde cette URL secrète : qui la possède peut poster dans ton channel.
Étape 2 : Choisir une approche
Plusieurs options :
| Approche | Difficulté | Flexibilité |
|---|---|---|
| Ressource existante (logs-system, ox_logger) | Facile | Limitée aux events prévus |
| Logger custom Lua | Moyenne | Totale |
| Bridge externe (Node.js + RCON) | Plus complexe | Très flexible |
Ce guide montre la voie 2 — logger custom Lua — la plus polyvalente.
Étape 3 : Créer la ressource logger
Dans Wisp → Files → /resources/[utils]/discord_logger/ :
fxmanifest.lua :
fx_version 'cerulean'
game 'gta5'
author 'VeryCloud'
description 'Discord webhook logger'
version '1.0.0'
server_scripts {
'config.lua',
'logger.lua'
}
config.lua :
Config = {}
Config.Webhooks = {
-- Un webhook par categorie
general = 'https://discord.com/api/webhooks/.../GENERAL',
admin = 'https://discord.com/api/webhooks/.../ADMIN',
economy = 'https://discord.com/api/webhooks/.../ECONOMY',
moderation = 'https://discord.com/api/webhooks/.../MODERATION',
}
Config.BotName = 'VeryCloud Logs'
Config.BotAvatar = 'https://verycloud.fr/static/brand.svg'
logger.lua :
local function send(category, embed)
local url = Config.Webhooks[category]
if not url then return end
PerformHttpRequest(url, function(err, _, _)
if err and err ~= 204 then
print('[discord_logger] HTTP error: ' .. err)
end
end, 'POST', json.encode({
username = Config.BotName,
avatar_url = Config.BotAvatar,
embeds = { embed }
}), { ['Content-Type'] = 'application/json' })
end
exports('log', function(category, title, description, color, fields)
send(category, {
title = title,
description = description,
color = color or 3447003, -- bleu par defaut
fields = fields or {},
timestamp = os.date('!%Y-%m-%dT%H:%M:%SZ'),
footer = {
text = GetCurrentResourceName()
}
})
end)
Étape 4 : Ajouter la ressource
Dans /server.cfg :
ensure discord_logger
Restart.
Étape 5 : Utilisation depuis d'autres ressources
Depuis n'importe quelle ressource de ton serveur :
exports.discord_logger:log(
'moderation',
'Joueur kick',
'Mathys a kick PlayerXYZ',
15158332, -- couleur rouge
{
{ name = 'Modérateur', value = 'Mathys', inline = true },
{ name = 'Joueur', value = 'PlayerXYZ', inline = true },
{ name = 'Raison', value = 'AFK trop long', inline = false }
}
)
Étape 6 : Hook sur les events natifs FiveM
Pour logger les connexions/déconnexions automatiquement, ajoute dans logger.lua :
AddEventHandler('playerConnecting', function(name, _, deferrals)
local id = source
local identifiers = GetPlayerIdentifiers(id)
exports.discord_logger:log('general', 'Connexion', name, 3066993, {
{ name = 'Steam', value = identifiers[1] or 'N/A', inline = true },
{ name = 'Player ID', value = tostring(id), inline = true }
})
end)
AddEventHandler('playerDropped', function(reason)
local name = GetPlayerName(source) or 'Inconnu'
exports.discord_logger:log('general', 'Deconnexion', name, 10038562, {
{ name = 'Raison', value = reason, inline = false }
})
end)
Étape 7 : Logger les commandes admin
Si tu utilises ACE ou un framework :
RegisterCommand('kick', function(source, args)
if IsPlayerAceAllowed(source, 'command.kick') then
local target = tonumber(args[1])
local reason = table.concat(args, ' ', 2)
DropPlayer(target, reason)
exports.discord_logger:log('moderation',
'Kick admin',
('%s a kick %s'):format(GetPlayerName(source), GetPlayerName(target)),
15158332,
{ { name = 'Raison', value = reason } }
)
end
end)
Étape 8 : Rate-limiting
Discord webhook : 30 requêtes / minute par webhook. Au-delà, 429 Too Many Requests.
Pour éviter ça avec un serveur très actif, batch les logs :
local queue = {}
local flushInterval = 5 -- secondes
CreateThread(function()
while true do
Wait(flushInterval * 1000)
for category, embeds in pairs(queue) do
if #embeds > 0 then
send(category, { embeds = embeds })
queue[category] = {}
end
end
end
end)
Étape 9 : Sécurité du webhook
- Ne jamais commit le webhook URL sur Git (ajoute
config.luaà.gitignore) - Régénère l'URL si elle fuite (Discord → Edit Webhook → Reset)
- Channel privé réservé au staff côté Discord
- Ne logue jamais d'infos sensibles (mdp, paiements complets, données perso) : RGPD oblige
Étape 10 : Alternatives clé en main
Si tu ne veux pas coder :
- screenshot-basic + logs-system : ressources gratuites qui font déjà ça
- ox_logger (Overextended) : intégré aux frameworks ox
- es_extended intègre un système de logs Discord configurable
Pour un setup rapide, utilise ces ressources. Pour de la finesse et un parfait contrôle, ton logger custom comme ci-dessus.
Dépannage
Pas de message Discord, pas d'erreur
- Webhook URL incorrecte (copie-colle parfait depuis Discord)
- Channel supprimé / webhook révoqué côté Discord
429 Too Many Requests
- Trop de logs par minute → batch ou diminue la verbosité
- Mets un cooldown serveur sur les logs identiques
Embed cassé
- Discord limite la taille des champs (1024 chars par field, 6000 chars total)
- Tronque les longs textes
Commandes utiles
# Tester un webhook depuis ton PC
curl -X POST -H "Content-Type: application/json" \
-d '{"content":"Test depuis CLI"}' \
https://discord.com/api/webhooks/.../...
# Resetter un webhook côté Discord
# -> Edit Channel / Integrations / Webhooks / [...] / Reset URL
Conclusion
Logger Discord = obligatoire pour tout serveur FiveM communautaire. 30 minutes pour poser une ressource custom, et ton staff a une visibilité totale sur tout ce qui se passe en temps réel. Choisis avec soin ce que tu logues (RGPD), batch les logs si volume important, et garde tes webhooks privés.
Pour aller plus loin : niveaux de log (info/warn/error), alerting sur seuils via webhook Discord avec @here, intégration avec un APM externe.


















