Posted June 9, 20169 yr I've tried adding filters to the root logger (org.apache.logging.log4j.LogManager.getRootLogger()) like in this Bukkit example, as well as the Java loggers, but nothing is working. I've even tried redirecting System.out and System.err. Any ideas? EDIT: Solved. http://minecraft.curseforge.com/members/sblectric/projects
June 9, 20169 yr Author Here's my code atm, showing Java and Apache logger filters, called from the preInit phase: // Java LogManager m = LogManager.getLogManager(); Enumeration<String> names = m.getLoggerNames(); while(names.hasMoreElements()) { String name = names.nextElement(); m.getLogger(name).setFilter(new SpamFilter()); } // Apache Logger root = (Logger)org.apache.logging.log4j.LogManager.getRootLogger(); root.addFilter(new SpamFilter()); and here's the SpamFilter class: package sblectric.logspamfilter.filter; import java.util.logging.LogRecord; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.Filter.Result; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.message.Message; import sblectric.logspamfilter.config.FilterConfig; /** The spam filter class for all logging */ public class SpamFilter implements java.util.logging.Filter, Filter { /** All other filtering methods call this one */ public static Result filter(String message) { System.out.println("Message available"); for(String s : FilterConfig.spamBlackList) { if (message.toLowerCase().contains(s.toLowerCase())) { return Result.DENY; } } return null; } @Override public boolean isLoggable(LogRecord record) { return filter(record.getMessage()) != Result.DENY; } @Override public Result filter(LogEvent event) { return filter(event.getMessage().toString()); } @Override public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) { return filter(msg); } @Override public Result filter(Logger arg0, Level arg1, Marker arg2, Message msg, Throwable arg4) { return filter(msg.toString()); } @Override public Result filter(Logger arg0, Level arg1, Marker arg2, Object arg3, Throwable arg4) { return null; } @Override public Result getOnMatch() { return null; } @Override public Result getOnMismatch() { return null; } } The only time the static "filter" method was called was when MY mod's logger logged its status (the filter is working there), and not any of the other FML / MC stuff being logged. http://minecraft.curseforge.com/members/sblectric/projects
June 9, 20169 yr Author I don't want it to be a static file in the jar, I want it to be configurable. Still looking into the XML format for log4j, I don't know what I'm saying. http://minecraft.curseforge.com/members/sblectric/projects
June 9, 20169 yr Author Oh, I see what you're saying. I'll look into it, thanks. http://minecraft.curseforge.com/members/sblectric/projects
June 10, 20169 yr Author It seems that there can only be one log4j.xml file per classpath, and Minecraft's is taking precedence. Is there any way to get around that? http://minecraft.curseforge.com/members/sblectric/projects
June 10, 20169 yr Author I solved my problem. I had to iterate over all the active log4j loggers like so: LoggerContext ctx = (LoggerContext)LogManager.getContext(false); Collection<LoggerConfig> lc = ctx.getConfiguration().getLoggers().values(); for(LoggerConfig c : lc) { c.addFilter(new SpamFilter()); } http://minecraft.curseforge.com/members/sblectric/projects
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.