Происходит логирование сразу в 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 шт):

Автор решения: Dezmonder

У вас в MessageLogging.py конфигурируется базовый логгер. И он отлавливает сообщения и от второго логгера тоже.

Для решения вашей проблемы, для начала, могу посоветовать конфигурировать оба логгера в одном файле и одним методом, возможно вам станет понятнее логика формирования логгеров.

→ Ссылка