Происходит логирование сразу в 2 файла
У меня есть дискорд бот, который должен логировать все действия на сервере. На данный момент он логирует только сообщения и вход/выход/мут/анмут в голосовых каналах. Для логирования есть файл log.txt(логирование сообщений) и voice_log.txt(логирование взаимодействия с войсом), но логирование войса происходит сразу в оба файла. Не могу разобраться, где накосячил. Код прикрепляю ниже. Main.py:
import discord
from discord.ext import commands
from Logging.MessageLogging import setup_logging, log_message
from Logging.DeleteLogging import log_message_delete
from Logging.VoiceStateLogging import log_voice_state_update
intents = discord.Intents.default()
intents.message_content = True
intents.messages = True
intents.guilds = True
intents.voice_states = True
bot = commands.Bot(command_prefix="/", intents=intents)
setup_logging()
@bot.event
async def on_message(message):
await log_message(message, bot)
await bot.process_commands(message)
@bot.event
async def on_message_delete(message):
await log_message_delete(message)
@bot.event
async def on_voice_state_update(member, before, after):
await log_voice_state_update(member, before, after)
bot.run(токен скрыт)
VoiceStateLogging.py:
import logging
import discord
import os
if not os.path.exists('logs'):
os.makedirs('logs')
voice_logger = logging.getLogger('voice_logger')
voice_logger.setLevel(logging.INFO)
voice_handler = logging.FileHandler('logs/voice_log.txt', encoding='utf-8')
voice_formatter = logging.Formatter('[%(asctime)s][%(channel)s] %(message)s', datefmt='%d-%m-%Y, %H:%M:%S')
voice_handler.setFormatter(voice_formatter)
voice_logger.addHandler(voice_handler)
async def log_voice_state_update(member: discord.Member, before: discord.VoiceState, after: discord.VoiceState):
log_message = ""
if before.channel is None and after.channel is not None:
log_message = f"{member.name} joined voice channel {after.channel.name}"
elif before.channel is not None and after.channel is None:
log_message = f"{member.name} left voice channel {before.channel.name}"
elif before.channel is not None and after.channel is not None and before.channel != after.channel:
log_message = f"{member.name} switched from voice channel {before.channel.name} to {after.channel.name}"
if before.self_mute != after.self_mute:
state = "muted" if after.self_mute else "unmuted"
log_message = f"{member.name} has {state} their microphone"
if before.self_deaf != after.self_deaf:
state = "deafened" if after.self_deaf else "undeafened"
log_message = f"{member.name} has {state} themselves"
if log_message:
channel_name = after.channel.name if after.channel is not None else before.channel.name
print(f"Logging: {log_message} to channel {channel_name}") #Debug
voice_logger.info(log_message, extra={'channel': channel_name})
else:
print(f'No significant voice state changes for {member.name}', extra={'channel': 'N/A'}) #Debug
voice_logger.info(f'No significant voice state changes for {member.name}', extra={'channel': 'N/A'})
Ну и MessageLoggin.py на всякий:
import logging
import discord
def setup_logging():
log_format = '[%(asctime)s] %(message)s'
date_format = '%d-%m-%Y, %H:%M:%S'
logging.basicConfig(level=logging.INFO, filename='log.txt', filemode='a',
format=log_format, datefmt=date_format, encoding='utf-8')
class ChannelFilter(logging.Filter):
def filter(self, record):
if not hasattr(record, 'channel'):
record.channel = 'unknown'
return True
logger = logging.getLogger()
logger.addFilter(ChannelFilter())
async def log_message(message: discord.Message, bot: discord.Client):
if message.author == bot.user:
return
channel_name = message.channel.name if isinstance(message.channel, discord.TextChannel) else "DM"
log_message = f"{message.author.name}: {message.content}"
logging.info(log_message, extra={'channel': channel_name})
P.S. Да, большую роль в этом коде сыграл чат жпт :)
Ответы (1 шт):
У вас в MessageLogging.py
конфигурируется базовый логгер. И он отлавливает сообщения и от второго логгера тоже.
Для решения вашей проблемы, для начала, могу посоветовать конфигурировать оба логгера в одном файле и одним методом, возможно вам станет понятнее логика формирования логгеров.