Дополнительное логирование в файл

Версия Minecraft
1.12.2
292
14
160
Хочу сделать лог-файл для особых событий моего мода (например, подозрительных действий игрока).
Я создал файл log4j2.xml в ресурсах:
XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="DEBUG">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%-4p]: %m%n"/>
        </Console>

        <File name="ClansLogFile" fileName="logs/clans.log" immediateFlush="true" append="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%-4p]: %m%n"/>
        </File>
    </Appenders>

    <Loggers>
        <Logger name="ru.plasticable.crusaderclans.CrusaderClansMod" level="DEBUG">
            <AppenderRef ref="Console" level="INFO"/>
            <AppenderRef ref="ClansLogFile" level="DEBUG"/>
        </Logger>
    </Loggers>
</Configuration>
И получаю этот логгер с помощью LogManager.getLogger(CrusaderClansMod.class.getName());.

Потом я создал метод для логирования нужных событий
Java:
 public static void logEvent(Level level, String format, Object... args) {
    clanEventsLog.log(level, format, args); // Мой кастомный логгер
    modLog.log(level, format, args);        // Логгер, полученный из FMLPreInitializationEvent
}

Когда майн запускается, создаётся файл logs/clans.log.
При использовании метода выше идёт логирование в консоль от обоих логгеров:
Код:
[22:40:43] [Netty Server IO #1/INFO] [ru.plasticable.crusaderclans.CrusaderClansMod]: Player Plasticable created clan Республика бублика
[22:40:43] [Netty Server IO #1/INFO] [crusaderclans]: Player Plasticable created clan Республика бублика
Но в файл почему-то ничего не пишется, а мне это очень нужно.
 
Последнее редактирование:

Icosider

Kotliner
Администратор
3,600
99
663
Kotlin:
val log = Logger.getLogger("MyLog")

// Где-то в методе инициализации
val fileHandler = FileHandler("logs/mylogsdir/MyLog.log", true)
fileHandler.encoding = "UTF-8"
fileHandler.formatter = object : Formatter() {
    private val dtf = DateTimeFormatter.ofPattern("HH:mm:ss dd/MM/yyyy")

    override fun format(record: LogRecord): String =
        "[${LocalDate.now().format(dtf)}] ${formatMessage(record)}\n"
}
log.addHandler(fileHandler)
log.useParentHandlers = false
 

jopi

Попрошайка
1,421
30
260
Хочешь логировать в файл? omae wa mou shindeiru
NANI?

shitcode:
public void someshitmethod() {
    BufferedWriter bw = null;
    FileWriter fw = null;
    File f = null;
    String nextLine = System.getProperty("line.separator");
    try {
        bw = new BufferedWriter(fw = new FileWriter(f = new File("data.log")));
        bw.write("YO TEXT MOTHAFUCKA" + nextLine);
        bw.write("NEW LINE OH SHIIII" + nextLine);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            bw.close();
            fw.close();
        } catch (Exception ee) {
            ee.printStackTrace();
        }
    }
}
shitcode:
public void someshitmethod() {
    BufferedReader br = null;
    FileReader fr = null;
    File f = null;
    String nextLine = System.getProperty("line.separator");
    try {
        br = new BufferedReader(fr = new FileReader(f = new File("data.log")));
        System.out.println("first line: " + br.readLine());
        System.out.println("second line: " + br.readLine());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
            fr.close();
        } catch (Exception ee) {
            ee.printStackTrace();
        }
    }
}
shitcode:
public ArrayList buffer = new ArrayList();

public void someshitmethod() {
    BufferedReader br = null; //Чтение
    FileReader fr = null; //Чтение
    File f = null;
    BufferedWriter bw = null; //Запись
    FileWriter fw = null; //Запись
    String nextLine = System.getProperty("line.separator");
    try {
        br = new BufferedReader(fr = new FileReader(f = new File("data.log")));
        bw = new BufferedWriter(fw = new FileWriter(f));
        String buffer1 = "";
        for (int i = 0; i != 99999; i++) { //KOSTYL 99999 lines max
            try {
                buffer1 = br.readLine();
                if (!buffer1.equals("")) {
                    this.buffer.add(buffer1);
                } else {
                    break;
                }
            } catch (Exception eee) {
                break;
            }
        }
        for (int i = 0; i != this.buffer.size(); i++) {
            bw.write(this.buffer.get(i) + nextLine);
        }
        bw.write("OMG MY STRING OMGOMGOMG!!! 420noscope" + nextLine);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
            fr.close();
            bw.close();
            fw.close();
        } catch (Exception ee) {
            ee.printStackTrace();
        }
    }
}

P.S. OFFTOP
Я этот код уже наизусть выучил тк намного удобнее использовать когда не разбираешься в YAML и FORGE конфигах, хы.
 
292
14
160
@jopi шок-контент запрещён, если что.
1565823803780.png

Не понимаю, зачем ты такую простыню накатал, если можно так:
FileUtils.write(new File("logs/mylog.log"), text, StandardCharsets.UTF_8)

Если бы я захотел просто записать текст в файл, я бы так и сделал, но я хочу использовать Log4j.
 
1,111
47
420
Люблю устравивать срачи на ровном месте а потому я объясню тебе зачем простыня
Лог это то куда записывается чота в процессе всей работы проги, а у тебя же он открывает хэндл без флага апенда и потому овверайтит все. Очевидно это не целевой эффект.
Раунд!
 
292
14
160
а у тебя же он открывает хэндл без флага апенда и потому овверайтит все
Лёгким движением руки
FileUtils.write(new File("logs/mylog.log"), text, StandardCharsets.UTF_8)
Превращается в
FileUtils.write(new File("logs/mylog.log"), text, StandardCharsets.UTF_8, true)

Раунд.
 
Сверху